diff --git a/src/translate_c.cpp b/src/translate_c.cpp index 660b3ad7d1..203d186b90 100644 --- a/src/translate_c.cpp +++ b/src/translate_c.cpp @@ -14,19 +14,6 @@ #include "parser.hpp" #include "zig_clang.h" -#if __GNUC__ >= 8 -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wclass-memaccess" -#endif - -#include -#include -#include - -#if __GNUC__ >= 8 -#pragma GCC diagnostic pop -#endif - #include struct Alias { @@ -129,37 +116,6 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC ZigClangSourceLocation source_loc); static bool c_is_unsigned_integer(Context *c, ZigClangQualType qt); -static const ZigClangAPSInt *bitcast(const llvm::APSInt *src) { - return reinterpret_cast(src); -} - -static const ZigClangAPValue *bitcast(const clang::APValue *src) { - return reinterpret_cast(src); -} - -//static const ZigClangStmt *bitcast(const clang::Stmt *src) { -// return reinterpret_cast(src); -//} - -static const ZigClangExpr *bitcast(const clang::Expr *src) { - return reinterpret_cast(src); -} - -static ZigClangSourceLocation bitcast(clang::SourceLocation src) { - ZigClangSourceLocation dest; - memcpy(&dest, static_cast(&src), sizeof(ZigClangSourceLocation)); - return dest; -} -static ZigClangQualType bitcast(clang::QualType src) { - ZigClangQualType dest; - memcpy(&dest, static_cast(&src), sizeof(ZigClangQualType)); - return dest; -} -//static clang::QualType bitcast(ZigClangQualType src) { -// clang::QualType dest; -// memcpy(&dest, static_cast(&src), sizeof(ZigClangQualType)); -// return dest; -//} ATTRIBUTE_PRINTF(3, 4) 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 return node; } -static AstNode *trans_create_node_apfloat(Context *c, const llvm::APFloat &ap_float) { +static AstNode *trans_create_node_apfloat(Context *c, const ZigClangAPFloat *ap_float) { uint8_t buf[128]; - size_t written = ap_float.convertToHexString((char *)buf, 0, false, - llvm::APFloat::rmNearestTiesToEven); + size_t written = ZigClangAPFloat_convertToHexString(ap_float, (char *)buf, 0, false, + ZigClangAPFloat_roundingMode_NearestTiesToEven); AstNode *node = trans_create_node(c, NodeTypeFloatLiteral); node->data.float_literal.bigfloat = allocate(1); 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 if (record_def == nullptr) { return true; } - for (auto it = reinterpret_cast(record_def)->field_begin(), - it_end = reinterpret_cast(record_def)->field_end(); - it != it_end; ++it) + for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def), + it_end = ZigClangRecordDecl_field_end(record_def); + ZigClangRecordDecl_field_iterator_neq(it, it_end); + it = ZigClangRecordDecl_field_iterator_next(it)) { - const clang::FieldDecl *field_decl = *it; + const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it); - if (field_decl->isBitField()) { + if (ZigClangFieldDecl_isBitField(field_decl)) { return true; } } @@ -1393,8 +1350,8 @@ static AstNode *trans_integer_literal(Context *c, ResultUsed result_used, const } static AstNode *trans_floating_literal(Context *c, ResultUsed result_used, const ZigClangFloatingLiteral *stmt) { - llvm::APFloat result{0.0f}; - if (!reinterpret_cast(stmt)->EvaluateAsFloat(result, *reinterpret_cast(c->ctx))) { + ZigClangAPFloat *result; + if (!ZigClangExpr_EvaluateAsFloat((const ZigClangExpr *)stmt, &result, c->ctx)) { emit_warning(c, ZigClangExpr_getBeginLoc((ZigClangExpr*)stmt), "invalid floating literal"); return nullptr; } @@ -1434,15 +1391,14 @@ static AstNode *trans_character_literal(Context *c, ResultUsed result_used, cons static AstNode *trans_constant_expr(Context *c, ResultUsed result_used, const ZigClangConstantExpr *expr) { const ZigClangExpr *as_expr = reinterpret_cast(expr); - clang::Expr::EvalResult result; - if (!reinterpret_cast(expr)->EvaluateAsConstantExpr(result, - clang::Expr::EvaluateForCodeGen, - *reinterpret_cast(c->ctx))) + ZigClangExprEvalResult result; + if (!ZigClangExpr_EvaluateAsConstantExpr((const ZigClangExpr *)expr, &result, + ZigClangExpr_EvaluateForCodeGen, c->ctx)) { emit_warning(c, ZigClangExpr_getBeginLoc(as_expr), "invalid constant expression"); return nullptr; } - AstNode *node = trans_ap_value(c, bitcast(&result.Val), ZigClangExpr_getType(as_expr), + AstNode *node = trans_ap_value(c, &result.Val, ZigClangExpr_getType(as_expr), ZigClangExpr_getBeginLoc(as_expr)); return maybe_suppress_result(c, result_used, node); } @@ -2452,16 +2408,18 @@ static int trans_local_declaration(Context *c, TransScope *scope, const ZigClang TransScopeBlock *scope_block = trans_scope_block_find(scope); assert(scope_block != nullptr); - for (auto iter = reinterpret_cast(stmt)->decl_begin(); - iter != reinterpret_cast(stmt)->decl_end(); iter++) { - ZigClangDecl *decl = reinterpret_cast(*iter); + for (ZigClangDeclStmt_const_decl_iterator iter = ZigClangDeclStmt_decl_begin(stmt), + iter_end = ZigClangDeclStmt_decl_end(stmt); + iter != iter_end; ++iter) + { + ZigClangDecl *decl = *iter; switch (ZigClangDecl_getKind(decl)) { case ZigClangDeclVar: { - clang::VarDecl *var_decl = (clang::VarDecl *)decl; - ZigClangQualType qual_type = bitcast(var_decl->getTypeSourceInfo()->getType()); + ZigClangVarDecl *var_decl = (ZigClangVarDecl *)decl; + ZigClangQualType qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl); AstNode *init_node = nullptr; - if (var_decl->hasInit()) { - init_node = trans_expr(c, ResultUsedYes, scope, bitcast(var_decl->getInit()), TransRValue); + if (ZigClangVarDecl_hasInit(var_decl)) { + init_node = trans_expr(c, ResultUsedYes, scope, ZigClangVarDecl_getInit(var_decl), TransRValue); if (init_node == nullptr) return ErrorUnexpected; @@ -4317,12 +4275,13 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl) bool pure_enum = true; uint32_t field_count = 0; - for (auto it = reinterpret_cast(enum_def)->enumerator_begin(), - it_end = reinterpret_cast(enum_def)->enumerator_end(); - it != it_end; ++it, field_count += 1) + for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def), + it_end = ZigClangEnumDecl_enumerator_end(enum_def); + ZigClangEnumDecl_enumerator_iterator_neq(it, it_end); + it = ZigClangEnumDecl_enumerator_iterator_next(it), field_count += 1) { - const clang::EnumConstantDecl *enum_const = *it; - if (enum_const->getInitExpr()) { + const ZigClangEnumConstantDecl *enum_const = ZigClangEnumDecl_enumerator_iterator_deref(it); + if (ZigClangEnumConstantDecl_getInitExpr(enum_const)) { pure_enum = false; } } @@ -4343,11 +4302,12 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl) } enum_node->data.container_decl.fields.resize(field_count); uint32_t i = 0; - for (auto it = reinterpret_cast(enum_def)->enumerator_begin(), - it_end = reinterpret_cast(enum_def)->enumerator_end(); - it != it_end; ++it, i += 1) + for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def), + it_end = ZigClangEnumDecl_enumerator_end(enum_def); + ZigClangEnumDecl_enumerator_iterator_neq(it, it_end); + it = ZigClangEnumDecl_enumerator_iterator_next(it), i += 1) { - const clang::EnumConstantDecl *enum_const = *it; + const ZigClangEnumConstantDecl *enum_const = ZigClangEnumDecl_enumerator_iterator_deref(it); Buf *enum_val_name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)enum_const)); Buf *field_name; @@ -4358,7 +4318,7 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl) } AstNode *int_node = pure_enum && !is_anonymous ? - nullptr : trans_create_node_apint(c, bitcast(&enum_const->getInitVal())); + nullptr : trans_create_node_apint(c, ZigClangEnumConstantDecl_getInitVal(enum_const)); AstNode *field_node = trans_create_node(c, NodeTypeStructField); field_node->data.struct_field.name = field_name; field_node->data.struct_field.type = nullptr; @@ -4438,15 +4398,16 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record // count fields and validate uint32_t field_count = 0; - for (auto it = reinterpret_cast(record_def)->field_begin(), - it_end = reinterpret_cast(record_def)->field_end(); - it != it_end; ++it, field_count += 1) + for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def), + it_end = ZigClangRecordDecl_field_end(record_def); + ZigClangRecordDecl_field_iterator_neq(it, it_end); + it = ZigClangRecordDecl_field_iterator_next(it), field_count += 1) { - const clang::FieldDecl *field_decl = *it; + const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it); - if (field_decl->isBitField()) { - emit_warning(c, bitcast(field_decl->getLocation()), "%s %s demoted to opaque type - has bitfield", - container_kind_name, + if (ZigClangFieldDecl_isBitField(field_decl)) { + emit_warning(c, ZigClangFieldDecl_getLocation(field_decl), + "%s %s demoted to opaque type - has bitfield", container_kind_name, is_anonymous ? "(anon)" : buf_ptr(bare_name)); return demote_struct_to_opaque(c, record_decl, full_type_name, bare_name); } @@ -4468,19 +4429,20 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record } uint32_t i = 0; - for (auto it = reinterpret_cast(record_def)->field_begin(), - it_end = reinterpret_cast(record_def)->field_end(); - it != it_end; ++it, i += 1) + for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def), + it_end = ZigClangRecordDecl_field_end(record_def); + ZigClangRecordDecl_field_iterator_neq(it, it_end); + it = ZigClangRecordDecl_field_iterator_next(it), i += 1) { - const clang::FieldDecl *field_decl = *it; + const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it); AstNode *field_node = trans_create_node(c, NodeTypeStructField); field_node->data.struct_field.name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)field_decl)); - field_node->data.struct_field.type = trans_qual_type(c, bitcast(field_decl->getType()), - bitcast(field_decl->getLocation())); + field_node->data.struct_field.type = trans_qual_type(c, ZigClangFieldDecl_getType(field_decl), + ZigClangFieldDecl_getLocation(field_decl)); if (field_node->data.struct_field.type == nullptr) { - emit_warning(c, bitcast(field_decl->getLocation()), + emit_warning(c, ZigClangFieldDecl_getLocation(field_decl), "%s %s demoted to opaque type - unresolved type", container_kind_name, is_anonymous ? "(anon)" : buf_ptr(bare_name)); @@ -4522,8 +4484,8 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC init_node->data.container_init_expr.type = arr_type_node; init_node->data.container_init_expr.kind = ContainerInitKindArray; - const clang::Type *qt_type = reinterpret_cast(ZigClangQualType_getTypePtr(qt)); - ZigClangQualType child_qt = bitcast(qt_type->getAsArrayTypeUnsafe()->getElementType()); + const ZigClangType *qt_type = ZigClangQualType_getTypePtr(qt); + ZigClangQualType child_qt = ZigClangArrayType_getElementType(ZigClangType_getAsArrayTypeUnsafe(qt_type)); for (size_t i = 0; i < init_count; i += 1) { 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 if (const ZigClangExpr *expr = ZigClangAPValueLValueBase_dyn_cast_Expr(lval_base)) { return trans_expr(c, ResultUsedYes, &c->global_scope->base, expr, TransRValue); } - //const clang::ValueDecl *value_decl = lval_base.get(); - emit_warning(c, source_loc, "TODO handle initializer LValue clang::ValueDecl"); + emit_warning(c, source_loc, "TODO handle initializer LValue ValueDecl"); return nullptr; } case ZigClangAPValueFloat: @@ -4607,43 +4568,43 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC zig_unreachable(); } -static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) { +static void visit_var_decl(Context *c, const ZigClangVarDecl *var_decl) { Buf *name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)var_decl)); - switch (var_decl->getTLSKind()) { - case clang::VarDecl::TLS_None: + switch (ZigClangVarDecl_getTLSKind(var_decl)) { + case ZigClangVarDecl_TLSKind_None: break; - case clang::VarDecl::TLS_Static: - emit_warning(c, bitcast(var_decl->getLocation()), + case ZigClangVarDecl_TLSKind_Static: + emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - static thread local storage", buf_ptr(name)); return; - case clang::VarDecl::TLS_Dynamic: - emit_warning(c, bitcast(var_decl->getLocation()), + case ZigClangVarDecl_TLSKind_Dynamic: + emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - dynamic thread local storage", buf_ptr(name)); return; } - ZigClangQualType qt = bitcast(var_decl->getType()); - AstNode *var_type = trans_qual_type(c, qt, bitcast(var_decl->getLocation())); + ZigClangQualType qt = ZigClangVarDecl_getType(var_decl); + AstNode *var_type = trans_qual_type(c, qt, ZigClangVarDecl_getLocation(var_decl)); if (var_type == nullptr) { - emit_warning(c, bitcast(var_decl->getLocation()), "ignoring variable '%s' - unresolved type", buf_ptr(name)); + emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - unresolved type", buf_ptr(name)); return; } - bool is_extern = var_decl->hasExternalStorage(); - bool is_static = var_decl->isFileVarDecl(); + bool is_extern = ZigClangVarDecl_hasExternalStorage(var_decl); + bool is_static = ZigClangVarDecl_isFileVarDecl(var_decl); bool is_const = ZigClangQualType_isConstQualified(qt); if (is_static && !is_extern) { AstNode *init_node; - if (var_decl->hasInit()) { - const ZigClangAPValue *ap_value = bitcast(var_decl->evaluateValue()); + if (ZigClangVarDecl_hasInit(var_decl)) { + const ZigClangAPValue *ap_value = ZigClangVarDecl_evaluateValue(var_decl); if (ap_value == nullptr) { - emit_warning(c, bitcast(var_decl->getLocation()), + emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - unable to evaluate initializer", buf_ptr(name)); return; } - init_node = trans_ap_value(c, ap_value, qt, bitcast(var_decl->getLocation())); + init_node = trans_ap_value(c, ap_value, qt, ZigClangVarDecl_getLocation(var_decl)); if (init_node == nullptr) return; } else { @@ -4662,7 +4623,7 @@ static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) { return; } - emit_warning(c, bitcast(var_decl->getLocation()), + emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - non-extern, non-static variable", buf_ptr(name)); return; } @@ -4684,7 +4645,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *decl) { resolve_record_decl(c, reinterpret_cast(decl)); break; case ZigClangDeclVar: - visit_var_decl(c, reinterpret_cast(decl)); + visit_var_decl(c, reinterpret_cast(decl)); break; default: 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 c->macro_table.put(name, result_node); } -static void process_preprocessor_entities(Context *c, ZigClangASTUnit *zunit) { - clang::ASTUnit *unit = reinterpret_cast(zunit); +static void process_preprocessor_entities(Context *c, ZigClangASTUnit *unit) { CTokenize ctok = {{0}}; // TODO if we see #undef, delete it from the table + for (ZigClangPreprocessingRecord_iterator it = ZigClangASTUnit_getLocalPreprocessingEntities_begin(unit), + it_end = ZigClangASTUnit_getLocalPreprocessingEntities_end(unit); it.I != it_end.I; it.I += 1) + { + ZigClangPreprocessedEntity *entity = ZigClangPreprocessingRecord_iterator_deref(it); - for (clang::PreprocessedEntity *entity : unit->getLocalPreprocessingEntities()) { - switch (entity->getKind()) { - case clang::PreprocessedEntity::InvalidKind: - case clang::PreprocessedEntity::InclusionDirectiveKind: - case clang::PreprocessedEntity::MacroExpansionKind: + switch (ZigClangPreprocessedEntity_getKind(entity)) { + case ZigClangPreprocessedEntity_InvalidKind: + case ZigClangPreprocessedEntity_InclusionDirectiveKind: + case ZigClangPreprocessedEntity_MacroExpansionKind: continue; - case clang::PreprocessedEntity::MacroDefinitionKind: + case ZigClangPreprocessedEntity_MacroDefinitionKind: { - clang::MacroDefinitionRecord *macro = static_cast(entity); - const char *raw_name = macro->getName()->getNameStart(); - clang::SourceRange range = macro->getSourceRange(); - ZigClangSourceLocation begin_loc = bitcast(range.getBegin()); - ZigClangSourceLocation end_loc = bitcast(range.getEnd()); + ZigClangMacroDefinitionRecord *macro = reinterpret_cast(entity); + const char *raw_name = ZigClangMacroDefinitionRecord_getName_getNameStart(macro); + ZigClangSourceLocation begin_loc = ZigClangMacroDefinitionRecord_getSourceRange_getBegin(macro); + ZigClangSourceLocation end_loc = ZigClangMacroDefinitionRecord_getSourceRange_getEnd(macro); if (ZigClangSourceLocation_eq(begin_loc, end_loc)) { // this means it is a macro without a value diff --git a/src/zig_clang.cpp b/src/zig_clang.cpp index 2cf8ebc462..1025216dc9 100644 --- a/src/zig_clang.cpp +++ b/src/zig_clang.cpp @@ -1346,6 +1346,31 @@ static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Enum == clang::ETK_Enum, static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Typename == clang::ETK_Typename, ""); static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_None == clang::ETK_None, ""); +void ZigClang_detect_enum_EntityKind(clang::PreprocessedEntity::EntityKind x) { + switch (x) { + case clang::PreprocessedEntity::InvalidKind: + case clang::PreprocessedEntity::MacroExpansionKind: + case clang::PreprocessedEntity::MacroDefinitionKind: + case clang::PreprocessedEntity::InclusionDirectiveKind: + break; + } +} +static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InvalidKind == clang::PreprocessedEntity::InvalidKind, ""); +static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroExpansionKind == clang::PreprocessedEntity::MacroExpansionKind, ""); +static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroDefinitionKind == clang::PreprocessedEntity::MacroDefinitionKind, ""); +static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InclusionDirectiveKind == clang::PreprocessedEntity::InclusionDirectiveKind, ""); + + +void ZigClang_detect_enum_ConstExprUsage(clang::Expr::ConstExprUsage x) { + switch (x) { + case clang::Expr::EvaluateForCodeGen: + case clang::Expr::EvaluateForMangling: + break; + } +} +static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForCodeGen == clang::Expr::EvaluateForCodeGen, ""); +static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForMangling == clang::Expr::EvaluateForMangling, ""); + static_assert(sizeof(ZigClangAPValue) == sizeof(clang::APValue), ""); @@ -1406,6 +1431,43 @@ static ZigClangDeclStmt_const_decl_iterator bitcast(clang::DeclStmt::const_decl_ return dest; } +static_assert(sizeof(ZigClangPreprocessingRecord_iterator) == sizeof(clang::PreprocessingRecord::iterator), ""); +static ZigClangPreprocessingRecord_iterator bitcast(clang::PreprocessingRecord::iterator src) { + ZigClangPreprocessingRecord_iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangPreprocessingRecord_iterator)); + return dest; +} +static clang::PreprocessingRecord::iterator bitcast(ZigClangPreprocessingRecord_iterator src) { + clang::PreprocessingRecord::iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangPreprocessingRecord_iterator)); + return dest; +} + +static_assert(sizeof(ZigClangRecordDecl_field_iterator) == sizeof(clang::RecordDecl::field_iterator), ""); +static ZigClangRecordDecl_field_iterator bitcast(clang::RecordDecl::field_iterator src) { + ZigClangRecordDecl_field_iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangRecordDecl_field_iterator)); + return dest; +} +static clang::RecordDecl::field_iterator bitcast(ZigClangRecordDecl_field_iterator src) { + clang::RecordDecl::field_iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangRecordDecl_field_iterator)); + return dest; +} + +static_assert(sizeof(ZigClangEnumDecl_enumerator_iterator) == sizeof(clang::EnumDecl::enumerator_iterator), ""); +static ZigClangEnumDecl_enumerator_iterator bitcast(clang::EnumDecl::enumerator_iterator src) { + ZigClangEnumDecl_enumerator_iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangEnumDecl_enumerator_iterator)); + return dest; +} +static clang::EnumDecl::enumerator_iterator bitcast(ZigClangEnumDecl_enumerator_iterator src) { + clang::EnumDecl::enumerator_iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangEnumDecl_enumerator_iterator)); + return dest; +} + + ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const ZigClangSourceManager *self, ZigClangSourceLocation Loc) { @@ -1462,6 +1524,28 @@ bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *self, void *contex reinterpret_cast(Fn)); } +struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_begin( + struct ZigClangASTUnit *self) +{ + auto casted = reinterpret_cast(self); + return bitcast(casted->getLocalPreprocessingEntities().begin()); +} + +struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_end( + struct ZigClangASTUnit *self) +{ + auto casted = reinterpret_cast(self); + return bitcast(casted->getLocalPreprocessingEntities().end()); +} + +struct ZigClangPreprocessedEntity *ZigClangPreprocessingRecord_iterator_deref( + struct ZigClangPreprocessingRecord_iterator self) +{ + clang::PreprocessingRecord::iterator casted = bitcast(self); + clang::PreprocessedEntity *result = *casted; + return reinterpret_cast(result); +} + const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *record_ty) { const clang::RecordDecl *record_decl = reinterpret_cast(record_ty)->getDecl(); return reinterpret_cast(record_decl); @@ -1674,6 +1758,12 @@ const char *ZigClangType_getTypeClassName(const ZigClangType *self) { return casted->getTypeClassName(); } +const ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const ZigClangType *self) { + auto casted = reinterpret_cast(self); + const clang::ArrayType *result = casted->getAsArrayTypeUnsafe(); + return reinterpret_cast(result); +} + ZigClangSourceLocation ZigClangStmt_getBeginLoc(const ZigClangStmt *self) { auto casted = reinterpret_cast(self); return bitcast(casted->getBeginLoc()); @@ -1712,6 +1802,29 @@ bool ZigClangExpr_EvaluateAsBooleanCondition(const ZigClangExpr *self, bool *res return casted->EvaluateAsBooleanCondition(*result, *casted_ctx, in_constant_context); } +bool ZigClangExpr_EvaluateAsFloat(const ZigClangExpr *self, ZigClangAPFloat **result, + const struct ZigClangASTContext *ctx) +{ + llvm::APFloat *ap_float = new llvm::APFloat(0.0f); + *result = reinterpret_cast(ap_float); + auto casted = reinterpret_cast(self); + auto casted_ctx = reinterpret_cast(ctx); + return casted->EvaluateAsFloat(*ap_float, *casted_ctx); +} + +bool ZigClangExpr_EvaluateAsConstantExpr(const ZigClangExpr *self, ZigClangExprEvalResult *result, + ZigClangExpr_ConstExprUsage usage, const struct ZigClangASTContext *ctx) +{ + auto casted_self = reinterpret_cast(self); + auto casted_ctx = reinterpret_cast(ctx); + clang::Expr::EvalResult eval_result; + if (!casted_self->EvaluateAsConstantExpr(eval_result, (clang::Expr::ConstExprUsage)usage, *casted_ctx)) { + return false; + } + *result = bitcast(eval_result); + return true; +} + ZigClangAPValueKind ZigClangAPValue_getKind(const ZigClangAPValue *self) { auto casted = reinterpret_cast(self); return (ZigClangAPValueKind)casted->getKind(); @@ -1911,6 +2024,11 @@ struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *se return bitcast(casted->getType()); } +struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getTypeSourceInfo()->getType()); +} + const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *self) { auto casted = reinterpret_cast(self); return reinterpret_cast(casted->getInit()); @@ -1921,6 +2039,32 @@ enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const ZigClangVarDecl *s return (ZigClangVarDecl_TLSKind)casted->getTLSKind(); } +struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getLocation()); +} + +bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return casted->hasExternalStorage(); +} + +bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return casted->isFileVarDecl(); +} + +bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return casted->hasInit(); +} + +const ZigClangAPValue * ZigClangVarDecl_evaluateValue(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + const clang::APValue *result = casted->evaluateValue(); + return reinterpret_cast(result); +} + enum ZigClangBuiltinTypeKind ZigClangBuiltinType_getKind(const struct ZigClangBuiltinType *self) { auto casted = reinterpret_cast(self); return (ZigClangBuiltinTypeKind)casted->getKind(); @@ -2396,3 +2540,122 @@ const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangPar auto casted = reinterpret_cast(self); return reinterpret_cast(casted->getSubExpr()); } + +enum ZigClangPreprocessedEntity_EntityKind ZigClangPreprocessedEntity_getKind( + const struct ZigClangPreprocessedEntity *self) +{ + auto casted = reinterpret_cast(self); + return (ZigClangPreprocessedEntity_EntityKind)casted->getKind(); +} + +const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *self) { + auto casted = reinterpret_cast(self); + return casted->getName()->getNameStart(); +} + +struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getBegin(const struct ZigClangMacroDefinitionRecord *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getSourceRange().getBegin()); +} + +struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getEnd(const struct ZigClangMacroDefinitionRecord *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getSourceRange().getEnd()); +} + +ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_begin(const struct ZigClangRecordDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->field_begin()); +} + +ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_end(const struct ZigClangRecordDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->field_end()); +} + +bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *self) { + auto casted = reinterpret_cast(self); + return casted->isBitField(); +} + +ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getLocation()); +} + +ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getType()); +} + +ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_iterator_next( + struct ZigClangRecordDecl_field_iterator self) +{ + clang::RecordDecl::field_iterator casted = bitcast(self); + ++casted; + return bitcast(casted); +} + +const struct ZigClangFieldDecl * ZigClangRecordDecl_field_iterator_deref( + struct ZigClangRecordDecl_field_iterator self) +{ + clang::RecordDecl::field_iterator casted = bitcast(self); + const clang::FieldDecl *result = *casted; + return reinterpret_cast(result); +} + +bool ZigClangRecordDecl_field_iterator_neq( + struct ZigClangRecordDecl_field_iterator a, + struct ZigClangRecordDecl_field_iterator b) +{ + clang::RecordDecl::field_iterator casted_a = bitcast(a); + clang::RecordDecl::field_iterator casted_b = bitcast(b); + return casted_a != casted_b; +} + +ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_begin(const struct ZigClangEnumDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->enumerator_begin()); +} + +ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_end(const struct ZigClangEnumDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->enumerator_end()); +} + +ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_iterator_next( + struct ZigClangEnumDecl_enumerator_iterator self) +{ + clang::EnumDecl::enumerator_iterator casted = bitcast(self); + ++casted; + return bitcast(casted); +} + +const struct ZigClangEnumConstantDecl * ZigClangEnumDecl_enumerator_iterator_deref( + struct ZigClangEnumDecl_enumerator_iterator self) +{ + clang::EnumDecl::enumerator_iterator casted = bitcast(self); + const clang::EnumConstantDecl *result = *casted; + return reinterpret_cast(result); +} + +bool ZigClangEnumDecl_enumerator_iterator_neq( + struct ZigClangEnumDecl_enumerator_iterator a, + struct ZigClangEnumDecl_enumerator_iterator b) +{ + clang::EnumDecl::enumerator_iterator casted_a = bitcast(a); + clang::EnumDecl::enumerator_iterator casted_b = bitcast(b); + return casted_a != casted_b; +} + +const struct ZigClangExpr *ZigClangEnumConstantDecl_getInitExpr(const struct ZigClangEnumConstantDecl *self) { + auto casted = reinterpret_cast(self); + const clang::Expr *result = casted->getInitExpr(); + return reinterpret_cast(result); +} + +const struct ZigClangAPSInt *ZigClangEnumConstantDecl_getInitVal(const struct ZigClangEnumConstantDecl *self) { + auto casted = reinterpret_cast(self); + const llvm::APSInt *result = &casted->getInitVal(); + return reinterpret_cast(result); +} diff --git a/src/zig_clang.h b/src/zig_clang.h index 474ec57baf..baa0105553 100644 --- a/src/zig_clang.h +++ b/src/zig_clang.h @@ -122,6 +122,7 @@ struct ZigClangParmVarDecl; struct ZigClangPointerType; struct ZigClangPredefinedExpr; struct ZigClangPreprocessedEntity; +struct ZigClangPreprocessingRecord; struct ZigClangRecordDecl; struct ZigClangRecordType; struct ZigClangReturnStmt; @@ -146,6 +147,19 @@ struct ZigClangWhileStmt; typedef struct ZigClangStmt *const * ZigClangCompoundStmt_const_body_iterator; typedef struct ZigClangDecl *const * ZigClangDeclStmt_const_decl_iterator; +struct ZigClangRecordDecl_field_iterator { + void *opaque; +}; + +struct ZigClangEnumDecl_enumerator_iterator { + void *opaque; +}; + +struct ZigClangPreprocessingRecord_iterator { + int I; + struct ZigClangPreprocessingRecord *Self; +}; + enum ZigClangBO { ZigClangBO_PtrMemD, ZigClangBO_PtrMemI, @@ -790,6 +804,18 @@ enum ZigClangElaboratedTypeKeyword { ZigClangETK_None, }; +enum ZigClangPreprocessedEntity_EntityKind { + ZigClangPreprocessedEntity_InvalidKind, + ZigClangPreprocessedEntity_MacroExpansionKind, + ZigClangPreprocessedEntity_MacroDefinitionKind, + ZigClangPreprocessedEntity_InclusionDirectiveKind, +}; + +enum ZigClangExpr_ConstExprUsage { + ZigClangExpr_EvaluateForCodeGen, + ZigClangExpr_EvaluateForMangling, +}; + ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const struct ZigClangSourceManager *, struct ZigClangSourceLocation Loc); ZIG_EXTERN_C const char *ZigClangSourceManager_getFilename(const struct ZigClangSourceManager *, @@ -814,6 +840,13 @@ ZIG_EXTERN_C struct ZigClangASTContext *ZigClangASTUnit_getASTContext(struct Zig ZIG_EXTERN_C struct ZigClangSourceManager *ZigClangASTUnit_getSourceManager(struct ZigClangASTUnit *); ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(struct ZigClangASTUnit *, void *context, bool (*Fn)(void *context, const struct ZigClangDecl *decl)); +ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_begin(struct ZigClangASTUnit *); +ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_end(struct ZigClangASTUnit *); + +ZIG_EXTERN_C struct ZigClangPreprocessedEntity *ZigClangPreprocessingRecord_iterator_deref( + struct ZigClangPreprocessingRecord_iterator); + +ZIG_EXTERN_C enum ZigClangPreprocessedEntity_EntityKind ZigClangPreprocessedEntity_getKind(const struct ZigClangPreprocessedEntity *); ZIG_EXTERN_C const struct ZigClangRecordDecl *ZigClangRecordType_getDecl(const struct ZigClangRecordType *record_ty); 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 ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const struct ZigClangRecordDecl *record_decl); ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const struct ZigClangRecordDecl *record_decl); ZIG_EXTERN_C bool ZigClangRecordDecl_isAnonymousStructOrUnion(const struct ZigClangRecordDecl *record_decl); +ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_begin(const struct ZigClangRecordDecl *); +ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_end(const struct ZigClangRecordDecl *); +ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_iterator_next(struct ZigClangRecordDecl_field_iterator); +ZIG_EXTERN_C const struct ZigClangFieldDecl * ZigClangRecordDecl_field_iterator_deref(struct ZigClangRecordDecl_field_iterator); +ZIG_EXTERN_C bool ZigClangRecordDecl_field_iterator_neq( + struct ZigClangRecordDecl_field_iterator a, + struct ZigClangRecordDecl_field_iterator b); ZIG_EXTERN_C struct ZigClangQualType ZigClangEnumDecl_getIntegerType(const struct ZigClangEnumDecl *); +ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_begin(const struct ZigClangEnumDecl *); +ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_end(const struct ZigClangEnumDecl *); +ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_iterator_next(struct ZigClangEnumDecl_enumerator_iterator); +ZIG_EXTERN_C const struct ZigClangEnumConstantDecl * ZigClangEnumDecl_enumerator_iterator_deref(struct ZigClangEnumDecl_enumerator_iterator); +ZIG_EXTERN_C bool ZigClangEnumDecl_enumerator_iterator_neq( + struct ZigClangEnumDecl_enumerator_iterator a, + struct ZigClangEnumDecl_enumerator_iterator b); ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const struct ZigClangDecl *decl); 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 ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *); ZIG_EXTERN_C const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *var_decl); ZIG_EXTERN_C enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const struct ZigClangVarDecl *var_decl); +ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *); +ZIG_EXTERN_C bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *); +ZIG_EXTERN_C bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *); +ZIG_EXTERN_C bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *); +ZIG_EXTERN_C const struct ZigClangAPValue *ZigClangVarDecl_evaluateValue(const struct ZigClangVarDecl *); +ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *); ZIG_EXTERN_C bool ZigClangSourceLocation_eq(struct ZigClangSourceLocation a, struct ZigClangSourceLocation b); @@ -869,6 +922,7 @@ ZIG_EXTERN_C enum ZigClangTypeClass ZigClangType_getTypeClass(const struct ZigCl ZIG_EXTERN_C struct ZigClangQualType ZigClangType_getPointeeType(const struct ZigClangType *self); ZIG_EXTERN_C bool ZigClangType_isVoidType(const struct ZigClangType *self); ZIG_EXTERN_C const char *ZigClangType_getTypeClassName(const struct ZigClangType *self); +ZIG_EXTERN_C const struct ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const struct ZigClangType *self); ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangStmt_getBeginLoc(const struct ZigClangStmt *self); 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 ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangExpr_getBeginLoc(const struct ZigClangExpr *self); ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsBooleanCondition(const struct ZigClangExpr *self, bool *result, const struct ZigClangASTContext *ctx, bool in_constant_context); +ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsFloat(const struct ZigClangExpr *self, + ZigClangAPFloat **result, const struct ZigClangASTContext *ctx); +ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsConstantExpr(const struct ZigClangExpr *, + struct ZigClangExprEvalResult *, ZigClangExpr_ConstExprUsage, const struct ZigClangASTContext *); ZIG_EXTERN_C enum ZigClangAPValueKind ZigClangAPValue_getKind(const struct ZigClangAPValue *self); 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 ZIG_EXTERN_C const struct ZigClangStmt *ZigClangDefaultStmt_getSubStmt(const struct ZigClangDefaultStmt *); ZIG_EXTERN_C const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangParenExpr *); + +ZIG_EXTERN_C const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *); +ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getBegin(const struct ZigClangMacroDefinitionRecord *); +ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getEnd(const struct ZigClangMacroDefinitionRecord *); + +ZIG_EXTERN_C bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *); +ZIG_EXTERN_C struct ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *); +ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *); + +ZIG_EXTERN_C const struct ZigClangExpr *ZigClangEnumConstantDecl_getInitExpr(const struct ZigClangEnumConstantDecl *); +ZIG_EXTERN_C const struct ZigClangAPSInt *ZigClangEnumConstantDecl_getInitVal(const struct ZigClangEnumConstantDecl *); #endif