authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-11 15:33:05-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-11 15:33:26-04:00
logb960f1d92275057e8db1fc2cfee77abebf9e4c3e
treec82733368d0cf6b9996a1c69b9940dc22bb609cb
parent4172fe986e51a665605bcd07b0ed5998796c0c52
signature Commit is signed but in an unrecognized format.

translate-c: move some code to the C API

See #1964

3 files changed, 60 insertions(+), 24 deletions(-)

src/translate_c.cpp+24-22
...@@ -113,7 +113,7 @@ static TransScopeSwitch *trans_scope_switch_create(Context *c, TransScope *paren...@@ -113,7 +113,7 @@ static TransScopeSwitch *trans_scope_switch_create(Context *c, TransScope *paren
113static TransScopeBlock *trans_scope_block_find(TransScope *scope);113static TransScopeBlock *trans_scope_block_find(TransScope *scope);
114114
115static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record_decl);115static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record_decl);
116static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl);116static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl);
117static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *typedef_decl);117static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *typedef_decl);
118118
119static int trans_stmt_extra(Context *c, TransScope *scope, const clang::Stmt *stmt,119static int trans_stmt_extra(Context *c, TransScope *scope, const clang::Stmt *stmt,
...@@ -1128,8 +1128,8 @@ static AstNode *trans_type(Context *c, const clang::Type *ty, ZigClangSourceLoca...@@ -1128,8 +1128,8 @@ static AstNode *trans_type(Context *c, const clang::Type *ty, ZigClangSourceLoca
1128 }1128 }
1129 case clang::Type::Enum:1129 case clang::Type::Enum:
1130 {1130 {
1131 const clang::EnumType *enum_ty = static_cast<const clang::EnumType*>(ty);1131 const ZigClangEnumType *enum_ty = reinterpret_cast<const ZigClangEnumType*>(ty);
1132 return resolve_enum_decl(c, enum_ty->getDecl());1132 return resolve_enum_decl(c, ZigClangEnumType_getDecl(enum_ty));
1133 }1133 }
1134 case clang::Type::ConstantArray:1134 case clang::Type::ConstantArray:
1135 {1135 {
...@@ -2673,8 +2673,8 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *...@@ -2673,8 +2673,8 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *
26732673
2674 case clang::Type::Enum:2674 case clang::Type::Enum:
2675 {2675 {
2676 const clang::EnumType *enum_ty = static_cast<const clang::EnumType*>(ty);2676 const ZigClangEnumType *enum_ty = reinterpret_cast<const ZigClangEnumType *>(ty);
2677 AstNode *enum_type = resolve_enum_decl(c, enum_ty->getDecl());2677 AstNode *enum_type = resolve_enum_decl(c, ZigClangEnumType_getDecl(enum_ty));
2678 return to_enum_zero_cmp(c, res, enum_type);2678 return to_enum_zero_cmp(c, res, enum_type);
2679 }2679 }
26802680
...@@ -4013,23 +4013,23 @@ static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *t...@@ -4013,23 +4013,23 @@ static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *t
4013 return symbol_node;4013 return symbol_node;
4014}4014}
40154015
4016struct AstNode *demote_enum_to_opaque(Context *c, const clang::EnumDecl *enum_decl,4016struct AstNode *demote_enum_to_opaque(Context *c, const ZigClangEnumDecl *enum_decl, Buf *full_type_name,
4017 Buf *full_type_name, Buf *bare_name)4017 Buf *bare_name)
4018{4018{
4019 AstNode *opaque_node = trans_create_node_opaque(c);4019 AstNode *opaque_node = trans_create_node_opaque(c);
4020 if (full_type_name == nullptr) {4020 if (full_type_name == nullptr) {
4021 c->decl_table.put(enum_decl->getCanonicalDecl(), opaque_node);4021 c->decl_table.put(ZigClangEnumDecl_getCanonicalDecl(enum_decl), opaque_node);
4022 return opaque_node;4022 return opaque_node;
4023 }4023 }
4024 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);4024 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
4025 add_global_weak_alias(c, bare_name, full_type_name);4025 add_global_weak_alias(c, bare_name, full_type_name);
4026 add_global_var(c, full_type_name, opaque_node);4026 add_global_var(c, full_type_name, opaque_node);
4027 c->decl_table.put(enum_decl->getCanonicalDecl(), symbol_node);4027 c->decl_table.put(ZigClangEnumDecl_getCanonicalDecl(enum_decl), symbol_node);
4028 return symbol_node;4028 return symbol_node;
4029}4029}
40304030
4031static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl) {4031static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl) {
4032 auto existing_entry = c->decl_table.maybe_get((void*)enum_decl->getCanonicalDecl());4032 auto existing_entry = c->decl_table.maybe_get(ZigClangEnumDecl_getCanonicalDecl(enum_decl));
4033 if (existing_entry) {4033 if (existing_entry) {
4034 return existing_entry->value;4034 return existing_entry->value;
4035 }4035 }
...@@ -4039,7 +4039,7 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)...@@ -4039,7 +4039,7 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)
4039 Buf *bare_name = is_anonymous ? nullptr : buf_create_from_str(raw_name);4039 Buf *bare_name = is_anonymous ? nullptr : buf_create_from_str(raw_name);
4040 Buf *full_type_name = is_anonymous ? nullptr : buf_sprintf("enum_%s", buf_ptr(bare_name));4040 Buf *full_type_name = is_anonymous ? nullptr : buf_sprintf("enum_%s", buf_ptr(bare_name));
40414041
4042 const clang::EnumDecl *enum_def = enum_decl->getDefinition();4042 const ZigClangEnumDecl *enum_def = ZigClangEnumDecl_getDefinition(enum_decl);
4043 if (!enum_def) {4043 if (!enum_def) {
4044 return demote_enum_to_opaque(c, enum_decl, full_type_name, bare_name);4044 return demote_enum_to_opaque(c, enum_decl, full_type_name, bare_name);
4045 }4045 }
...@@ -4047,8 +4047,8 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)...@@ -4047,8 +4047,8 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)
40474047
4048 bool pure_enum = true;4048 bool pure_enum = true;
4049 uint32_t field_count = 0;4049 uint32_t field_count = 0;
4050 for (auto it = enum_def->enumerator_begin(),4050 for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(),
4051 it_end = enum_def->enumerator_end();4051 it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end();
4052 it != it_end; ++it, field_count += 1)4052 it != it_end; ++it, field_count += 1)
4053 {4053 {
4054 const clang::EnumConstantDecl *enum_const = *it;4054 const clang::EnumConstantDecl *enum_const = *it;
...@@ -4056,7 +4056,9 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)...@@ -4056,7 +4056,9 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)
4056 pure_enum = false;4056 pure_enum = false;
4057 }4057 }
4058 }4058 }
4059 AstNode *tag_int_type = trans_qual_type(c, enum_decl->getIntegerType(), bitcast(enum_decl->getLocation()));4059 AstNode *tag_int_type = trans_qual_type(c,
4060 bitcast(ZigClangEnumDecl_getIntegerType(enum_decl)),
4061 ZigClangEnumDecl_getLocation(enum_decl));
4060 assert(tag_int_type);4062 assert(tag_int_type);
40614063
4062 AstNode *enum_node = trans_create_node(c, NodeTypeContainerDecl);4064 AstNode *enum_node = trans_create_node(c, NodeTypeContainerDecl);
...@@ -4065,15 +4067,15 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)...@@ -4065,15 +4067,15 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)
4065 // TODO only emit this tag type if the enum tag type is not the default.4067 // TODO only emit this tag type if the enum tag type is not the default.
4066 // I don't know what the default is, need to figure out how clang is deciding.4068 // I don't know what the default is, need to figure out how clang is deciding.
4067 // it appears to at least be different across gcc/msvc4069 // it appears to at least be different across gcc/msvc
4068 if (!c_is_builtin_type(c, enum_decl->getIntegerType(), clang::BuiltinType::UInt) &&4070 if (!c_is_builtin_type(c, bitcast(ZigClangEnumDecl_getIntegerType(enum_decl)), clang::BuiltinType::UInt) &&
4069 !c_is_builtin_type(c, enum_decl->getIntegerType(), clang::BuiltinType::Int))4071 !c_is_builtin_type(c, bitcast(ZigClangEnumDecl_getIntegerType(enum_decl)), clang::BuiltinType::Int))
4070 {4072 {
4071 enum_node->data.container_decl.init_arg_expr = tag_int_type;4073 enum_node->data.container_decl.init_arg_expr = tag_int_type;
4072 }4074 }
4073 enum_node->data.container_decl.fields.resize(field_count);4075 enum_node->data.container_decl.fields.resize(field_count);
4074 uint32_t i = 0;4076 uint32_t i = 0;
4075 for (auto it = enum_def->enumerator_begin(),4077 for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(),
4076 it_end = enum_def->enumerator_end();4078 it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end();
4077 it != it_end; ++it, i += 1)4079 it != it_end; ++it, i += 1)
4078 {4080 {
4079 const clang::EnumConstantDecl *enum_const = *it;4081 const clang::EnumConstantDecl *enum_const = *it;
...@@ -4106,13 +4108,13 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)...@@ -4106,13 +4108,13 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)
4106 }4108 }
41074109
4108 if (is_anonymous) {4110 if (is_anonymous) {
4109 c->decl_table.put(enum_decl->getCanonicalDecl(), enum_node);4111 c->decl_table.put(ZigClangEnumDecl_getCanonicalDecl(enum_decl), enum_node);
4110 return enum_node;4112 return enum_node;
4111 } else {4113 } else {
4112 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);4114 AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
4113 add_global_weak_alias(c, bare_name, full_type_name);4115 add_global_weak_alias(c, bare_name, full_type_name);
4114 add_global_var(c, full_type_name, enum_node);4116 add_global_var(c, full_type_name, enum_node);
4115 c->decl_table.put(enum_decl->getCanonicalDecl(), symbol_node);4117 c->decl_table.put(ZigClangEnumDecl_getCanonicalDecl(enum_decl), symbol_node);
4116 return enum_node;4118 return enum_node;
4117 }4119 }
4118}4120}
...@@ -4398,7 +4400,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *zdecl) {...@@ -4398,7 +4400,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *zdecl) {
4398 resolve_typedef_decl(c, static_cast<const clang::TypedefNameDecl *>(decl));4400 resolve_typedef_decl(c, static_cast<const clang::TypedefNameDecl *>(decl));
4399 break;4401 break;
4400 case clang::Decl::Enum:4402 case clang::Decl::Enum:
4401 resolve_enum_decl(c, static_cast<const clang::EnumDecl *>(decl));4403 resolve_enum_decl(c, reinterpret_cast<const ZigClangEnumDecl *>(decl));
4402 break;4404 break;
4403 case clang::Decl::Record:4405 case clang::Decl::Record:
4404 resolve_record_decl(c, (const ZigClangRecordDecl *)(decl));4406 resolve_record_decl(c, (const ZigClangRecordDecl *)(decl));
src/zig_clang.cpp+25
...@@ -218,17 +218,33 @@ const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *r...@@ -218,17 +218,33 @@ const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *r
218 return reinterpret_cast<const ZigClangRecordDecl *>(record_decl);218 return reinterpret_cast<const ZigClangRecordDecl *>(record_decl);
219}219}
220220
221const ZigClangEnumDecl *ZigClangEnumType_getDecl(const ZigClangEnumType *enum_ty) {
222 const clang::EnumDecl *enum_decl = reinterpret_cast<const clang::EnumType *>(enum_ty)->getDecl();
223 return reinterpret_cast<const ZigClangEnumDecl *>(enum_decl);
224}
225
221const ZigClangTagDecl *ZigClangRecordDecl_getCanonicalDecl(const ZigClangRecordDecl *record_decl) {226const ZigClangTagDecl *ZigClangRecordDecl_getCanonicalDecl(const ZigClangRecordDecl *record_decl) {
222 const clang::TagDecl *tag_decl = reinterpret_cast<const clang::RecordDecl*>(record_decl)->getCanonicalDecl();227 const clang::TagDecl *tag_decl = reinterpret_cast<const clang::RecordDecl*>(record_decl)->getCanonicalDecl();
223 return reinterpret_cast<const ZigClangTagDecl *>(tag_decl);228 return reinterpret_cast<const ZigClangTagDecl *>(tag_decl);
224}229}
225230
231const ZigClangTagDecl *ZigClangEnumDecl_getCanonicalDecl(const ZigClangEnumDecl *enum_decl) {
232 const clang::TagDecl *tag_decl = reinterpret_cast<const clang::EnumDecl*>(enum_decl)->getCanonicalDecl();
233 return reinterpret_cast<const ZigClangTagDecl *>(tag_decl);
234}
235
226const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *zig_record_decl) {236const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *zig_record_decl) {
227 const clang::RecordDecl *record_decl = reinterpret_cast<const clang::RecordDecl *>(zig_record_decl);237 const clang::RecordDecl *record_decl = reinterpret_cast<const clang::RecordDecl *>(zig_record_decl);
228 const clang::RecordDecl *definition = record_decl->getDefinition();238 const clang::RecordDecl *definition = record_decl->getDefinition();
229 return reinterpret_cast<const ZigClangRecordDecl *>(definition);239 return reinterpret_cast<const ZigClangRecordDecl *>(definition);
230}240}
231241
242const ZigClangEnumDecl *ZigClangEnumDecl_getDefinition(const ZigClangEnumDecl *zig_enum_decl) {
243 const clang::EnumDecl *enum_decl = reinterpret_cast<const clang::EnumDecl *>(zig_enum_decl);
244 const clang::EnumDecl *definition = enum_decl->getDefinition();
245 return reinterpret_cast<const ZigClangEnumDecl *>(definition);
246}
247
232bool ZigClangRecordDecl_isUnion(const ZigClangRecordDecl *record_decl) {248bool ZigClangRecordDecl_isUnion(const ZigClangRecordDecl *record_decl) {
233 return reinterpret_cast<const clang::RecordDecl*>(record_decl)->isUnion();249 return reinterpret_cast<const clang::RecordDecl*>(record_decl)->isUnion();
234}250}
...@@ -252,8 +268,17 @@ ZigClangSourceLocation ZigClangRecordDecl_getLocation(const ZigClangRecordDecl *...@@ -252,8 +268,17 @@ ZigClangSourceLocation ZigClangRecordDecl_getLocation(const ZigClangRecordDecl *
252 return bitcast(record_decl->getLocation());268 return bitcast(record_decl->getLocation());
253}269}
254270
271ZigClangSourceLocation ZigClangEnumDecl_getLocation(const ZigClangEnumDecl *self) {
272 auto casted = reinterpret_cast<const clang::EnumDecl *>(self);
273 return bitcast(casted->getLocation());
274}
275
255bool ZigClangSourceLocation_eq(ZigClangSourceLocation zig_a, ZigClangSourceLocation zig_b) {276bool ZigClangSourceLocation_eq(ZigClangSourceLocation zig_a, ZigClangSourceLocation zig_b) {
256 clang::SourceLocation a = bitcast(zig_a);277 clang::SourceLocation a = bitcast(zig_a);
257 clang::SourceLocation b = bitcast(zig_b);278 clang::SourceLocation b = bitcast(zig_b);
258 return a == b;279 return a == b;
259}280}
281
282ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnumDecl *self) {
283 return bitcast(reinterpret_cast<const clang::EnumDecl *>(self)->getIntegerType());
284}
src/zig_clang.h+11-2
...@@ -260,13 +260,22 @@ ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *, voi...@@ -260,13 +260,22 @@ ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *, voi
260 bool (*Fn)(void *context, const ZigClangDecl *decl));260 bool (*Fn)(void *context, const ZigClangDecl *decl));
261261
262ZIG_EXTERN_C const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *record_ty);262ZIG_EXTERN_C const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *record_ty);
263ZIG_EXTERN_C const ZigClangEnumDecl *ZigClangEnumType_getDecl(const ZigClangEnumType *record_ty);
263264
264ZIG_EXTERN_C const ZigClangTagDecl *ZigClangRecordDecl_getCanonicalDecl(const ZigClangRecordDecl *record_decl);265ZIG_EXTERN_C const ZigClangTagDecl *ZigClangRecordDecl_getCanonicalDecl(const ZigClangRecordDecl *record_decl);
266ZIG_EXTERN_C const ZigClangTagDecl *ZigClangEnumDecl_getCanonicalDecl(const ZigClangEnumDecl *);
267
268ZIG_EXTERN_C const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *);
269ZIG_EXTERN_C const ZigClangEnumDecl *ZigClangEnumDecl_getDefinition(const ZigClangEnumDecl *);
270
271ZIG_EXTERN_C ZigClangSourceLocation ZigClangRecordDecl_getLocation(const ZigClangRecordDecl *);
272ZIG_EXTERN_C ZigClangSourceLocation ZigClangEnumDecl_getLocation(const ZigClangEnumDecl *);
273
265ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const ZigClangRecordDecl *record_decl);274ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const ZigClangRecordDecl *record_decl);
266ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const ZigClangRecordDecl *record_decl);275ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const ZigClangRecordDecl *record_decl);
267ZIG_EXTERN_C bool ZigClangRecordDecl_isAnonymousStructOrUnion(const ZigClangRecordDecl *record_decl);276ZIG_EXTERN_C bool ZigClangRecordDecl_isAnonymousStructOrUnion(const ZigClangRecordDecl *record_decl);
268ZIG_EXTERN_C const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *);277
269ZIG_EXTERN_C ZigClangSourceLocation ZigClangRecordDecl_getLocation(const ZigClangRecordDecl *);278ZIG_EXTERN_C ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnumDecl *);
270279
271ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const ZigClangDecl *decl);280ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const ZigClangDecl *decl);
272281