authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-02 16:13:33-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-02 19:21:40-04:00
loga7c9aa7ddb06fe14c4c67e317586177141c9e37a
tree3521692fb20e1f996bff1a473ba1f2e162b04f70
parentf84086132f1a60ce4c46af1720eccb244cc13688
signaturelock-open Commit is signed but in an unrecognized format.

finish conversion of translate_c.cpp to use zig_clang.h

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,19 +14,6 @@
14#include "parser.hpp"14#include "parser.hpp"
15#include "zig_clang.h"15#include "zig_clang.h"
1616
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#include <string.h>17#include <string.h>
3118
32struct Alias {19struct Alias {
...@@ -129,37 +116,6 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC...@@ -129,37 +116,6 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC
129 ZigClangSourceLocation source_loc);116 ZigClangSourceLocation source_loc);
130static bool c_is_unsigned_integer(Context *c, ZigClangQualType qt);117static bool c_is_unsigned_integer(Context *c, ZigClangQualType qt);
131118
132static const ZigClangAPSInt *bitcast(const llvm::APSInt *src) {
133 return reinterpret_cast<const ZigClangAPSInt *>(src);
134}
135
136static 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
144static const ZigClangExpr *bitcast(const clang::Expr *src) {
145 return reinterpret_cast<const ZigClangExpr *>(src);
146}
147
148static ZigClangSourceLocation bitcast(clang::SourceLocation src) {
149 ZigClangSourceLocation dest;
150 memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangSourceLocation));
151 return dest;
152}
153static 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//}
163119
164ATTRIBUTE_PRINTF(3, 4)120ATTRIBUTE_PRINTF(3, 4)
165static void emit_warning(Context *c, ZigClangSourceLocation sl, const char *format, ...) {121static 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,10 +477,10 @@ static AstNode *trans_create_node_apint(Context *c, const ZigClangAPSInt *aps_in
521 return node;477 return node;
522}478}
523479
524static AstNode *trans_create_node_apfloat(Context *c, const llvm::APFloat &ap_float) {480static AstNode *trans_create_node_apfloat(Context *c, const ZigClangAPFloat *ap_float) {
525 uint8_t buf[128];481 uint8_t buf[128];
526 size_t written = ap_float.convertToHexString((char *)buf, 0, false,482 size_t written = ZigClangAPFloat_convertToHexString(ap_float, (char *)buf, 0, false,
527 llvm::APFloat::rmNearestTiesToEven);483 ZigClangAPFloat_roundingMode_NearestTiesToEven);
528 AstNode *node = trans_create_node(c, NodeTypeFloatLiteral);484 AstNode *node = trans_create_node(c, NodeTypeFloatLiteral);
529 node->data.float_literal.bigfloat = allocate<BigFloat>(1);485 node->data.float_literal.bigfloat = allocate<BigFloat>(1);
530 if (bigfloat_init_buf(node->data.float_literal.bigfloat, buf, written)) {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,13 +824,14 @@ static bool type_is_opaque(Context *c, const ZigClangType *ty, ZigClangSourceLoc
868 if (record_def == nullptr) {824 if (record_def == nullptr) {
869 return true;825 return true;
870 }826 }
871 for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(),827 for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def),
872 it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end();828 it_end = ZigClangRecordDecl_field_end(record_def);
873 it != it_end; ++it)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);
876833
877 if (field_decl->isBitField()) {834 if (ZigClangFieldDecl_isBitField(field_decl)) {
878 return true;835 return true;
879 }836 }
880 }837 }
...@@ -1393,8 +1350,8 @@ static AstNode *trans_integer_literal(Context *c, ResultUsed result_used, const...@@ -1393,8 +1350,8 @@ static AstNode *trans_integer_literal(Context *c, ResultUsed result_used, const
1393}1350}
13941351
1395static AstNode *trans_floating_literal(Context *c, ResultUsed result_used, const ZigClangFloatingLiteral *stmt) {1352static AstNode *trans_floating_literal(Context *c, ResultUsed result_used, const ZigClangFloatingLiteral *stmt) {
1396 llvm::APFloat result{0.0f};1353 ZigClangAPFloat *result;
1397 if (!reinterpret_cast<const clang::FloatingLiteral *>(stmt)->EvaluateAsFloat(result, *reinterpret_cast<clang::ASTContext *>(c->ctx))) {1354 if (!ZigClangExpr_EvaluateAsFloat((const ZigClangExpr *)stmt, &result, c->ctx)) {
1398 emit_warning(c, ZigClangExpr_getBeginLoc((ZigClangExpr*)stmt), "invalid floating literal");1355 emit_warning(c, ZigClangExpr_getBeginLoc((ZigClangExpr*)stmt), "invalid floating literal");
1399 return nullptr;1356 return nullptr;
1400 }1357 }
...@@ -1434,15 +1391,14 @@ static AstNode *trans_character_literal(Context *c, ResultUsed result_used, cons...@@ -1434,15 +1391,14 @@ static AstNode *trans_character_literal(Context *c, ResultUsed result_used, cons
14341391
1435static AstNode *trans_constant_expr(Context *c, ResultUsed result_used, const ZigClangConstantExpr *expr) {1392static AstNode *trans_constant_expr(Context *c, ResultUsed result_used, const ZigClangConstantExpr *expr) {
1436 const ZigClangExpr *as_expr = reinterpret_cast<const ZigClangExpr *>(expr);1393 const ZigClangExpr *as_expr = reinterpret_cast<const ZigClangExpr *>(expr);
1437 clang::Expr::EvalResult result;1394 ZigClangExprEvalResult result;
1438 if (!reinterpret_cast<const clang::ConstantExpr *>(expr)->EvaluateAsConstantExpr(result,1395 if (!ZigClangExpr_EvaluateAsConstantExpr((const ZigClangExpr *)expr, &result,
1439 clang::Expr::EvaluateForCodeGen,1396 ZigClangExpr_EvaluateForCodeGen, c->ctx))
1440 *reinterpret_cast<clang::ASTContext *>(c->ctx)))
1441 {1397 {
1442 emit_warning(c, ZigClangExpr_getBeginLoc(as_expr), "invalid constant expression");1398 emit_warning(c, ZigClangExpr_getBeginLoc(as_expr), "invalid constant expression");
1443 return nullptr;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 ZigClangExpr_getBeginLoc(as_expr));1402 ZigClangExpr_getBeginLoc(as_expr));
1447 return maybe_suppress_result(c, result_used, node);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,16 +2408,18 @@ static int trans_local_declaration(Context *c, TransScope *scope, const ZigClang
2452 TransScopeBlock *scope_block = trans_scope_block_find(scope);2408 TransScopeBlock *scope_block = trans_scope_block_find(scope);
2453 assert(scope_block != nullptr);2409 assert(scope_block != nullptr);
24542410
2455 for (auto iter = reinterpret_cast<const clang::DeclStmt *>(stmt)->decl_begin();2411 for (ZigClangDeclStmt_const_decl_iterator iter = ZigClangDeclStmt_decl_begin(stmt),
2456 iter != reinterpret_cast<const clang::DeclStmt *>(stmt)->decl_end(); iter++) {2412 iter_end = ZigClangDeclStmt_decl_end(stmt);
2457 ZigClangDecl *decl = reinterpret_cast<ZigClangDecl *>(*iter);2413 iter != iter_end; ++iter)
2414 {
2415 ZigClangDecl *decl = *iter;
2458 switch (ZigClangDecl_getKind(decl)) {2416 switch (ZigClangDecl_getKind(decl)) {
2459 case ZigClangDeclVar: {2417 case ZigClangDeclVar: {
2460 clang::VarDecl *var_decl = (clang::VarDecl *)decl;2418 ZigClangVarDecl *var_decl = (ZigClangVarDecl *)decl;
2461 ZigClangQualType qual_type = bitcast(var_decl->getTypeSourceInfo()->getType());2419 ZigClangQualType qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);
2462 AstNode *init_node = nullptr;2420 AstNode *init_node = nullptr;
2463 if (var_decl->hasInit()) {2421 if (ZigClangVarDecl_hasInit(var_decl)) {
2464 init_node = trans_expr(c, ResultUsedYes, scope, bitcast(var_decl->getInit()), TransRValue);2422 init_node = trans_expr(c, ResultUsedYes, scope, ZigClangVarDecl_getInit(var_decl), TransRValue);
2465 if (init_node == nullptr)2423 if (init_node == nullptr)
2466 return ErrorUnexpected;2424 return ErrorUnexpected;
24672425
...@@ -4317,12 +4275,13 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)...@@ -4317,12 +4275,13 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)
43174275
4318 bool pure_enum = true;4276 bool pure_enum = true;
4319 uint32_t field_count = 0;4277 uint32_t field_count = 0;
4320 for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(),4278 for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def),
4321 it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end();4279 it_end = ZigClangEnumDecl_enumerator_end(enum_def);
4322 it != it_end; ++it, field_count += 1)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;4283 const ZigClangEnumConstantDecl *enum_const = ZigClangEnumDecl_enumerator_iterator_deref(it);
4325 if (enum_const->getInitExpr()) {4284 if (ZigClangEnumConstantDecl_getInitExpr(enum_const)) {
4326 pure_enum = false;4285 pure_enum = false;
4327 }4286 }
4328 }4287 }
...@@ -4343,11 +4302,12 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)...@@ -4343,11 +4302,12 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)
4343 }4302 }
4344 enum_node->data.container_decl.fields.resize(field_count);4303 enum_node->data.container_decl.fields.resize(field_count);
4345 uint32_t i = 0;4304 uint32_t i = 0;
4346 for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(),4305 for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def),
4347 it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end();4306 it_end = ZigClangEnumDecl_enumerator_end(enum_def);
4348 it != it_end; ++it, i += 1)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);
43514311
4352 Buf *enum_val_name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)enum_const));4312 Buf *enum_val_name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)enum_const));
4353 Buf *field_name;4313 Buf *field_name;
...@@ -4358,7 +4318,7 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)...@@ -4358,7 +4318,7 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)
4358 }4318 }
43594319
4360 AstNode *int_node = pure_enum && !is_anonymous ?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 AstNode *field_node = trans_create_node(c, NodeTypeStructField);4322 AstNode *field_node = trans_create_node(c, NodeTypeStructField);
4363 field_node->data.struct_field.name = field_name;4323 field_node->data.struct_field.name = field_name;
4364 field_node->data.struct_field.type = nullptr;4324 field_node->data.struct_field.type = nullptr;
...@@ -4438,15 +4398,16 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record...@@ -4438,15 +4398,16 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record
44384398
4439 // count fields and validate4399 // count fields and validate
4440 uint32_t field_count = 0;4400 uint32_t field_count = 0;
4441 for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(),4401 for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def),
4442 it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end();4402 it_end = ZigClangRecordDecl_field_end(record_def);
4443 it != it_end; ++it, field_count += 1)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);
44464407
4447 if (field_decl->isBitField()) {4408 if (ZigClangFieldDecl_isBitField(field_decl)) {
4448 emit_warning(c, bitcast(field_decl->getLocation()), "%s %s demoted to opaque type - has bitfield",4409 emit_warning(c, ZigClangFieldDecl_getLocation(field_decl),
4449 container_kind_name,4410 "%s %s demoted to opaque type - has bitfield", container_kind_name,
4450 is_anonymous ? "(anon)" : buf_ptr(bare_name));4411 is_anonymous ? "(anon)" : buf_ptr(bare_name));
4451 return demote_struct_to_opaque(c, record_decl, full_type_name, bare_name);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,19 +4429,20 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record
4468 }4429 }
44694430
4470 uint32_t i = 0;4431 uint32_t i = 0;
4471 for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(),4432 for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def),
4472 it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end();4433 it_end = ZigClangRecordDecl_field_end(record_def);
4473 it != it_end; ++it, i += 1)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);
44764438
4477 AstNode *field_node = trans_create_node(c, NodeTypeStructField);4439 AstNode *field_node = trans_create_node(c, NodeTypeStructField);
4478 field_node->data.struct_field.name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)field_decl));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()),4441 field_node->data.struct_field.type = trans_qual_type(c, ZigClangFieldDecl_getType(field_decl),
4480 bitcast(field_decl->getLocation()));4442 ZigClangFieldDecl_getLocation(field_decl));
44814443
4482 if (field_node->data.struct_field.type == nullptr) {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 "%s %s demoted to opaque type - unresolved type",4446 "%s %s demoted to opaque type - unresolved type",
4485 container_kind_name,4447 container_kind_name,
4486 is_anonymous ? "(anon)" : buf_ptr(bare_name));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,8 +4484,8 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC
4522 init_node->data.container_init_expr.type = arr_type_node;4484 init_node->data.container_init_expr.type = arr_type_node;
4523 init_node->data.container_init_expr.kind = ContainerInitKindArray;4485 init_node->data.container_init_expr.kind = ContainerInitKindArray;
45244486
4525 const clang::Type *qt_type = reinterpret_cast<const clang::Type *>(ZigClangQualType_getTypePtr(qt));4487 const ZigClangType *qt_type = ZigClangQualType_getTypePtr(qt);
4526 ZigClangQualType child_qt = bitcast(qt_type->getAsArrayTypeUnsafe()->getElementType());4488 ZigClangQualType child_qt = ZigClangArrayType_getElementType(ZigClangType_getAsArrayTypeUnsafe(qt_type));
45274489
4528 for (size_t i = 0; i < init_count; i += 1) {4490 for (size_t i = 0; i < init_count; i += 1) {
4529 const ZigClangAPValue *elem_ap_val = ZigClangAPValue_getArrayInitializedElt(ap_value, i);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,8 +4531,7 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC
4569 if (const ZigClangExpr *expr = ZigClangAPValueLValueBase_dyn_cast_Expr(lval_base)) {4531 if (const ZigClangExpr *expr = ZigClangAPValueLValueBase_dyn_cast_Expr(lval_base)) {
4570 return trans_expr(c, ResultUsedYes, &c->global_scope->base, expr, TransRValue);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 *>();4534 emit_warning(c, source_loc, "TODO handle initializer LValue ValueDecl");
4573 emit_warning(c, source_loc, "TODO handle initializer LValue clang::ValueDecl");
4574 return nullptr;4535 return nullptr;
4575 }4536 }
4576 case ZigClangAPValueFloat:4537 case ZigClangAPValueFloat:
...@@ -4607,43 +4568,43 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC...@@ -4607,43 +4568,43 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC
4607 zig_unreachable();4568 zig_unreachable();
4608}4569}
46094570
4610static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) {4571static void visit_var_decl(Context *c, const ZigClangVarDecl *var_decl) {
4611 Buf *name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)var_decl));4572 Buf *name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)var_decl));
46124573
4613 switch (var_decl->getTLSKind()) {4574 switch (ZigClangVarDecl_getTLSKind(var_decl)) {
4614 case clang::VarDecl::TLS_None:4575 case ZigClangVarDecl_TLSKind_None:
4615 break;4576 break;
4616 case clang::VarDecl::TLS_Static:4577 case ZigClangVarDecl_TLSKind_Static:
4617 emit_warning(c, bitcast(var_decl->getLocation()),4578 emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
4618 "ignoring variable '%s' - static thread local storage", buf_ptr(name));4579 "ignoring variable '%s' - static thread local storage", buf_ptr(name));
4619 return;4580 return;
4620 case clang::VarDecl::TLS_Dynamic:4581 case ZigClangVarDecl_TLSKind_Dynamic:
4621 emit_warning(c, bitcast(var_decl->getLocation()),4582 emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
4622 "ignoring variable '%s' - dynamic thread local storage", buf_ptr(name));4583 "ignoring variable '%s' - dynamic thread local storage", buf_ptr(name));
4623 return;4584 return;
4624 }4585 }
46254586
4626 ZigClangQualType qt = bitcast(var_decl->getType());4587 ZigClangQualType qt = ZigClangVarDecl_getType(var_decl);
4627 AstNode *var_type = trans_qual_type(c, qt, bitcast(var_decl->getLocation()));4588 AstNode *var_type = trans_qual_type(c, qt, ZigClangVarDecl_getLocation(var_decl));
4628 if (var_type == nullptr) {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 return;4591 return;
4631 }4592 }
46324593
4633 bool is_extern = var_decl->hasExternalStorage();4594 bool is_extern = ZigClangVarDecl_hasExternalStorage(var_decl);
4634 bool is_static = var_decl->isFileVarDecl();4595 bool is_static = ZigClangVarDecl_isFileVarDecl(var_decl);
4635 bool is_const = ZigClangQualType_isConstQualified(qt);4596 bool is_const = ZigClangQualType_isConstQualified(qt);
46364597
4637 if (is_static && !is_extern) {4598 if (is_static && !is_extern) {
4638 AstNode *init_node;4599 AstNode *init_node;
4639 if (var_decl->hasInit()) {4600 if (ZigClangVarDecl_hasInit(var_decl)) {
4640 const ZigClangAPValue *ap_value = bitcast(var_decl->evaluateValue());4601 const ZigClangAPValue *ap_value = ZigClangVarDecl_evaluateValue(var_decl);
4641 if (ap_value == nullptr) {4602 if (ap_value == nullptr) {
4642 emit_warning(c, bitcast(var_decl->getLocation()),4603 emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
4643 "ignoring variable '%s' - unable to evaluate initializer", buf_ptr(name));4604 "ignoring variable '%s' - unable to evaluate initializer", buf_ptr(name));
4644 return;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 if (init_node == nullptr)4608 if (init_node == nullptr)
4648 return;4609 return;
4649 } else {4610 } else {
...@@ -4662,7 +4623,7 @@ static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) {...@@ -4662,7 +4623,7 @@ static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) {
4662 return;4623 return;
4663 }4624 }
46644625
4665 emit_warning(c, bitcast(var_decl->getLocation()),4626 emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
4666 "ignoring variable '%s' - non-extern, non-static variable", buf_ptr(name));4627 "ignoring variable '%s' - non-extern, non-static variable", buf_ptr(name));
4667 return;4628 return;
4668}4629}
...@@ -4684,7 +4645,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *decl) {...@@ -4684,7 +4645,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *decl) {
4684 resolve_record_decl(c, reinterpret_cast<const ZigClangRecordDecl *>(decl));4645 resolve_record_decl(c, reinterpret_cast<const ZigClangRecordDecl *>(decl));
4685 break;4646 break;
4686 case ZigClangDeclVar: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 break;4649 break;
4689 default:4650 default:
4690 emit_warning(c, ZigClangDecl_getLocation(decl), "ignoring %s decl", ZigClangDecl_getDeclKindName(decl));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,25 +5075,26 @@ static void process_macro(Context *c, CTokenize *ctok, Buf *name, const char *ch
5114 c->macro_table.put(name, result_node);5075 c->macro_table.put(name, result_node);
5115}5076}
51165077
5117static void process_preprocessor_entities(Context *c, ZigClangASTUnit *zunit) {5078static void process_preprocessor_entities(Context *c, ZigClangASTUnit *unit) {
5118 clang::ASTUnit *unit = reinterpret_cast<clang::ASTUnit *>(zunit);
5119 CTokenize ctok = {{0}};5079 CTokenize ctok = {{0}};
51205080
5121 // TODO if we see #undef, delete it from the table5081 // 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);
51225086
5123 for (clang::PreprocessedEntity *entity : unit->getLocalPreprocessingEntities()) {5087 switch (ZigClangPreprocessedEntity_getKind(entity)) {
5124 switch (entity->getKind()) {5088 case ZigClangPreprocessedEntity_InvalidKind:
5125 case clang::PreprocessedEntity::InvalidKind:5089 case ZigClangPreprocessedEntity_InclusionDirectiveKind:
5126 case clang::PreprocessedEntity::InclusionDirectiveKind:5090 case ZigClangPreprocessedEntity_MacroExpansionKind:
5127 case clang::PreprocessedEntity::MacroExpansionKind:
5128 continue;5091 continue;
5129 case clang::PreprocessedEntity::MacroDefinitionKind:5092 case ZigClangPreprocessedEntity_MacroDefinitionKind:
5130 {5093 {
5131 clang::MacroDefinitionRecord *macro = static_cast<clang::MacroDefinitionRecord *>(entity);5094 ZigClangMacroDefinitionRecord *macro = reinterpret_cast<ZigClangMacroDefinitionRecord *>(entity);
5132 const char *raw_name = macro->getName()->getNameStart();5095 const char *raw_name = ZigClangMacroDefinitionRecord_getName_getNameStart(macro);
5133 clang::SourceRange range = macro->getSourceRange();5096 ZigClangSourceLocation begin_loc = ZigClangMacroDefinitionRecord_getSourceRange_getBegin(macro);
5134 ZigClangSourceLocation begin_loc = bitcast(range.getBegin());5097 ZigClangSourceLocation end_loc = ZigClangMacroDefinitionRecord_getSourceRange_getEnd(macro);
5135 ZigClangSourceLocation end_loc = bitcast(range.getEnd());
51365098
5137 if (ZigClangSourceLocation_eq(begin_loc, end_loc)) {5099 if (ZigClangSourceLocation_eq(begin_loc, end_loc)) {
5138 // this means it is a macro without a value5100 // 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,6 +1346,31 @@ static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Enum == clang::ETK_Enum,
1346static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Typename == clang::ETK_Typename, "");1346static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Typename == clang::ETK_Typename, "");
1347static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_None == clang::ETK_None, "");1347static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_None == clang::ETK_None, "");
13481348
1349void 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}
1358static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InvalidKind == clang::PreprocessedEntity::InvalidKind, "");
1359static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroExpansionKind == clang::PreprocessedEntity::MacroExpansionKind, "");
1360static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroDefinitionKind == clang::PreprocessedEntity::MacroDefinitionKind, "");
1361static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InclusionDirectiveKind == clang::PreprocessedEntity::InclusionDirectiveKind, "");
1362
1363
1364void 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}
1371static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForCodeGen == clang::Expr::EvaluateForCodeGen, "");
1372static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForMangling == clang::Expr::EvaluateForMangling, "");
1373
13491374
1350static_assert(sizeof(ZigClangAPValue) == sizeof(clang::APValue), "");1375static_assert(sizeof(ZigClangAPValue) == sizeof(clang::APValue), "");
13511376
...@@ -1406,6 +1431,43 @@ static ZigClangDeclStmt_const_decl_iterator bitcast(clang::DeclStmt::const_decl_...@@ -1406,6 +1431,43 @@ static ZigClangDeclStmt_const_decl_iterator bitcast(clang::DeclStmt::const_decl_
1406 return dest;1431 return dest;
1407}1432}
14081433
1434static_assert(sizeof(ZigClangPreprocessingRecord_iterator) == sizeof(clang::PreprocessingRecord::iterator), "");
1435static 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}
1440static 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
1446static_assert(sizeof(ZigClangRecordDecl_field_iterator) == sizeof(clang::RecordDecl::field_iterator), "");
1447static 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}
1452static 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
1458static_assert(sizeof(ZigClangEnumDecl_enumerator_iterator) == sizeof(clang::EnumDecl::enumerator_iterator), "");
1459static 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}
1464static 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
1409ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const ZigClangSourceManager *self,1471ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const ZigClangSourceManager *self,
1410 ZigClangSourceLocation Loc)1472 ZigClangSourceLocation Loc)
1411{1473{
...@@ -1462,6 +1524,28 @@ bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *self, void *contex...@@ -1462,6 +1524,28 @@ bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *self, void *contex
1462 reinterpret_cast<bool (*)(void *, const clang::Decl *)>(Fn));1524 reinterpret_cast<bool (*)(void *, const clang::Decl *)>(Fn));
1463}1525}
14641526
1527struct 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
1534struct 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
1541struct 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
1465const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *record_ty) {1549const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *record_ty) {
1466 const clang::RecordDecl *record_decl = reinterpret_cast<const clang::RecordType *>(record_ty)->getDecl();1550 const clang::RecordDecl *record_decl = reinterpret_cast<const clang::RecordType *>(record_ty)->getDecl();
1467 return reinterpret_cast<const ZigClangRecordDecl *>(record_decl);1551 return reinterpret_cast<const ZigClangRecordDecl *>(record_decl);
...@@ -1674,6 +1758,12 @@ const char *ZigClangType_getTypeClassName(const ZigClangType *self) {...@@ -1674,6 +1758,12 @@ const char *ZigClangType_getTypeClassName(const ZigClangType *self) {
1674 return casted->getTypeClassName();1758 return casted->getTypeClassName();
1675}1759}
16761760
1761const 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
1677ZigClangSourceLocation ZigClangStmt_getBeginLoc(const ZigClangStmt *self) {1767ZigClangSourceLocation ZigClangStmt_getBeginLoc(const ZigClangStmt *self) {
1678 auto casted = reinterpret_cast<const clang::Stmt *>(self);1768 auto casted = reinterpret_cast<const clang::Stmt *>(self);
1679 return bitcast(casted->getBeginLoc());1769 return bitcast(casted->getBeginLoc());
...@@ -1712,6 +1802,29 @@ bool ZigClangExpr_EvaluateAsBooleanCondition(const ZigClangExpr *self, bool *res...@@ -1712,6 +1802,29 @@ bool ZigClangExpr_EvaluateAsBooleanCondition(const ZigClangExpr *self, bool *res
1712 return casted->EvaluateAsBooleanCondition(*result, *casted_ctx, in_constant_context);1802 return casted->EvaluateAsBooleanCondition(*result, *casted_ctx, in_constant_context);
1713}1803}
17141804
1805bool 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
1815bool 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
1715ZigClangAPValueKind ZigClangAPValue_getKind(const ZigClangAPValue *self) {1828ZigClangAPValueKind ZigClangAPValue_getKind(const ZigClangAPValue *self) {
1716 auto casted = reinterpret_cast<const clang::APValue *>(self);1829 auto casted = reinterpret_cast<const clang::APValue *>(self);
1717 return (ZigClangAPValueKind)casted->getKind();1830 return (ZigClangAPValueKind)casted->getKind();
...@@ -1911,6 +2024,11 @@ struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *se...@@ -1911,6 +2024,11 @@ struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *se
1911 return bitcast(casted->getType());2024 return bitcast(casted->getType());
1912}2025}
19132026
2027struct 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
1914const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *self) {2032const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *self) {
1915 auto casted = reinterpret_cast<const clang::VarDecl *>(self);2033 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
1916 return reinterpret_cast<const ZigClangExpr *>(casted->getInit());2034 return reinterpret_cast<const ZigClangExpr *>(casted->getInit());
...@@ -1921,6 +2039,32 @@ enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const ZigClangVarDecl *s...@@ -1921,6 +2039,32 @@ enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const ZigClangVarDecl *s
1921 return (ZigClangVarDecl_TLSKind)casted->getTLSKind();2039 return (ZigClangVarDecl_TLSKind)casted->getTLSKind();
1922}2040}
19232041
2042struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *self) {
2043 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
2044 return bitcast(casted->getLocation());
2045}
2046
2047bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *self) {
2048 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
2049 return casted->hasExternalStorage();
2050}
2051
2052bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *self) {
2053 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
2054 return casted->isFileVarDecl();
2055}
2056
2057bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *self) {
2058 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
2059 return casted->hasInit();
2060}
2061
2062const 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
1924enum ZigClangBuiltinTypeKind ZigClangBuiltinType_getKind(const struct ZigClangBuiltinType *self) {2068enum ZigClangBuiltinTypeKind ZigClangBuiltinType_getKind(const struct ZigClangBuiltinType *self) {
1925 auto casted = reinterpret_cast<const clang::BuiltinType *>(self);2069 auto casted = reinterpret_cast<const clang::BuiltinType *>(self);
1926 return (ZigClangBuiltinTypeKind)casted->getKind();2070 return (ZigClangBuiltinTypeKind)casted->getKind();
...@@ -2396,3 +2540,122 @@ const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangPar...@@ -2396,3 +2540,122 @@ const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangPar
2396 auto casted = reinterpret_cast<const clang::ParenExpr *>(self);2540 auto casted = reinterpret_cast<const clang::ParenExpr *>(self);
2397 return reinterpret_cast<const struct ZigClangExpr *>(casted->getSubExpr());2541 return reinterpret_cast<const struct ZigClangExpr *>(casted->getSubExpr());
2398}2542}
2543
2544enum 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
2551const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *self) {
2552 auto casted = reinterpret_cast<const clang::MacroDefinitionRecord *>(self);
2553 return casted->getName()->getNameStart();
2554}
2555
2556struct 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
2561struct 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
2566ZigClangRecordDecl_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
2571ZigClangRecordDecl_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
2576bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *self) {
2577 auto casted = reinterpret_cast<const clang::FieldDecl *>(self);
2578 return casted->isBitField();
2579}
2580
2581ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *self) {
2582 auto casted = reinterpret_cast<const clang::FieldDecl *>(self);
2583 return bitcast(casted->getLocation());
2584}
2585
2586ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *self) {
2587 auto casted = reinterpret_cast<const clang::FieldDecl *>(self);
2588 return bitcast(casted->getType());
2589}
2590
2591ZigClangRecordDecl_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
2599const 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
2607bool 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
2616ZigClangEnumDecl_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
2621ZigClangEnumDecl_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
2626ZigClangEnumDecl_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
2634const 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
2642bool 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
2651const 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
2657const 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,6 +122,7 @@ struct ZigClangParmVarDecl;
122struct ZigClangPointerType;122struct ZigClangPointerType;
123struct ZigClangPredefinedExpr;123struct ZigClangPredefinedExpr;
124struct ZigClangPreprocessedEntity;124struct ZigClangPreprocessedEntity;
125struct ZigClangPreprocessingRecord;
125struct ZigClangRecordDecl;126struct ZigClangRecordDecl;
126struct ZigClangRecordType;127struct ZigClangRecordType;
127struct ZigClangReturnStmt;128struct ZigClangReturnStmt;
...@@ -146,6 +147,19 @@ struct ZigClangWhileStmt;...@@ -146,6 +147,19 @@ struct ZigClangWhileStmt;
146typedef struct ZigClangStmt *const * ZigClangCompoundStmt_const_body_iterator;147typedef struct ZigClangStmt *const * ZigClangCompoundStmt_const_body_iterator;
147typedef struct ZigClangDecl *const * ZigClangDeclStmt_const_decl_iterator;148typedef struct ZigClangDecl *const * ZigClangDeclStmt_const_decl_iterator;
148149
150struct ZigClangRecordDecl_field_iterator {
151 void *opaque;
152};
153
154struct ZigClangEnumDecl_enumerator_iterator {
155 void *opaque;
156};
157
158struct ZigClangPreprocessingRecord_iterator {
159 int I;
160 struct ZigClangPreprocessingRecord *Self;
161};
162
149enum ZigClangBO {163enum ZigClangBO {
150 ZigClangBO_PtrMemD,164 ZigClangBO_PtrMemD,
151 ZigClangBO_PtrMemI,165 ZigClangBO_PtrMemI,
...@@ -790,6 +804,18 @@ enum ZigClangElaboratedTypeKeyword {...@@ -790,6 +804,18 @@ enum ZigClangElaboratedTypeKeyword {
790 ZigClangETK_None,804 ZigClangETK_None,
791};805};
792806
807enum ZigClangPreprocessedEntity_EntityKind {
808 ZigClangPreprocessedEntity_InvalidKind,
809 ZigClangPreprocessedEntity_MacroExpansionKind,
810 ZigClangPreprocessedEntity_MacroDefinitionKind,
811 ZigClangPreprocessedEntity_InclusionDirectiveKind,
812};
813
814enum ZigClangExpr_ConstExprUsage {
815 ZigClangExpr_EvaluateForCodeGen,
816 ZigClangExpr_EvaluateForMangling,
817};
818
793ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const struct ZigClangSourceManager *,819ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const struct ZigClangSourceManager *,
794 struct ZigClangSourceLocation Loc);820 struct ZigClangSourceLocation Loc);
795ZIG_EXTERN_C const char *ZigClangSourceManager_getFilename(const struct ZigClangSourceManager *,821ZIG_EXTERN_C const char *ZigClangSourceManager_getFilename(const struct ZigClangSourceManager *,
...@@ -814,6 +840,13 @@ ZIG_EXTERN_C struct ZigClangASTContext *ZigClangASTUnit_getASTContext(struct Zig...@@ -814,6 +840,13 @@ ZIG_EXTERN_C struct ZigClangASTContext *ZigClangASTUnit_getASTContext(struct Zig
814ZIG_EXTERN_C struct ZigClangSourceManager *ZigClangASTUnit_getSourceManager(struct ZigClangASTUnit *);840ZIG_EXTERN_C struct ZigClangSourceManager *ZigClangASTUnit_getSourceManager(struct ZigClangASTUnit *);
815ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(struct ZigClangASTUnit *, void *context,841ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(struct ZigClangASTUnit *, void *context,
816 bool (*Fn)(void *context, const struct ZigClangDecl *decl));842 bool (*Fn)(void *context, const struct ZigClangDecl *decl));
843ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_begin(struct ZigClangASTUnit *);
844ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_end(struct ZigClangASTUnit *);
845
846ZIG_EXTERN_C struct ZigClangPreprocessedEntity *ZigClangPreprocessingRecord_iterator_deref(
847 struct ZigClangPreprocessingRecord_iterator);
848
849ZIG_EXTERN_C enum ZigClangPreprocessedEntity_EntityKind ZigClangPreprocessedEntity_getKind(const struct ZigClangPreprocessedEntity *);
817850
818ZIG_EXTERN_C const struct ZigClangRecordDecl *ZigClangRecordType_getDecl(const struct ZigClangRecordType *record_ty);851ZIG_EXTERN_C const struct ZigClangRecordDecl *ZigClangRecordType_getDecl(const struct ZigClangRecordType *record_ty);
819ZIG_EXTERN_C const struct ZigClangEnumDecl *ZigClangEnumType_getDecl(const struct ZigClangEnumType *record_ty);852ZIG_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,8 +873,22 @@ ZIG_EXTERN_C const struct ZigClangStmt *ZigClangFunctionDecl_getBody(const struc
840ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const struct ZigClangRecordDecl *record_decl);873ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const struct ZigClangRecordDecl *record_decl);
841ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const struct ZigClangRecordDecl *record_decl);874ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const struct ZigClangRecordDecl *record_decl);
842ZIG_EXTERN_C bool ZigClangRecordDecl_isAnonymousStructOrUnion(const struct ZigClangRecordDecl *record_decl);875ZIG_EXTERN_C bool ZigClangRecordDecl_isAnonymousStructOrUnion(const struct ZigClangRecordDecl *record_decl);
876ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_begin(const struct ZigClangRecordDecl *);
877ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_end(const struct ZigClangRecordDecl *);
878ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_iterator_next(struct ZigClangRecordDecl_field_iterator);
879ZIG_EXTERN_C const struct ZigClangFieldDecl * ZigClangRecordDecl_field_iterator_deref(struct ZigClangRecordDecl_field_iterator);
880ZIG_EXTERN_C bool ZigClangRecordDecl_field_iterator_neq(
881 struct ZigClangRecordDecl_field_iterator a,
882 struct ZigClangRecordDecl_field_iterator b);
843883
844ZIG_EXTERN_C struct ZigClangQualType ZigClangEnumDecl_getIntegerType(const struct ZigClangEnumDecl *);884ZIG_EXTERN_C struct ZigClangQualType ZigClangEnumDecl_getIntegerType(const struct ZigClangEnumDecl *);
885ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_begin(const struct ZigClangEnumDecl *);
886ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_end(const struct ZigClangEnumDecl *);
887ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_iterator_next(struct ZigClangEnumDecl_enumerator_iterator);
888ZIG_EXTERN_C const struct ZigClangEnumConstantDecl * ZigClangEnumDecl_enumerator_iterator_deref(struct ZigClangEnumDecl_enumerator_iterator);
889ZIG_EXTERN_C bool ZigClangEnumDecl_enumerator_iterator_neq(
890 struct ZigClangEnumDecl_enumerator_iterator a,
891 struct ZigClangEnumDecl_enumerator_iterator b);
845892
846ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const struct ZigClangDecl *decl);893ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const struct ZigClangDecl *decl);
847ZIG_EXTERN_C enum ZigClangDeclKind ZigClangDecl_getKind(const struct ZigClangDecl *decl);894ZIG_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,6 +897,12 @@ ZIG_EXTERN_C const char *ZigClangDecl_getDeclKindName(const struct ZigClangDecl
850ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *);897ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *);
851ZIG_EXTERN_C const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *var_decl);898ZIG_EXTERN_C const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *var_decl);
852ZIG_EXTERN_C enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const struct ZigClangVarDecl *var_decl);899ZIG_EXTERN_C enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const struct ZigClangVarDecl *var_decl);
900ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *);
901ZIG_EXTERN_C bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *);
902ZIG_EXTERN_C bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *);
903ZIG_EXTERN_C bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *);
904ZIG_EXTERN_C const struct ZigClangAPValue *ZigClangVarDecl_evaluateValue(const struct ZigClangVarDecl *);
905ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *);
853906
854ZIG_EXTERN_C bool ZigClangSourceLocation_eq(struct ZigClangSourceLocation a, struct ZigClangSourceLocation b);907ZIG_EXTERN_C bool ZigClangSourceLocation_eq(struct ZigClangSourceLocation a, struct ZigClangSourceLocation b);
855908
...@@ -869,6 +922,7 @@ ZIG_EXTERN_C enum ZigClangTypeClass ZigClangType_getTypeClass(const struct ZigCl...@@ -869,6 +922,7 @@ ZIG_EXTERN_C enum ZigClangTypeClass ZigClangType_getTypeClass(const struct ZigCl
869ZIG_EXTERN_C struct ZigClangQualType ZigClangType_getPointeeType(const struct ZigClangType *self);922ZIG_EXTERN_C struct ZigClangQualType ZigClangType_getPointeeType(const struct ZigClangType *self);
870ZIG_EXTERN_C bool ZigClangType_isVoidType(const struct ZigClangType *self);923ZIG_EXTERN_C bool ZigClangType_isVoidType(const struct ZigClangType *self);
871ZIG_EXTERN_C const char *ZigClangType_getTypeClassName(const struct ZigClangType *self);924ZIG_EXTERN_C const char *ZigClangType_getTypeClassName(const struct ZigClangType *self);
925ZIG_EXTERN_C const struct ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const struct ZigClangType *self);
872926
873ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangStmt_getBeginLoc(const struct ZigClangStmt *self);927ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangStmt_getBeginLoc(const struct ZigClangStmt *self);
874ZIG_EXTERN_C enum ZigClangStmtClass ZigClangStmt_getStmtClass(const struct ZigClangStmt *self);928ZIG_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,6 +933,10 @@ ZIG_EXTERN_C struct ZigClangQualType ZigClangExpr_getType(const struct ZigClangE
879ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangExpr_getBeginLoc(const struct ZigClangExpr *self);933ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangExpr_getBeginLoc(const struct ZigClangExpr *self);
880ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsBooleanCondition(const struct ZigClangExpr *self,934ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsBooleanCondition(const struct ZigClangExpr *self,
881 bool *result, const struct ZigClangASTContext *ctx, bool in_constant_context);935 bool *result, const struct ZigClangASTContext *ctx, bool in_constant_context);
936ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsFloat(const struct ZigClangExpr *self,
937 ZigClangAPFloat **result, const struct ZigClangASTContext *ctx);
938ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsConstantExpr(const struct ZigClangExpr *,
939 struct ZigClangExprEvalResult *, ZigClangExpr_ConstExprUsage, const struct ZigClangASTContext *);
882940
883ZIG_EXTERN_C enum ZigClangAPValueKind ZigClangAPValue_getKind(const struct ZigClangAPValue *self);941ZIG_EXTERN_C enum ZigClangAPValueKind ZigClangAPValue_getKind(const struct ZigClangAPValue *self);
884ZIG_EXTERN_C const struct ZigClangAPSInt *ZigClangAPValue_getInt(const struct ZigClangAPValue *self);942ZIG_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,4 +1089,15 @@ ZIG_EXTERN_C const struct ZigClangStmt *ZigClangCaseStmt_getSubStmt(const struct
1031ZIG_EXTERN_C const struct ZigClangStmt *ZigClangDefaultStmt_getSubStmt(const struct ZigClangDefaultStmt *);1089ZIG_EXTERN_C const struct ZigClangStmt *ZigClangDefaultStmt_getSubStmt(const struct ZigClangDefaultStmt *);
10321090
1033ZIG_EXTERN_C const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangParenExpr *);1091ZIG_EXTERN_C const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangParenExpr *);
1092
1093ZIG_EXTERN_C const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *);
1094ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getBegin(const struct ZigClangMacroDefinitionRecord *);
1095ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getEnd(const struct ZigClangMacroDefinitionRecord *);
1096
1097ZIG_EXTERN_C bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *);
1098ZIG_EXTERN_C struct ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *);
1099ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *);
1100
1101ZIG_EXTERN_C const struct ZigClangExpr *ZigClangEnumConstantDecl_getInitExpr(const struct ZigClangEnumConstantDecl *);
1102ZIG_EXTERN_C const struct ZigClangAPSInt *ZigClangEnumConstantDecl_getInitVal(const struct ZigClangEnumConstantDecl *);
1034#endif1103#endif