| author | |
| committer | |
| log | a7c9aa7ddb06fe14c4c67e317586177141c9e37a |
| tree | 3521692fb20e1f996bff1a473ba1f2e162b04f70 |
| parent | f84086132f1a60ce4c46af1720eccb244cc13688 |
| signature |
See #1964
translate_c.cpp now exclusively uses the clang API via zig_clang.h
shaves off 5 seconds from building zig when translate_c.cpp
(or any h files it uses) change.3 files changed, 419 insertions(+), 125 deletions(-)
src/translate_c.cpp+87-125| ... | ... | @@ -14,19 +14,6 @@ |
| 14 | 14 | #include "parser.hpp" |
| 15 | 15 | #include "zig_clang.h" |
| 16 | 16 | |
| 17 | #if __GNUC__ >= 8 | |
| 18 | #pragma GCC diagnostic push | |
| 19 | #pragma GCC diagnostic ignored "-Wclass-memaccess" | |
| 20 | #endif | |
| 21 | ||
| 22 | #include <clang/Frontend/ASTUnit.h> | |
| 23 | #include <clang/Frontend/CompilerInstance.h> | |
| 24 | #include <clang/AST/Expr.h> | |
| 25 | ||
| 26 | #if __GNUC__ >= 8 | |
| 27 | #pragma GCC diagnostic pop | |
| 28 | #endif | |
| 29 | ||
| 30 | 17 | #include <string.h> |
| 31 | 18 | |
| 32 | 19 | struct Alias { |
| ... | ... | @@ -129,37 +116,6 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC |
| 129 | 116 | ZigClangSourceLocation source_loc); |
| 130 | 117 | static bool c_is_unsigned_integer(Context *c, ZigClangQualType qt); |
| 131 | 118 | |
| 132 | static const ZigClangAPSInt *bitcast(const llvm::APSInt *src) { | |
| 133 | return reinterpret_cast<const ZigClangAPSInt *>(src); | |
| 134 | } | |
| 135 | ||
| 136 | static const ZigClangAPValue *bitcast(const clang::APValue *src) { | |
| 137 | return reinterpret_cast<const ZigClangAPValue *>(src); | |
| 138 | } | |
| 139 | ||
| 140 | //static const ZigClangStmt *bitcast(const clang::Stmt *src) { | |
| 141 | // return reinterpret_cast<const ZigClangStmt *>(src); | |
| 142 | //} | |
| 143 | ||
| 144 | static const ZigClangExpr *bitcast(const clang::Expr *src) { | |
| 145 | return reinterpret_cast<const ZigClangExpr *>(src); | |
| 146 | } | |
| 147 | ||
| 148 | static ZigClangSourceLocation bitcast(clang::SourceLocation src) { | |
| 149 | ZigClangSourceLocation dest; | |
| 150 | memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangSourceLocation)); | |
| 151 | return dest; | |
| 152 | } | |
| 153 | static ZigClangQualType bitcast(clang::QualType src) { | |
| 154 | ZigClangQualType dest; | |
| 155 | memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangQualType)); | |
| 156 | return dest; | |
| 157 | } | |
| 158 | //static clang::QualType bitcast(ZigClangQualType src) { | |
| 159 | // clang::QualType dest; | |
| 160 | // memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangQualType)); | |
| 161 | // return dest; | |
| 162 | //} | |
| 163 | 119 | |
| 164 | 120 | ATTRIBUTE_PRINTF(3, 4) |
| 165 | 121 | static void emit_warning(Context *c, ZigClangSourceLocation sl, const char *format, ...) { |
| ... | ... | @@ -521,10 +477,10 @@ static AstNode *trans_create_node_apint(Context *c, const ZigClangAPSInt *aps_in |
| 521 | 477 | return node; |
| 522 | 478 | } |
| 523 | 479 | |
| 524 | static AstNode *trans_create_node_apfloat(Context *c, const llvm::APFloat &ap_float) { | |
| 480 | static AstNode *trans_create_node_apfloat(Context *c, const ZigClangAPFloat *ap_float) { | |
| 525 | 481 | uint8_t buf[128]; |
| 526 | size_t written = ap_float.convertToHexString((char *)buf, 0, false, | |
| 527 | llvm::APFloat::rmNearestTiesToEven); | |
| 482 | size_t written = ZigClangAPFloat_convertToHexString(ap_float, (char *)buf, 0, false, | |
| 483 | ZigClangAPFloat_roundingMode_NearestTiesToEven); | |
| 528 | 484 | AstNode *node = trans_create_node(c, NodeTypeFloatLiteral); |
| 529 | 485 | node->data.float_literal.bigfloat = allocate<BigFloat>(1); |
| 530 | 486 | if (bigfloat_init_buf(node->data.float_literal.bigfloat, buf, written)) { |
| ... | ... | @@ -868,13 +824,14 @@ static bool type_is_opaque(Context *c, const ZigClangType *ty, ZigClangSourceLoc |
| 868 | 824 | if (record_def == nullptr) { |
| 869 | 825 | return true; |
| 870 | 826 | } |
| 871 | for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(), | |
| 872 | it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end(); | |
| 873 | it != it_end; ++it) | |
| 827 | for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def), | |
| 828 | it_end = ZigClangRecordDecl_field_end(record_def); | |
| 829 | ZigClangRecordDecl_field_iterator_neq(it, it_end); | |
| 830 | it = ZigClangRecordDecl_field_iterator_next(it)) | |
| 874 | 831 | { |
| 875 | const clang::FieldDecl *field_decl = *it; | |
| 832 | const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it); | |
| 876 | 833 | |
| 877 | if (field_decl->isBitField()) { | |
| 834 | if (ZigClangFieldDecl_isBitField(field_decl)) { | |
| 878 | 835 | return true; |
| 879 | 836 | } |
| 880 | 837 | } |
| ... | ... | @@ -1393,8 +1350,8 @@ static AstNode *trans_integer_literal(Context *c, ResultUsed result_used, const |
| 1393 | 1350 | } |
| 1394 | 1351 | |
| 1395 | 1352 | static AstNode *trans_floating_literal(Context *c, ResultUsed result_used, const ZigClangFloatingLiteral *stmt) { |
| 1396 | llvm::APFloat result{0.0f}; | |
| 1397 | if (!reinterpret_cast<const clang::FloatingLiteral *>(stmt)->EvaluateAsFloat(result, *reinterpret_cast<clang::ASTContext *>(c->ctx))) { | |
| 1353 | ZigClangAPFloat *result; | |
| 1354 | if (!ZigClangExpr_EvaluateAsFloat((const ZigClangExpr *)stmt, &result, c->ctx)) { | |
| 1398 | 1355 | emit_warning(c, ZigClangExpr_getBeginLoc((ZigClangExpr*)stmt), "invalid floating literal"); |
| 1399 | 1356 | return nullptr; |
| 1400 | 1357 | } |
| ... | ... | @@ -1434,15 +1391,14 @@ static AstNode *trans_character_literal(Context *c, ResultUsed result_used, cons |
| 1434 | 1391 | |
| 1435 | 1392 | static AstNode *trans_constant_expr(Context *c, ResultUsed result_used, const ZigClangConstantExpr *expr) { |
| 1436 | 1393 | const ZigClangExpr *as_expr = reinterpret_cast<const ZigClangExpr *>(expr); |
| 1437 | clang::Expr::EvalResult result; | |
| 1438 | if (!reinterpret_cast<const clang::ConstantExpr *>(expr)->EvaluateAsConstantExpr(result, | |
| 1439 | clang::Expr::EvaluateForCodeGen, | |
| 1440 | *reinterpret_cast<clang::ASTContext *>(c->ctx))) | |
| 1394 | ZigClangExprEvalResult result; | |
| 1395 | if (!ZigClangExpr_EvaluateAsConstantExpr((const ZigClangExpr *)expr, &result, | |
| 1396 | ZigClangExpr_EvaluateForCodeGen, c->ctx)) | |
| 1441 | 1397 | { |
| 1442 | 1398 | emit_warning(c, ZigClangExpr_getBeginLoc(as_expr), "invalid constant expression"); |
| 1443 | 1399 | return nullptr; |
| 1444 | 1400 | } |
| 1445 | AstNode *node = trans_ap_value(c, bitcast(&result.Val), ZigClangExpr_getType(as_expr), | |
| 1401 | AstNode *node = trans_ap_value(c, &result.Val, ZigClangExpr_getType(as_expr), | |
| 1446 | 1402 | ZigClangExpr_getBeginLoc(as_expr)); |
| 1447 | 1403 | return maybe_suppress_result(c, result_used, node); |
| 1448 | 1404 | } |
| ... | ... | @@ -2452,16 +2408,18 @@ static int trans_local_declaration(Context *c, TransScope *scope, const ZigClang |
| 2452 | 2408 | TransScopeBlock *scope_block = trans_scope_block_find(scope); |
| 2453 | 2409 | assert(scope_block != nullptr); |
| 2454 | 2410 | |
| 2455 | for (auto iter = reinterpret_cast<const clang::DeclStmt *>(stmt)->decl_begin(); | |
| 2456 | iter != reinterpret_cast<const clang::DeclStmt *>(stmt)->decl_end(); iter++) { | |
| 2457 | ZigClangDecl *decl = reinterpret_cast<ZigClangDecl *>(*iter); | |
| 2411 | for (ZigClangDeclStmt_const_decl_iterator iter = ZigClangDeclStmt_decl_begin(stmt), | |
| 2412 | iter_end = ZigClangDeclStmt_decl_end(stmt); | |
| 2413 | iter != iter_end; ++iter) | |
| 2414 | { | |
| 2415 | ZigClangDecl *decl = *iter; | |
| 2458 | 2416 | switch (ZigClangDecl_getKind(decl)) { |
| 2459 | 2417 | case ZigClangDeclVar: { |
| 2460 | clang::VarDecl *var_decl = (clang::VarDecl *)decl; | |
| 2461 | ZigClangQualType qual_type = bitcast(var_decl->getTypeSourceInfo()->getType()); | |
| 2418 | ZigClangVarDecl *var_decl = (ZigClangVarDecl *)decl; | |
| 2419 | ZigClangQualType qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl); | |
| 2462 | 2420 | AstNode *init_node = nullptr; |
| 2463 | if (var_decl->hasInit()) { | |
| 2464 | init_node = trans_expr(c, ResultUsedYes, scope, bitcast(var_decl->getInit()), TransRValue); | |
| 2421 | if (ZigClangVarDecl_hasInit(var_decl)) { | |
| 2422 | init_node = trans_expr(c, ResultUsedYes, scope, ZigClangVarDecl_getInit(var_decl), TransRValue); | |
| 2465 | 2423 | if (init_node == nullptr) |
| 2466 | 2424 | return ErrorUnexpected; |
| 2467 | 2425 | |
| ... | ... | @@ -4317,12 +4275,13 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl) |
| 4317 | 4275 | |
| 4318 | 4276 | bool pure_enum = true; |
| 4319 | 4277 | uint32_t field_count = 0; |
| 4320 | for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(), | |
| 4321 | it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end(); | |
| 4322 | it != it_end; ++it, field_count += 1) | |
| 4278 | for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def), | |
| 4279 | it_end = ZigClangEnumDecl_enumerator_end(enum_def); | |
| 4280 | ZigClangEnumDecl_enumerator_iterator_neq(it, it_end); | |
| 4281 | it = ZigClangEnumDecl_enumerator_iterator_next(it), field_count += 1) | |
| 4323 | 4282 | { |
| 4324 | const clang::EnumConstantDecl *enum_const = *it; | |
| 4325 | if (enum_const->getInitExpr()) { | |
| 4283 | const ZigClangEnumConstantDecl *enum_const = ZigClangEnumDecl_enumerator_iterator_deref(it); | |
| 4284 | if (ZigClangEnumConstantDecl_getInitExpr(enum_const)) { | |
| 4326 | 4285 | pure_enum = false; |
| 4327 | 4286 | } |
| 4328 | 4287 | } |
| ... | ... | @@ -4343,11 +4302,12 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl) |
| 4343 | 4302 | } |
| 4344 | 4303 | enum_node->data.container_decl.fields.resize(field_count); |
| 4345 | 4304 | uint32_t i = 0; |
| 4346 | for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(), | |
| 4347 | it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end(); | |
| 4348 | it != it_end; ++it, i += 1) | |
| 4305 | for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def), | |
| 4306 | it_end = ZigClangEnumDecl_enumerator_end(enum_def); | |
| 4307 | ZigClangEnumDecl_enumerator_iterator_neq(it, it_end); | |
| 4308 | it = ZigClangEnumDecl_enumerator_iterator_next(it), i += 1) | |
| 4349 | 4309 | { |
| 4350 | const clang::EnumConstantDecl *enum_const = *it; | |
| 4310 | const ZigClangEnumConstantDecl *enum_const = ZigClangEnumDecl_enumerator_iterator_deref(it); | |
| 4351 | 4311 | |
| 4352 | 4312 | Buf *enum_val_name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)enum_const)); |
| 4353 | 4313 | Buf *field_name; |
| ... | ... | @@ -4358,7 +4318,7 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl) |
| 4358 | 4318 | } |
| 4359 | 4319 | |
| 4360 | 4320 | AstNode *int_node = pure_enum && !is_anonymous ? |
| 4361 | nullptr : trans_create_node_apint(c, bitcast(&enum_const->getInitVal())); | |
| 4321 | nullptr : trans_create_node_apint(c, ZigClangEnumConstantDecl_getInitVal(enum_const)); | |
| 4362 | 4322 | AstNode *field_node = trans_create_node(c, NodeTypeStructField); |
| 4363 | 4323 | field_node->data.struct_field.name = field_name; |
| 4364 | 4324 | field_node->data.struct_field.type = nullptr; |
| ... | ... | @@ -4438,15 +4398,16 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record |
| 4438 | 4398 | |
| 4439 | 4399 | // count fields and validate |
| 4440 | 4400 | uint32_t field_count = 0; |
| 4441 | for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(), | |
| 4442 | it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end(); | |
| 4443 | it != it_end; ++it, field_count += 1) | |
| 4401 | for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def), | |
| 4402 | it_end = ZigClangRecordDecl_field_end(record_def); | |
| 4403 | ZigClangRecordDecl_field_iterator_neq(it, it_end); | |
| 4404 | it = ZigClangRecordDecl_field_iterator_next(it), field_count += 1) | |
| 4444 | 4405 | { |
| 4445 | const clang::FieldDecl *field_decl = *it; | |
| 4406 | const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it); | |
| 4446 | 4407 | |
| 4447 | if (field_decl->isBitField()) { | |
| 4448 | emit_warning(c, bitcast(field_decl->getLocation()), "%s %s demoted to opaque type - has bitfield", | |
| 4449 | container_kind_name, | |
| 4408 | if (ZigClangFieldDecl_isBitField(field_decl)) { | |
| 4409 | emit_warning(c, ZigClangFieldDecl_getLocation(field_decl), | |
| 4410 | "%s %s demoted to opaque type - has bitfield", container_kind_name, | |
| 4450 | 4411 | is_anonymous ? "(anon)" : buf_ptr(bare_name)); |
| 4451 | 4412 | return demote_struct_to_opaque(c, record_decl, full_type_name, bare_name); |
| 4452 | 4413 | } |
| ... | ... | @@ -4468,19 +4429,20 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record |
| 4468 | 4429 | } |
| 4469 | 4430 | |
| 4470 | 4431 | uint32_t i = 0; |
| 4471 | for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(), | |
| 4472 | it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end(); | |
| 4473 | it != it_end; ++it, i += 1) | |
| 4432 | for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def), | |
| 4433 | it_end = ZigClangRecordDecl_field_end(record_def); | |
| 4434 | ZigClangRecordDecl_field_iterator_neq(it, it_end); | |
| 4435 | it = ZigClangRecordDecl_field_iterator_next(it), i += 1) | |
| 4474 | 4436 | { |
| 4475 | const clang::FieldDecl *field_decl = *it; | |
| 4437 | const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it); | |
| 4476 | 4438 | |
| 4477 | 4439 | AstNode *field_node = trans_create_node(c, NodeTypeStructField); |
| 4478 | 4440 | field_node->data.struct_field.name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)field_decl)); |
| 4479 | field_node->data.struct_field.type = trans_qual_type(c, bitcast(field_decl->getType()), | |
| 4480 | bitcast(field_decl->getLocation())); | |
| 4441 | field_node->data.struct_field.type = trans_qual_type(c, ZigClangFieldDecl_getType(field_decl), | |
| 4442 | ZigClangFieldDecl_getLocation(field_decl)); | |
| 4481 | 4443 | |
| 4482 | 4444 | if (field_node->data.struct_field.type == nullptr) { |
| 4483 | emit_warning(c, bitcast(field_decl->getLocation()), | |
| 4445 | emit_warning(c, ZigClangFieldDecl_getLocation(field_decl), | |
| 4484 | 4446 | "%s %s demoted to opaque type - unresolved type", |
| 4485 | 4447 | container_kind_name, |
| 4486 | 4448 | is_anonymous ? "(anon)" : buf_ptr(bare_name)); |
| ... | ... | @@ -4522,8 +4484,8 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC |
| 4522 | 4484 | init_node->data.container_init_expr.type = arr_type_node; |
| 4523 | 4485 | init_node->data.container_init_expr.kind = ContainerInitKindArray; |
| 4524 | 4486 | |
| 4525 | const clang::Type *qt_type = reinterpret_cast<const clang::Type *>(ZigClangQualType_getTypePtr(qt)); | |
| 4526 | ZigClangQualType child_qt = bitcast(qt_type->getAsArrayTypeUnsafe()->getElementType()); | |
| 4487 | const ZigClangType *qt_type = ZigClangQualType_getTypePtr(qt); | |
| 4488 | ZigClangQualType child_qt = ZigClangArrayType_getElementType(ZigClangType_getAsArrayTypeUnsafe(qt_type)); | |
| 4527 | 4489 | |
| 4528 | 4490 | for (size_t i = 0; i < init_count; i += 1) { |
| 4529 | 4491 | const ZigClangAPValue *elem_ap_val = ZigClangAPValue_getArrayInitializedElt(ap_value, i); |
| ... | ... | @@ -4569,8 +4531,7 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC |
| 4569 | 4531 | if (const ZigClangExpr *expr = ZigClangAPValueLValueBase_dyn_cast_Expr(lval_base)) { |
| 4570 | 4532 | return trans_expr(c, ResultUsedYes, &c->global_scope->base, expr, TransRValue); |
| 4571 | 4533 | } |
| 4572 | //const clang::ValueDecl *value_decl = lval_base.get<const clang::ValueDecl *>(); | |
| 4573 | emit_warning(c, source_loc, "TODO handle initializer LValue clang::ValueDecl"); | |
| 4534 | emit_warning(c, source_loc, "TODO handle initializer LValue ValueDecl"); | |
| 4574 | 4535 | return nullptr; |
| 4575 | 4536 | } |
| 4576 | 4537 | case ZigClangAPValueFloat: |
| ... | ... | @@ -4607,43 +4568,43 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC |
| 4607 | 4568 | zig_unreachable(); |
| 4608 | 4569 | } |
| 4609 | 4570 | |
| 4610 | static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) { | |
| 4571 | static void visit_var_decl(Context *c, const ZigClangVarDecl *var_decl) { | |
| 4611 | 4572 | Buf *name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)var_decl)); |
| 4612 | 4573 | |
| 4613 | switch (var_decl->getTLSKind()) { | |
| 4614 | case clang::VarDecl::TLS_None: | |
| 4574 | switch (ZigClangVarDecl_getTLSKind(var_decl)) { | |
| 4575 | case ZigClangVarDecl_TLSKind_None: | |
| 4615 | 4576 | break; |
| 4616 | case clang::VarDecl::TLS_Static: | |
| 4617 | emit_warning(c, bitcast(var_decl->getLocation()), | |
| 4577 | case ZigClangVarDecl_TLSKind_Static: | |
| 4578 | emit_warning(c, ZigClangVarDecl_getLocation(var_decl), | |
| 4618 | 4579 | "ignoring variable '%s' - static thread local storage", buf_ptr(name)); |
| 4619 | 4580 | return; |
| 4620 | case clang::VarDecl::TLS_Dynamic: | |
| 4621 | emit_warning(c, bitcast(var_decl->getLocation()), | |
| 4581 | case ZigClangVarDecl_TLSKind_Dynamic: | |
| 4582 | emit_warning(c, ZigClangVarDecl_getLocation(var_decl), | |
| 4622 | 4583 | "ignoring variable '%s' - dynamic thread local storage", buf_ptr(name)); |
| 4623 | 4584 | return; |
| 4624 | 4585 | } |
| 4625 | 4586 | |
| 4626 | ZigClangQualType qt = bitcast(var_decl->getType()); | |
| 4627 | AstNode *var_type = trans_qual_type(c, qt, bitcast(var_decl->getLocation())); | |
| 4587 | ZigClangQualType qt = ZigClangVarDecl_getType(var_decl); | |
| 4588 | AstNode *var_type = trans_qual_type(c, qt, ZigClangVarDecl_getLocation(var_decl)); | |
| 4628 | 4589 | if (var_type == nullptr) { |
| 4629 | emit_warning(c, bitcast(var_decl->getLocation()), "ignoring variable '%s' - unresolved type", buf_ptr(name)); | |
| 4590 | emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - unresolved type", buf_ptr(name)); | |
| 4630 | 4591 | return; |
| 4631 | 4592 | } |
| 4632 | 4593 | |
| 4633 | bool is_extern = var_decl->hasExternalStorage(); | |
| 4634 | bool is_static = var_decl->isFileVarDecl(); | |
| 4594 | bool is_extern = ZigClangVarDecl_hasExternalStorage(var_decl); | |
| 4595 | bool is_static = ZigClangVarDecl_isFileVarDecl(var_decl); | |
| 4635 | 4596 | bool is_const = ZigClangQualType_isConstQualified(qt); |
| 4636 | 4597 | |
| 4637 | 4598 | if (is_static && !is_extern) { |
| 4638 | 4599 | AstNode *init_node; |
| 4639 | if (var_decl->hasInit()) { | |
| 4640 | const ZigClangAPValue *ap_value = bitcast(var_decl->evaluateValue()); | |
| 4600 | if (ZigClangVarDecl_hasInit(var_decl)) { | |
| 4601 | const ZigClangAPValue *ap_value = ZigClangVarDecl_evaluateValue(var_decl); | |
| 4641 | 4602 | if (ap_value == nullptr) { |
| 4642 | emit_warning(c, bitcast(var_decl->getLocation()), | |
| 4603 | emit_warning(c, ZigClangVarDecl_getLocation(var_decl), | |
| 4643 | 4604 | "ignoring variable '%s' - unable to evaluate initializer", buf_ptr(name)); |
| 4644 | 4605 | return; |
| 4645 | 4606 | } |
| 4646 | init_node = trans_ap_value(c, ap_value, qt, bitcast(var_decl->getLocation())); | |
| 4607 | init_node = trans_ap_value(c, ap_value, qt, ZigClangVarDecl_getLocation(var_decl)); | |
| 4647 | 4608 | if (init_node == nullptr) |
| 4648 | 4609 | return; |
| 4649 | 4610 | } else { |
| ... | ... | @@ -4662,7 +4623,7 @@ static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) { |
| 4662 | 4623 | return; |
| 4663 | 4624 | } |
| 4664 | 4625 | |
| 4665 | emit_warning(c, bitcast(var_decl->getLocation()), | |
| 4626 | emit_warning(c, ZigClangVarDecl_getLocation(var_decl), | |
| 4666 | 4627 | "ignoring variable '%s' - non-extern, non-static variable", buf_ptr(name)); |
| 4667 | 4628 | return; |
| 4668 | 4629 | } |
| ... | ... | @@ -4684,7 +4645,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *decl) { |
| 4684 | 4645 | resolve_record_decl(c, reinterpret_cast<const ZigClangRecordDecl *>(decl)); |
| 4685 | 4646 | break; |
| 4686 | 4647 | case ZigClangDeclVar: |
| 4687 | visit_var_decl(c, reinterpret_cast<const clang::VarDecl *>(decl)); | |
| 4648 | visit_var_decl(c, reinterpret_cast<const ZigClangVarDecl *>(decl)); | |
| 4688 | 4649 | break; |
| 4689 | 4650 | default: |
| 4690 | 4651 | emit_warning(c, ZigClangDecl_getLocation(decl), "ignoring %s decl", ZigClangDecl_getDeclKindName(decl)); |
| ... | ... | @@ -5114,25 +5075,26 @@ static void process_macro(Context *c, CTokenize *ctok, Buf *name, const char *ch |
| 5114 | 5075 | c->macro_table.put(name, result_node); |
| 5115 | 5076 | } |
| 5116 | 5077 | |
| 5117 | static void process_preprocessor_entities(Context *c, ZigClangASTUnit *zunit) { | |
| 5118 | clang::ASTUnit *unit = reinterpret_cast<clang::ASTUnit *>(zunit); | |
| 5078 | static void process_preprocessor_entities(Context *c, ZigClangASTUnit *unit) { | |
| 5119 | 5079 | CTokenize ctok = {{0}}; |
| 5120 | 5080 | |
| 5121 | 5081 | // TODO if we see #undef, delete it from the table |
| 5082 | for (ZigClangPreprocessingRecord_iterator it = ZigClangASTUnit_getLocalPreprocessingEntities_begin(unit), | |
| 5083 | it_end = ZigClangASTUnit_getLocalPreprocessingEntities_end(unit); it.I != it_end.I; it.I += 1) | |
| 5084 | { | |
| 5085 | ZigClangPreprocessedEntity *entity = ZigClangPreprocessingRecord_iterator_deref(it); | |
| 5122 | 5086 | |
| 5123 | for (clang::PreprocessedEntity *entity : unit->getLocalPreprocessingEntities()) { | |
| 5124 | switch (entity->getKind()) { | |
| 5125 | case clang::PreprocessedEntity::InvalidKind: | |
| 5126 | case clang::PreprocessedEntity::InclusionDirectiveKind: | |
| 5127 | case clang::PreprocessedEntity::MacroExpansionKind: | |
| 5087 | switch (ZigClangPreprocessedEntity_getKind(entity)) { | |
| 5088 | case ZigClangPreprocessedEntity_InvalidKind: | |
| 5089 | case ZigClangPreprocessedEntity_InclusionDirectiveKind: | |
| 5090 | case ZigClangPreprocessedEntity_MacroExpansionKind: | |
| 5128 | 5091 | continue; |
| 5129 | case clang::PreprocessedEntity::MacroDefinitionKind: | |
| 5092 | case ZigClangPreprocessedEntity_MacroDefinitionKind: | |
| 5130 | 5093 | { |
| 5131 | clang::MacroDefinitionRecord *macro = static_cast<clang::MacroDefinitionRecord *>(entity); | |
| 5132 | const char *raw_name = macro->getName()->getNameStart(); | |
| 5133 | clang::SourceRange range = macro->getSourceRange(); | |
| 5134 | ZigClangSourceLocation begin_loc = bitcast(range.getBegin()); | |
| 5135 | ZigClangSourceLocation end_loc = bitcast(range.getEnd()); | |
| 5094 | ZigClangMacroDefinitionRecord *macro = reinterpret_cast<ZigClangMacroDefinitionRecord *>(entity); | |
| 5095 | const char *raw_name = ZigClangMacroDefinitionRecord_getName_getNameStart(macro); | |
| 5096 | ZigClangSourceLocation begin_loc = ZigClangMacroDefinitionRecord_getSourceRange_getBegin(macro); | |
| 5097 | ZigClangSourceLocation end_loc = ZigClangMacroDefinitionRecord_getSourceRange_getEnd(macro); | |
| 5136 | 5098 | |
| 5137 | 5099 | if (ZigClangSourceLocation_eq(begin_loc, end_loc)) { |
| 5138 | 5100 | // this means it is a macro without a value |
src/zig_clang.cpp+263| ... | ... | @@ -1346,6 +1346,31 @@ static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Enum == clang::ETK_Enum, |
| 1346 | 1346 | static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Typename == clang::ETK_Typename, ""); |
| 1347 | 1347 | static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_None == clang::ETK_None, ""); |
| 1348 | 1348 | |
| 1349 | void ZigClang_detect_enum_EntityKind(clang::PreprocessedEntity::EntityKind x) { | |
| 1350 | switch (x) { | |
| 1351 | case clang::PreprocessedEntity::InvalidKind: | |
| 1352 | case clang::PreprocessedEntity::MacroExpansionKind: | |
| 1353 | case clang::PreprocessedEntity::MacroDefinitionKind: | |
| 1354 | case clang::PreprocessedEntity::InclusionDirectiveKind: | |
| 1355 | break; | |
| 1356 | } | |
| 1357 | } | |
| 1358 | static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InvalidKind == clang::PreprocessedEntity::InvalidKind, ""); | |
| 1359 | static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroExpansionKind == clang::PreprocessedEntity::MacroExpansionKind, ""); | |
| 1360 | static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroDefinitionKind == clang::PreprocessedEntity::MacroDefinitionKind, ""); | |
| 1361 | static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InclusionDirectiveKind == clang::PreprocessedEntity::InclusionDirectiveKind, ""); | |
| 1362 | ||
| 1363 | ||
| 1364 | void ZigClang_detect_enum_ConstExprUsage(clang::Expr::ConstExprUsage x) { | |
| 1365 | switch (x) { | |
| 1366 | case clang::Expr::EvaluateForCodeGen: | |
| 1367 | case clang::Expr::EvaluateForMangling: | |
| 1368 | break; | |
| 1369 | } | |
| 1370 | } | |
| 1371 | static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForCodeGen == clang::Expr::EvaluateForCodeGen, ""); | |
| 1372 | static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForMangling == clang::Expr::EvaluateForMangling, ""); | |
| 1373 | ||
| 1349 | 1374 | |
| 1350 | 1375 | static_assert(sizeof(ZigClangAPValue) == sizeof(clang::APValue), ""); |
| 1351 | 1376 | |
| ... | ... | @@ -1406,6 +1431,43 @@ static ZigClangDeclStmt_const_decl_iterator bitcast(clang::DeclStmt::const_decl_ |
| 1406 | 1431 | return dest; |
| 1407 | 1432 | } |
| 1408 | 1433 | |
| 1434 | static_assert(sizeof(ZigClangPreprocessingRecord_iterator) == sizeof(clang::PreprocessingRecord::iterator), ""); | |
| 1435 | static ZigClangPreprocessingRecord_iterator bitcast(clang::PreprocessingRecord::iterator src) { | |
| 1436 | ZigClangPreprocessingRecord_iterator dest; | |
| 1437 | memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangPreprocessingRecord_iterator)); | |
| 1438 | return dest; | |
| 1439 | } | |
| 1440 | static clang::PreprocessingRecord::iterator bitcast(ZigClangPreprocessingRecord_iterator src) { | |
| 1441 | clang::PreprocessingRecord::iterator dest; | |
| 1442 | memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangPreprocessingRecord_iterator)); | |
| 1443 | return dest; | |
| 1444 | } | |
| 1445 | ||
| 1446 | static_assert(sizeof(ZigClangRecordDecl_field_iterator) == sizeof(clang::RecordDecl::field_iterator), ""); | |
| 1447 | static ZigClangRecordDecl_field_iterator bitcast(clang::RecordDecl::field_iterator src) { | |
| 1448 | ZigClangRecordDecl_field_iterator dest; | |
| 1449 | memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangRecordDecl_field_iterator)); | |
| 1450 | return dest; | |
| 1451 | } | |
| 1452 | static clang::RecordDecl::field_iterator bitcast(ZigClangRecordDecl_field_iterator src) { | |
| 1453 | clang::RecordDecl::field_iterator dest; | |
| 1454 | memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangRecordDecl_field_iterator)); | |
| 1455 | return dest; | |
| 1456 | } | |
| 1457 | ||
| 1458 | static_assert(sizeof(ZigClangEnumDecl_enumerator_iterator) == sizeof(clang::EnumDecl::enumerator_iterator), ""); | |
| 1459 | static ZigClangEnumDecl_enumerator_iterator bitcast(clang::EnumDecl::enumerator_iterator src) { | |
| 1460 | ZigClangEnumDecl_enumerator_iterator dest; | |
| 1461 | memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangEnumDecl_enumerator_iterator)); | |
| 1462 | return dest; | |
| 1463 | } | |
| 1464 | static clang::EnumDecl::enumerator_iterator bitcast(ZigClangEnumDecl_enumerator_iterator src) { | |
| 1465 | clang::EnumDecl::enumerator_iterator dest; | |
| 1466 | memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangEnumDecl_enumerator_iterator)); | |
| 1467 | return dest; | |
| 1468 | } | |
| 1469 | ||
| 1470 | ||
| 1409 | 1471 | ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const ZigClangSourceManager *self, |
| 1410 | 1472 | ZigClangSourceLocation Loc) |
| 1411 | 1473 | { |
| ... | ... | @@ -1462,6 +1524,28 @@ bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *self, void *contex |
| 1462 | 1524 | reinterpret_cast<bool (*)(void *, const clang::Decl *)>(Fn)); |
| 1463 | 1525 | } |
| 1464 | 1526 | |
| 1527 | struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_begin( | |
| 1528 | struct ZigClangASTUnit *self) | |
| 1529 | { | |
| 1530 | auto casted = reinterpret_cast<const clang::ASTUnit *>(self); | |
| 1531 | return bitcast(casted->getLocalPreprocessingEntities().begin()); | |
| 1532 | } | |
| 1533 | ||
| 1534 | struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_end( | |
| 1535 | struct ZigClangASTUnit *self) | |
| 1536 | { | |
| 1537 | auto casted = reinterpret_cast<const clang::ASTUnit *>(self); | |
| 1538 | return bitcast(casted->getLocalPreprocessingEntities().end()); | |
| 1539 | } | |
| 1540 | ||
| 1541 | struct ZigClangPreprocessedEntity *ZigClangPreprocessingRecord_iterator_deref( | |
| 1542 | struct ZigClangPreprocessingRecord_iterator self) | |
| 1543 | { | |
| 1544 | clang::PreprocessingRecord::iterator casted = bitcast(self); | |
| 1545 | clang::PreprocessedEntity *result = *casted; | |
| 1546 | return reinterpret_cast<ZigClangPreprocessedEntity *>(result); | |
| 1547 | } | |
| 1548 | ||
| 1465 | 1549 | const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *record_ty) { |
| 1466 | 1550 | const clang::RecordDecl *record_decl = reinterpret_cast<const clang::RecordType *>(record_ty)->getDecl(); |
| 1467 | 1551 | return reinterpret_cast<const ZigClangRecordDecl *>(record_decl); |
| ... | ... | @@ -1674,6 +1758,12 @@ const char *ZigClangType_getTypeClassName(const ZigClangType *self) { |
| 1674 | 1758 | return casted->getTypeClassName(); |
| 1675 | 1759 | } |
| 1676 | 1760 | |
| 1761 | const ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const ZigClangType *self) { | |
| 1762 | auto casted = reinterpret_cast<const clang::Type *>(self); | |
| 1763 | const clang::ArrayType *result = casted->getAsArrayTypeUnsafe(); | |
| 1764 | return reinterpret_cast<const ZigClangArrayType *>(result); | |
| 1765 | } | |
| 1766 | ||
| 1677 | 1767 | ZigClangSourceLocation ZigClangStmt_getBeginLoc(const ZigClangStmt *self) { |
| 1678 | 1768 | auto casted = reinterpret_cast<const clang::Stmt *>(self); |
| 1679 | 1769 | return bitcast(casted->getBeginLoc()); |
| ... | ... | @@ -1712,6 +1802,29 @@ bool ZigClangExpr_EvaluateAsBooleanCondition(const ZigClangExpr *self, bool *res |
| 1712 | 1802 | return casted->EvaluateAsBooleanCondition(*result, *casted_ctx, in_constant_context); |
| 1713 | 1803 | } |
| 1714 | 1804 | |
| 1805 | bool ZigClangExpr_EvaluateAsFloat(const ZigClangExpr *self, ZigClangAPFloat **result, | |
| 1806 | const struct ZigClangASTContext *ctx) | |
| 1807 | { | |
| 1808 | llvm::APFloat *ap_float = new llvm::APFloat(0.0f); | |
| 1809 | *result = reinterpret_cast<ZigClangAPFloat *>(ap_float); | |
| 1810 | auto casted = reinterpret_cast<const clang::Expr *>(self); | |
| 1811 | auto casted_ctx = reinterpret_cast<const clang::ASTContext *>(ctx); | |
| 1812 | return casted->EvaluateAsFloat(*ap_float, *casted_ctx); | |
| 1813 | } | |
| 1814 | ||
| 1815 | bool ZigClangExpr_EvaluateAsConstantExpr(const ZigClangExpr *self, ZigClangExprEvalResult *result, | |
| 1816 | ZigClangExpr_ConstExprUsage usage, const struct ZigClangASTContext *ctx) | |
| 1817 | { | |
| 1818 | auto casted_self = reinterpret_cast<const clang::Expr *>(self); | |
| 1819 | auto casted_ctx = reinterpret_cast<const clang::ASTContext *>(ctx); | |
| 1820 | clang::Expr::EvalResult eval_result; | |
| 1821 | if (!casted_self->EvaluateAsConstantExpr(eval_result, (clang::Expr::ConstExprUsage)usage, *casted_ctx)) { | |
| 1822 | return false; | |
| 1823 | } | |
| 1824 | *result = bitcast(eval_result); | |
| 1825 | return true; | |
| 1826 | } | |
| 1827 | ||
| 1715 | 1828 | ZigClangAPValueKind ZigClangAPValue_getKind(const ZigClangAPValue *self) { |
| 1716 | 1829 | auto casted = reinterpret_cast<const clang::APValue *>(self); |
| 1717 | 1830 | return (ZigClangAPValueKind)casted->getKind(); |
| ... | ... | @@ -1911,6 +2024,11 @@ struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *se |
| 1911 | 2024 | return bitcast(casted->getType()); |
| 1912 | 2025 | } |
| 1913 | 2026 | |
| 2027 | struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *self) { | |
| 2028 | auto casted = reinterpret_cast<const clang::VarDecl *>(self); | |
| 2029 | return bitcast(casted->getTypeSourceInfo()->getType()); | |
| 2030 | } | |
| 2031 | ||
| 1914 | 2032 | const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *self) { |
| 1915 | 2033 | auto casted = reinterpret_cast<const clang::VarDecl *>(self); |
| 1916 | 2034 | return reinterpret_cast<const ZigClangExpr *>(casted->getInit()); |
| ... | ... | @@ -1921,6 +2039,32 @@ enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const ZigClangVarDecl *s |
| 1921 | 2039 | return (ZigClangVarDecl_TLSKind)casted->getTLSKind(); |
| 1922 | 2040 | } |
| 1923 | 2041 | |
| 2042 | struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *self) { | |
| 2043 | auto casted = reinterpret_cast<const clang::VarDecl *>(self); | |
| 2044 | return bitcast(casted->getLocation()); | |
| 2045 | } | |
| 2046 | ||
| 2047 | bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *self) { | |
| 2048 | auto casted = reinterpret_cast<const clang::VarDecl *>(self); | |
| 2049 | return casted->hasExternalStorage(); | |
| 2050 | } | |
| 2051 | ||
| 2052 | bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *self) { | |
| 2053 | auto casted = reinterpret_cast<const clang::VarDecl *>(self); | |
| 2054 | return casted->isFileVarDecl(); | |
| 2055 | } | |
| 2056 | ||
| 2057 | bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *self) { | |
| 2058 | auto casted = reinterpret_cast<const clang::VarDecl *>(self); | |
| 2059 | return casted->hasInit(); | |
| 2060 | } | |
| 2061 | ||
| 2062 | const ZigClangAPValue * ZigClangVarDecl_evaluateValue(const struct ZigClangVarDecl *self) { | |
| 2063 | auto casted = reinterpret_cast<const clang::VarDecl *>(self); | |
| 2064 | const clang::APValue *result = casted->evaluateValue(); | |
| 2065 | return reinterpret_cast<const ZigClangAPValue *>(result); | |
| 2066 | } | |
| 2067 | ||
| 1924 | 2068 | enum ZigClangBuiltinTypeKind ZigClangBuiltinType_getKind(const struct ZigClangBuiltinType *self) { |
| 1925 | 2069 | auto casted = reinterpret_cast<const clang::BuiltinType *>(self); |
| 1926 | 2070 | return (ZigClangBuiltinTypeKind)casted->getKind(); |
| ... | ... | @@ -2396,3 +2540,122 @@ const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangPar |
| 2396 | 2540 | auto casted = reinterpret_cast<const clang::ParenExpr *>(self); |
| 2397 | 2541 | return reinterpret_cast<const struct ZigClangExpr *>(casted->getSubExpr()); |
| 2398 | 2542 | } |
| 2543 | ||
| 2544 | enum ZigClangPreprocessedEntity_EntityKind ZigClangPreprocessedEntity_getKind( | |
| 2545 | const struct ZigClangPreprocessedEntity *self) | |
| 2546 | { | |
| 2547 | auto casted = reinterpret_cast<const clang::PreprocessedEntity *>(self); | |
| 2548 | return (ZigClangPreprocessedEntity_EntityKind)casted->getKind(); | |
| 2549 | } | |
| 2550 | ||
| 2551 | const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *self) { | |
| 2552 | auto casted = reinterpret_cast<const clang::MacroDefinitionRecord *>(self); | |
| 2553 | return casted->getName()->getNameStart(); | |
| 2554 | } | |
| 2555 | ||
| 2556 | struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getBegin(const struct ZigClangMacroDefinitionRecord *self) { | |
| 2557 | auto casted = reinterpret_cast<const clang::MacroDefinitionRecord *>(self); | |
| 2558 | return bitcast(casted->getSourceRange().getBegin()); | |
| 2559 | } | |
| 2560 | ||
| 2561 | struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getEnd(const struct ZigClangMacroDefinitionRecord *self) { | |
| 2562 | auto casted = reinterpret_cast<const clang::MacroDefinitionRecord *>(self); | |
| 2563 | return bitcast(casted->getSourceRange().getEnd()); | |
| 2564 | } | |
| 2565 | ||
| 2566 | ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_begin(const struct ZigClangRecordDecl *self) { | |
| 2567 | auto casted = reinterpret_cast<const clang::RecordDecl *>(self); | |
| 2568 | return bitcast(casted->field_begin()); | |
| 2569 | } | |
| 2570 | ||
| 2571 | ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_end(const struct ZigClangRecordDecl *self) { | |
| 2572 | auto casted = reinterpret_cast<const clang::RecordDecl *>(self); | |
| 2573 | return bitcast(casted->field_end()); | |
| 2574 | } | |
| 2575 | ||
| 2576 | bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *self) { | |
| 2577 | auto casted = reinterpret_cast<const clang::FieldDecl *>(self); | |
| 2578 | return casted->isBitField(); | |
| 2579 | } | |
| 2580 | ||
| 2581 | ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *self) { | |
| 2582 | auto casted = reinterpret_cast<const clang::FieldDecl *>(self); | |
| 2583 | return bitcast(casted->getLocation()); | |
| 2584 | } | |
| 2585 | ||
| 2586 | ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *self) { | |
| 2587 | auto casted = reinterpret_cast<const clang::FieldDecl *>(self); | |
| 2588 | return bitcast(casted->getType()); | |
| 2589 | } | |
| 2590 | ||
| 2591 | ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_iterator_next( | |
| 2592 | struct ZigClangRecordDecl_field_iterator self) | |
| 2593 | { | |
| 2594 | clang::RecordDecl::field_iterator casted = bitcast(self); | |
| 2595 | ++casted; | |
| 2596 | return bitcast(casted); | |
| 2597 | } | |
| 2598 | ||
| 2599 | const struct ZigClangFieldDecl * ZigClangRecordDecl_field_iterator_deref( | |
| 2600 | struct ZigClangRecordDecl_field_iterator self) | |
| 2601 | { | |
| 2602 | clang::RecordDecl::field_iterator casted = bitcast(self); | |
| 2603 | const clang::FieldDecl *result = *casted; | |
| 2604 | return reinterpret_cast<const ZigClangFieldDecl *>(result); | |
| 2605 | } | |
| 2606 | ||
| 2607 | bool ZigClangRecordDecl_field_iterator_neq( | |
| 2608 | struct ZigClangRecordDecl_field_iterator a, | |
| 2609 | struct ZigClangRecordDecl_field_iterator b) | |
| 2610 | { | |
| 2611 | clang::RecordDecl::field_iterator casted_a = bitcast(a); | |
| 2612 | clang::RecordDecl::field_iterator casted_b = bitcast(b); | |
| 2613 | return casted_a != casted_b; | |
| 2614 | } | |
| 2615 | ||
| 2616 | ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_begin(const struct ZigClangEnumDecl *self) { | |
| 2617 | auto casted = reinterpret_cast<const clang::EnumDecl *>(self); | |
| 2618 | return bitcast(casted->enumerator_begin()); | |
| 2619 | } | |
| 2620 | ||
| 2621 | ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_end(const struct ZigClangEnumDecl *self) { | |
| 2622 | auto casted = reinterpret_cast<const clang::EnumDecl *>(self); | |
| 2623 | return bitcast(casted->enumerator_end()); | |
| 2624 | } | |
| 2625 | ||
| 2626 | ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_iterator_next( | |
| 2627 | struct ZigClangEnumDecl_enumerator_iterator self) | |
| 2628 | { | |
| 2629 | clang::EnumDecl::enumerator_iterator casted = bitcast(self); | |
| 2630 | ++casted; | |
| 2631 | return bitcast(casted); | |
| 2632 | } | |
| 2633 | ||
| 2634 | const struct ZigClangEnumConstantDecl * ZigClangEnumDecl_enumerator_iterator_deref( | |
| 2635 | struct ZigClangEnumDecl_enumerator_iterator self) | |
| 2636 | { | |
| 2637 | clang::EnumDecl::enumerator_iterator casted = bitcast(self); | |
| 2638 | const clang::EnumConstantDecl *result = *casted; | |
| 2639 | return reinterpret_cast<const ZigClangEnumConstantDecl *>(result); | |
| 2640 | } | |
| 2641 | ||
| 2642 | bool ZigClangEnumDecl_enumerator_iterator_neq( | |
| 2643 | struct ZigClangEnumDecl_enumerator_iterator a, | |
| 2644 | struct ZigClangEnumDecl_enumerator_iterator b) | |
| 2645 | { | |
| 2646 | clang::EnumDecl::enumerator_iterator casted_a = bitcast(a); | |
| 2647 | clang::EnumDecl::enumerator_iterator casted_b = bitcast(b); | |
| 2648 | return casted_a != casted_b; | |
| 2649 | } | |
| 2650 | ||
| 2651 | const struct ZigClangExpr *ZigClangEnumConstantDecl_getInitExpr(const struct ZigClangEnumConstantDecl *self) { | |
| 2652 | auto casted = reinterpret_cast<const clang::EnumConstantDecl *>(self); | |
| 2653 | const clang::Expr *result = casted->getInitExpr(); | |
| 2654 | return reinterpret_cast<const ZigClangExpr *>(result); | |
| 2655 | } | |
| 2656 | ||
| 2657 | const struct ZigClangAPSInt *ZigClangEnumConstantDecl_getInitVal(const struct ZigClangEnumConstantDecl *self) { | |
| 2658 | auto casted = reinterpret_cast<const clang::EnumConstantDecl *>(self); | |
| 2659 | const llvm::APSInt *result = &casted->getInitVal(); | |
| 2660 | return reinterpret_cast<const ZigClangAPSInt *>(result); | |
| 2661 | } |
src/zig_clang.h+69| ... | ... | @@ -122,6 +122,7 @@ struct ZigClangParmVarDecl; |
| 122 | 122 | struct ZigClangPointerType; |
| 123 | 123 | struct ZigClangPredefinedExpr; |
| 124 | 124 | struct ZigClangPreprocessedEntity; |
| 125 | struct ZigClangPreprocessingRecord; | |
| 125 | 126 | struct ZigClangRecordDecl; |
| 126 | 127 | struct ZigClangRecordType; |
| 127 | 128 | struct ZigClangReturnStmt; |
| ... | ... | @@ -146,6 +147,19 @@ struct ZigClangWhileStmt; |
| 146 | 147 | typedef struct ZigClangStmt *const * ZigClangCompoundStmt_const_body_iterator; |
| 147 | 148 | typedef struct ZigClangDecl *const * ZigClangDeclStmt_const_decl_iterator; |
| 148 | 149 | |
| 150 | struct ZigClangRecordDecl_field_iterator { | |
| 151 | void *opaque; | |
| 152 | }; | |
| 153 | ||
| 154 | struct ZigClangEnumDecl_enumerator_iterator { | |
| 155 | void *opaque; | |
| 156 | }; | |
| 157 | ||
| 158 | struct ZigClangPreprocessingRecord_iterator { | |
| 159 | int I; | |
| 160 | struct ZigClangPreprocessingRecord *Self; | |
| 161 | }; | |
| 162 | ||
| 149 | 163 | enum ZigClangBO { |
| 150 | 164 | ZigClangBO_PtrMemD, |
| 151 | 165 | ZigClangBO_PtrMemI, |
| ... | ... | @@ -790,6 +804,18 @@ enum ZigClangElaboratedTypeKeyword { |
| 790 | 804 | ZigClangETK_None, |
| 791 | 805 | }; |
| 792 | 806 | |
| 807 | enum ZigClangPreprocessedEntity_EntityKind { | |
| 808 | ZigClangPreprocessedEntity_InvalidKind, | |
| 809 | ZigClangPreprocessedEntity_MacroExpansionKind, | |
| 810 | ZigClangPreprocessedEntity_MacroDefinitionKind, | |
| 811 | ZigClangPreprocessedEntity_InclusionDirectiveKind, | |
| 812 | }; | |
| 813 | ||
| 814 | enum ZigClangExpr_ConstExprUsage { | |
| 815 | ZigClangExpr_EvaluateForCodeGen, | |
| 816 | ZigClangExpr_EvaluateForMangling, | |
| 817 | }; | |
| 818 | ||
| 793 | 819 | ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const struct ZigClangSourceManager *, |
| 794 | 820 | struct ZigClangSourceLocation Loc); |
| 795 | 821 | ZIG_EXTERN_C const char *ZigClangSourceManager_getFilename(const struct ZigClangSourceManager *, |
| ... | ... | @@ -814,6 +840,13 @@ ZIG_EXTERN_C struct ZigClangASTContext *ZigClangASTUnit_getASTContext(struct Zig |
| 814 | 840 | ZIG_EXTERN_C struct ZigClangSourceManager *ZigClangASTUnit_getSourceManager(struct ZigClangASTUnit *); |
| 815 | 841 | ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(struct ZigClangASTUnit *, void *context, |
| 816 | 842 | bool (*Fn)(void *context, const struct ZigClangDecl *decl)); |
| 843 | ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_begin(struct ZigClangASTUnit *); | |
| 844 | ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_end(struct ZigClangASTUnit *); | |
| 845 | ||
| 846 | ZIG_EXTERN_C struct ZigClangPreprocessedEntity *ZigClangPreprocessingRecord_iterator_deref( | |
| 847 | struct ZigClangPreprocessingRecord_iterator); | |
| 848 | ||
| 849 | ZIG_EXTERN_C enum ZigClangPreprocessedEntity_EntityKind ZigClangPreprocessedEntity_getKind(const struct ZigClangPreprocessedEntity *); | |
| 817 | 850 | |
| 818 | 851 | ZIG_EXTERN_C const struct ZigClangRecordDecl *ZigClangRecordType_getDecl(const struct ZigClangRecordType *record_ty); |
| 819 | 852 | ZIG_EXTERN_C const struct ZigClangEnumDecl *ZigClangEnumType_getDecl(const struct ZigClangEnumType *record_ty); |
| ... | ... | @@ -840,8 +873,22 @@ ZIG_EXTERN_C const struct ZigClangStmt *ZigClangFunctionDecl_getBody(const struc |
| 840 | 873 | ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const struct ZigClangRecordDecl *record_decl); |
| 841 | 874 | ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const struct ZigClangRecordDecl *record_decl); |
| 842 | 875 | ZIG_EXTERN_C bool ZigClangRecordDecl_isAnonymousStructOrUnion(const struct ZigClangRecordDecl *record_decl); |
| 876 | ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_begin(const struct ZigClangRecordDecl *); | |
| 877 | ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_end(const struct ZigClangRecordDecl *); | |
| 878 | ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_iterator_next(struct ZigClangRecordDecl_field_iterator); | |
| 879 | ZIG_EXTERN_C const struct ZigClangFieldDecl * ZigClangRecordDecl_field_iterator_deref(struct ZigClangRecordDecl_field_iterator); | |
| 880 | ZIG_EXTERN_C bool ZigClangRecordDecl_field_iterator_neq( | |
| 881 | struct ZigClangRecordDecl_field_iterator a, | |
| 882 | struct ZigClangRecordDecl_field_iterator b); | |
| 843 | 883 | |
| 844 | 884 | ZIG_EXTERN_C struct ZigClangQualType ZigClangEnumDecl_getIntegerType(const struct ZigClangEnumDecl *); |
| 885 | ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_begin(const struct ZigClangEnumDecl *); | |
| 886 | ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_end(const struct ZigClangEnumDecl *); | |
| 887 | ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_iterator_next(struct ZigClangEnumDecl_enumerator_iterator); | |
| 888 | ZIG_EXTERN_C const struct ZigClangEnumConstantDecl * ZigClangEnumDecl_enumerator_iterator_deref(struct ZigClangEnumDecl_enumerator_iterator); | |
| 889 | ZIG_EXTERN_C bool ZigClangEnumDecl_enumerator_iterator_neq( | |
| 890 | struct ZigClangEnumDecl_enumerator_iterator a, | |
| 891 | struct ZigClangEnumDecl_enumerator_iterator b); | |
| 845 | 892 | |
| 846 | 893 | ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const struct ZigClangDecl *decl); |
| 847 | 894 | ZIG_EXTERN_C enum ZigClangDeclKind ZigClangDecl_getKind(const struct ZigClangDecl *decl); |
| ... | ... | @@ -850,6 +897,12 @@ ZIG_EXTERN_C const char *ZigClangDecl_getDeclKindName(const struct ZigClangDecl |
| 850 | 897 | ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *); |
| 851 | 898 | ZIG_EXTERN_C const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *var_decl); |
| 852 | 899 | ZIG_EXTERN_C enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const struct ZigClangVarDecl *var_decl); |
| 900 | ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *); | |
| 901 | ZIG_EXTERN_C bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *); | |
| 902 | ZIG_EXTERN_C bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *); | |
| 903 | ZIG_EXTERN_C bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *); | |
| 904 | ZIG_EXTERN_C const struct ZigClangAPValue *ZigClangVarDecl_evaluateValue(const struct ZigClangVarDecl *); | |
| 905 | ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *); | |
| 853 | 906 | |
| 854 | 907 | ZIG_EXTERN_C bool ZigClangSourceLocation_eq(struct ZigClangSourceLocation a, struct ZigClangSourceLocation b); |
| 855 | 908 | |
| ... | ... | @@ -869,6 +922,7 @@ ZIG_EXTERN_C enum ZigClangTypeClass ZigClangType_getTypeClass(const struct ZigCl |
| 869 | 922 | ZIG_EXTERN_C struct ZigClangQualType ZigClangType_getPointeeType(const struct ZigClangType *self); |
| 870 | 923 | ZIG_EXTERN_C bool ZigClangType_isVoidType(const struct ZigClangType *self); |
| 871 | 924 | ZIG_EXTERN_C const char *ZigClangType_getTypeClassName(const struct ZigClangType *self); |
| 925 | ZIG_EXTERN_C const struct ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const struct ZigClangType *self); | |
| 872 | 926 | |
| 873 | 927 | ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangStmt_getBeginLoc(const struct ZigClangStmt *self); |
| 874 | 928 | ZIG_EXTERN_C enum ZigClangStmtClass ZigClangStmt_getStmtClass(const struct ZigClangStmt *self); |
| ... | ... | @@ -879,6 +933,10 @@ ZIG_EXTERN_C struct ZigClangQualType ZigClangExpr_getType(const struct ZigClangE |
| 879 | 933 | ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangExpr_getBeginLoc(const struct ZigClangExpr *self); |
| 880 | 934 | ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsBooleanCondition(const struct ZigClangExpr *self, |
| 881 | 935 | bool *result, const struct ZigClangASTContext *ctx, bool in_constant_context); |
| 936 | ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsFloat(const struct ZigClangExpr *self, | |
| 937 | ZigClangAPFloat **result, const struct ZigClangASTContext *ctx); | |
| 938 | ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsConstantExpr(const struct ZigClangExpr *, | |
| 939 | struct ZigClangExprEvalResult *, ZigClangExpr_ConstExprUsage, const struct ZigClangASTContext *); | |
| 882 | 940 | |
| 883 | 941 | ZIG_EXTERN_C enum ZigClangAPValueKind ZigClangAPValue_getKind(const struct ZigClangAPValue *self); |
| 884 | 942 | ZIG_EXTERN_C const struct ZigClangAPSInt *ZigClangAPValue_getInt(const struct ZigClangAPValue *self); |
| ... | ... | @@ -1031,4 +1089,15 @@ ZIG_EXTERN_C const struct ZigClangStmt *ZigClangCaseStmt_getSubStmt(const struct |
| 1031 | 1089 | ZIG_EXTERN_C const struct ZigClangStmt *ZigClangDefaultStmt_getSubStmt(const struct ZigClangDefaultStmt *); |
| 1032 | 1090 | |
| 1033 | 1091 | ZIG_EXTERN_C const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangParenExpr *); |
| 1092 | ||
| 1093 | ZIG_EXTERN_C const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *); | |
| 1094 | ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getBegin(const struct ZigClangMacroDefinitionRecord *); | |
| 1095 | ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getEnd(const struct ZigClangMacroDefinitionRecord *); | |
| 1096 | ||
| 1097 | ZIG_EXTERN_C bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *); | |
| 1098 | ZIG_EXTERN_C struct ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *); | |
| 1099 | ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *); | |
| 1100 | ||
| 1101 | ZIG_EXTERN_C const struct ZigClangExpr *ZigClangEnumConstantDecl_getInitExpr(const struct ZigClangEnumConstantDecl *); | |
| 1102 | ZIG_EXTERN_C const struct ZigClangAPSInt *ZigClangEnumConstantDecl_getInitVal(const struct ZigClangEnumConstantDecl *); | |
| 1034 | 1103 | #endif |