authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-11 23:38:41-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-11 23:38:41-04:00
log6f34d08aedb4c89257de04da1e4f8d162188d247
tree8abdc3ba32a8abd8d45bec36869ad8284937a5f3
parent5f8dbcac0669973b0d0f07ce6777dcd4456676dd
signature Commit is signed but in an unrecognized format.

translate-c: move some code to the C API

See #1964

3 files changed, 52 insertions(+), 22 deletions(-)

src/translate_c.cpp+25-22
...@@ -114,7 +114,7 @@ static TransScopeBlock *trans_scope_block_find(TransScope *scope);...@@ -114,7 +114,7 @@ static 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 ZigClangEnumDecl *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 ZigClangTypedefNameDecl *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,
120 ResultUsed result_used, TransLRValue lrval,120 ResultUsed result_used, TransLRValue lrval,
...@@ -592,7 +592,7 @@ static bool qual_type_is_fn_ptr(clang::QualType qt) {...@@ -592,7 +592,7 @@ static bool qual_type_is_fn_ptr(clang::QualType qt) {
592 return false;592 return false;
593}593}
594594
595static uint32_t qual_type_int_bit_width(Context *c, const clang::QualType &qt, ZigClangSourceLocation source_loc) {595static uint32_t qual_type_int_bit_width(Context *c, const clang::QualType qt, ZigClangSourceLocation source_loc) {
596 const clang::Type *ty = qt.getTypePtr();596 const clang::Type *ty = qt.getTypePtr();
597 switch (ty->getTypeClass()) {597 switch (ty->getTypeClass()) {
598 case clang::Type::Builtin:598 case clang::Type::Builtin:
...@@ -614,8 +614,8 @@ static uint32_t qual_type_int_bit_width(Context *c, const clang::QualType &qt, Z...@@ -614,8 +614,8 @@ static uint32_t qual_type_int_bit_width(Context *c, const clang::QualType &qt, Z
614 }614 }
615 case clang::Type::Typedef:615 case clang::Type::Typedef:
616 {616 {
617 const clang::TypedefType *typedef_ty = static_cast<const clang::TypedefType*>(ty);617 const ZigClangTypedefType *typedef_ty = reinterpret_cast<const ZigClangTypedefType*>(ty);
618 const clang::TypedefNameDecl *typedef_decl = typedef_ty->getDecl();618 const ZigClangTypedefNameDecl *typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);
619 const char *type_name = ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)typedef_decl);619 const char *type_name = ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)typedef_decl);
620 if (strcmp(type_name, "uint8_t") == 0 || strcmp(type_name, "int8_t") == 0) {620 if (strcmp(type_name, "uint8_t") == 0 || strcmp(type_name, "int8_t") == 0) {
621 return 8;621 return 8;
...@@ -636,7 +636,7 @@ static uint32_t qual_type_int_bit_width(Context *c, const clang::QualType &qt, Z...@@ -636,7 +636,7 @@ static uint32_t qual_type_int_bit_width(Context *c, const clang::QualType &qt, Z
636}636}
637637
638638
639static AstNode *qual_type_to_log2_int_ref(Context *c, const clang::QualType &qt,639static AstNode *qual_type_to_log2_int_ref(Context *c, const clang::QualType qt,
640 ZigClangSourceLocation source_loc)640 ZigClangSourceLocation source_loc)
641{641{
642 uint32_t int_bit_width = qual_type_int_bit_width(c, qt, source_loc);642 uint32_t int_bit_width = qual_type_int_bit_width(c, qt, source_loc);
...@@ -669,7 +669,7 @@ static AstNode *qual_type_to_log2_int_ref(Context *c, const clang::QualType &qt,...@@ -669,7 +669,7 @@ static AstNode *qual_type_to_log2_int_ref(Context *c, const clang::QualType &qt,
669 return log2int_fn_call;669 return log2int_fn_call;
670}670}
671671
672static bool qual_type_child_is_fn_proto(const clang::QualType &qt) {672static bool qual_type_child_is_fn_proto(const clang::QualType qt) {
673 if (qt.getTypePtr()->getTypeClass() == clang::Type::Paren) {673 if (qt.getTypePtr()->getTypeClass() == clang::Type::Paren) {
674 const clang::ParenType *paren_type = static_cast<const clang::ParenType *>(qt.getTypePtr());674 const clang::ParenType *paren_type = static_cast<const clang::ParenType *>(qt.getTypePtr());
675 if (paren_type->getInnerType()->getTypeClass() == clang::Type::FunctionProto) {675 if (paren_type->getInnerType()->getTypeClass() == clang::Type::FunctionProto) {
...@@ -797,9 +797,11 @@ static bool type_is_opaque(Context *c, const clang::Type *ty, ZigClangSourceLoca...@@ -797,9 +797,11 @@ static bool type_is_opaque(Context *c, const clang::Type *ty, ZigClangSourceLoca
797 return type_is_opaque(c, elaborated_ty->getNamedType().getTypePtr(), source_loc);797 return type_is_opaque(c, elaborated_ty->getNamedType().getTypePtr(), source_loc);
798 }798 }
799 case clang::Type::Typedef: {799 case clang::Type::Typedef: {
800 const clang::TypedefType *typedef_ty = static_cast<const clang::TypedefType*>(ty);800 const ZigClangTypedefType *typedef_ty = reinterpret_cast<const ZigClangTypedefType*>(ty);
801 const clang::TypedefNameDecl *typedef_decl = typedef_ty->getDecl();801 const ZigClangTypedefNameDecl *typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);
802 return type_is_opaque(c, typedef_decl->getUnderlyingType().getTypePtr(), source_loc);802 ZigClangQualType underlying_type = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
803 clang::QualType qt = bitcast(underlying_type);
804 return type_is_opaque(c, qt.getTypePtr(), source_loc);
803 }805 }
804 default:806 default:
805 return false;807 return false;
...@@ -978,8 +980,8 @@ static AstNode *trans_type(Context *c, const clang::Type *ty, ZigClangSourceLoca...@@ -978,8 +980,8 @@ static AstNode *trans_type(Context *c, const clang::Type *ty, ZigClangSourceLoca
978 }980 }
979 case clang::Type::Typedef:981 case clang::Type::Typedef:
980 {982 {
981 const clang::TypedefType *typedef_ty = static_cast<const clang::TypedefType*>(ty);983 const ZigClangTypedefType *typedef_ty = reinterpret_cast<const ZigClangTypedefType*>(ty);
982 const clang::TypedefNameDecl *typedef_decl = typedef_ty->getDecl();984 const ZigClangTypedefNameDecl *typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);
983 return resolve_typedef_decl(c, typedef_decl);985 return resolve_typedef_decl(c, typedef_decl);
984 }986 }
985 case clang::Type::Elaborated:987 case clang::Type::Elaborated:
...@@ -2661,9 +2663,9 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *...@@ -2661,9 +2663,9 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *
26612663
2662 case clang::Type::Typedef:2664 case clang::Type::Typedef:
2663 {2665 {
2664 const clang::TypedefType *typedef_ty = static_cast<const clang::TypedefType*>(ty);2666 const ZigClangTypedefType *typedef_ty = reinterpret_cast<const ZigClangTypedefType*>(ty);
2665 const clang::TypedefNameDecl *typedef_decl = typedef_ty->getDecl();2667 const ZigClangTypedefNameDecl *typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);
2666 auto existing_entry = c->decl_table.maybe_get((void*)typedef_decl->getCanonicalDecl());2668 auto existing_entry = c->decl_table.maybe_get((void*)ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl));
2667 if (existing_entry) {2669 if (existing_entry) {
2668 return existing_entry->value;2670 return existing_entry->value;
2669 }2671 }
...@@ -3952,19 +3954,19 @@ static void visit_fn_decl(Context *c, const clang::FunctionDecl *fn_decl) {...@@ -3952,19 +3954,19 @@ static void visit_fn_decl(Context *c, const clang::FunctionDecl *fn_decl) {
3952 add_top_level_decl(c, fn_def_node->data.fn_def.fn_proto->data.fn_proto.name, fn_def_node);3954 add_top_level_decl(c, fn_def_node->data.fn_def.fn_proto->data.fn_proto.name, fn_def_node);
3953}3955}
39543956
3955static AstNode *resolve_typdef_as_builtin(Context *c, const clang::TypedefNameDecl *typedef_decl, const char *primitive_name) {3957static AstNode *resolve_typdef_as_builtin(Context *c, const ZigClangTypedefNameDecl *typedef_decl, const char *primitive_name) {
3956 AstNode *node = trans_create_node_symbol_str(c, primitive_name);3958 AstNode *node = trans_create_node_symbol_str(c, primitive_name);
3957 c->decl_table.put(typedef_decl, node);3959 c->decl_table.put(typedef_decl, node);
3958 return node;3960 return node;
3959}3961}
39603962
3961static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *typedef_decl) {3963static AstNode *resolve_typedef_decl(Context *c, const ZigClangTypedefNameDecl *typedef_decl) {
3962 auto existing_entry = c->decl_table.maybe_get((void*)typedef_decl->getCanonicalDecl());3964 auto existing_entry = c->decl_table.maybe_get((void*)ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl));
3963 if (existing_entry) {3965 if (existing_entry) {
3964 return existing_entry->value;3966 return existing_entry->value;
3965 }3967 }
39663968
3967 clang::QualType child_qt = typedef_decl->getUnderlyingType();3969 ZigClangQualType child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
3968 Buf *type_name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)typedef_decl));3970 Buf *type_name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)typedef_decl));
39693971
3970 if (buf_eql_str(type_name, "uint8_t")) {3972 if (buf_eql_str(type_name, "uint8_t")) {
...@@ -3999,11 +4001,12 @@ static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *t...@@ -3999,11 +4001,12 @@ static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *t
39994001
4000 // trans_qual_type here might cause us to look at this typedef again so we put the item in the map first4002 // trans_qual_type here might cause us to look at this typedef again so we put the item in the map first
4001 AstNode *symbol_node = trans_create_node_symbol(c, type_name);4003 AstNode *symbol_node = trans_create_node_symbol(c, type_name);
4002 c->decl_table.put(typedef_decl->getCanonicalDecl(), symbol_node);4004 c->decl_table.put(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl), symbol_node);
40034005
4004 AstNode *type_node = trans_qual_type(c, child_qt, bitcast(typedef_decl->getLocation()));4006 AstNode *type_node = trans_qual_type(c, bitcast(child_qt), ZigClangTypedefNameDecl_getLocation(typedef_decl));
4005 if (type_node == nullptr) {4007 if (type_node == nullptr) {
4006 emit_warning(c, bitcast(typedef_decl->getLocation()), "typedef %s - unresolved child type", buf_ptr(type_name));4008 emit_warning(c, ZigClangTypedefNameDecl_getLocation(typedef_decl),
4009 "typedef %s - unresolved child type", buf_ptr(type_name));
4007 c->decl_table.put(typedef_decl, nullptr);4010 c->decl_table.put(typedef_decl, nullptr);
4008 // TODO add global var with type_name equal to @compileError("unable to resolve C type") 4011 // TODO add global var with type_name equal to @compileError("unable to resolve C type")
4009 return nullptr;4012 return nullptr;
...@@ -4397,7 +4400,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *zdecl) {...@@ -4397,7 +4400,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *zdecl) {
4397 visit_fn_decl(c, static_cast<const clang::FunctionDecl*>(decl));4400 visit_fn_decl(c, static_cast<const clang::FunctionDecl*>(decl));
4398 break;4401 break;
4399 case clang::Decl::Typedef:4402 case clang::Decl::Typedef:
4400 resolve_typedef_decl(c, static_cast<const clang::TypedefNameDecl *>(decl));4403 resolve_typedef_decl(c, reinterpret_cast<const ZigClangTypedefNameDecl *>(decl));
4401 break;4404 break;
4402 case clang::Decl::Enum:4405 case clang::Decl::Enum:
4403 resolve_enum_decl(c, reinterpret_cast<const ZigClangEnumDecl *>(decl));4406 resolve_enum_decl(c, reinterpret_cast<const ZigClangEnumDecl *>(decl));
src/zig_clang.cpp+22
...@@ -233,6 +233,11 @@ const ZigClangTagDecl *ZigClangEnumDecl_getCanonicalDecl(const ZigClangEnumDecl...@@ -233,6 +233,11 @@ const ZigClangTagDecl *ZigClangEnumDecl_getCanonicalDecl(const ZigClangEnumDecl
233 return reinterpret_cast<const ZigClangTagDecl *>(tag_decl);233 return reinterpret_cast<const ZigClangTagDecl *>(tag_decl);
234}234}
235235
236const ZigClangTypedefNameDecl *ZigClangTypedefNameDecl_getCanonicalDecl(const ZigClangTypedefNameDecl *self) {
237 const clang::TypedefNameDecl *decl = reinterpret_cast<const clang::TypedefNameDecl*>(self)->getCanonicalDecl();
238 return reinterpret_cast<const ZigClangTypedefNameDecl *>(decl);
239}
240
236const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *zig_record_decl) {241const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *zig_record_decl) {
237 const clang::RecordDecl *record_decl = reinterpret_cast<const clang::RecordDecl *>(zig_record_decl);242 const clang::RecordDecl *record_decl = reinterpret_cast<const clang::RecordDecl *>(zig_record_decl);
238 const clang::RecordDecl *definition = record_decl->getDefinition();243 const clang::RecordDecl *definition = record_decl->getDefinition();
...@@ -273,6 +278,11 @@ ZigClangSourceLocation ZigClangEnumDecl_getLocation(const ZigClangEnumDecl *self...@@ -273,6 +278,11 @@ ZigClangSourceLocation ZigClangEnumDecl_getLocation(const ZigClangEnumDecl *self
273 return bitcast(casted->getLocation());278 return bitcast(casted->getLocation());
274}279}
275280
281ZigClangSourceLocation ZigClangTypedefNameDecl_getLocation(const ZigClangTypedefNameDecl *self) {
282 auto casted = reinterpret_cast<const clang::TypedefNameDecl *>(self);
283 return bitcast(casted->getLocation());
284}
285
276bool ZigClangSourceLocation_eq(ZigClangSourceLocation zig_a, ZigClangSourceLocation zig_b) {286bool ZigClangSourceLocation_eq(ZigClangSourceLocation zig_a, ZigClangSourceLocation zig_b) {
277 clang::SourceLocation a = bitcast(zig_a);287 clang::SourceLocation a = bitcast(zig_a);
278 clang::SourceLocation b = bitcast(zig_b);288 clang::SourceLocation b = bitcast(zig_b);
...@@ -282,3 +292,15 @@ bool ZigClangSourceLocation_eq(ZigClangSourceLocation zig_a, ZigClangSourceLocat...@@ -282,3 +292,15 @@ bool ZigClangSourceLocation_eq(ZigClangSourceLocation zig_a, ZigClangSourceLocat
282ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnumDecl *self) {292ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnumDecl *self) {
283 return bitcast(reinterpret_cast<const clang::EnumDecl *>(self)->getIntegerType());293 return bitcast(reinterpret_cast<const clang::EnumDecl *>(self)->getIntegerType());
284}294}
295
296const ZigClangTypedefNameDecl *ZigClangTypedefType_getDecl(const ZigClangTypedefType *self) {
297 auto casted = reinterpret_cast<const clang::TypedefType *>(self);
298 const clang::TypedefNameDecl *name_decl = casted->getDecl();
299 return reinterpret_cast<const ZigClangTypedefNameDecl *>(name_decl);
300}
301
302ZigClangQualType ZigClangTypedefNameDecl_getUnderlyingType(const ZigClangTypedefNameDecl *self) {
303 auto casted = reinterpret_cast<const clang::TypedefNameDecl *>(self);
304 clang::QualType ty = casted->getUnderlyingType();
305 return bitcast(ty);
306}
src/zig_clang.h+5
...@@ -264,12 +264,14 @@ ZIG_EXTERN_C const ZigClangEnumDecl *ZigClangEnumType_getDecl(const ZigClangEnum...@@ -264,12 +264,14 @@ ZIG_EXTERN_C const ZigClangEnumDecl *ZigClangEnumType_getDecl(const ZigClangEnum
264264
265ZIG_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 *);266ZIG_EXTERN_C const ZigClangTagDecl *ZigClangEnumDecl_getCanonicalDecl(const ZigClangEnumDecl *);
267ZIG_EXTERN_C const ZigClangTypedefNameDecl *ZigClangTypedefNameDecl_getCanonicalDecl(const ZigClangTypedefNameDecl *);
267268
268ZIG_EXTERN_C const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *);269ZIG_EXTERN_C const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *);
269ZIG_EXTERN_C const ZigClangEnumDecl *ZigClangEnumDecl_getDefinition(const ZigClangEnumDecl *);270ZIG_EXTERN_C const ZigClangEnumDecl *ZigClangEnumDecl_getDefinition(const ZigClangEnumDecl *);
270271
271ZIG_EXTERN_C ZigClangSourceLocation ZigClangRecordDecl_getLocation(const ZigClangRecordDecl *);272ZIG_EXTERN_C ZigClangSourceLocation ZigClangRecordDecl_getLocation(const ZigClangRecordDecl *);
272ZIG_EXTERN_C ZigClangSourceLocation ZigClangEnumDecl_getLocation(const ZigClangEnumDecl *);273ZIG_EXTERN_C ZigClangSourceLocation ZigClangEnumDecl_getLocation(const ZigClangEnumDecl *);
274ZIG_EXTERN_C ZigClangSourceLocation ZigClangTypedefNameDecl_getLocation(const ZigClangTypedefNameDecl *);
273275
274ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const ZigClangRecordDecl *record_decl);276ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const ZigClangRecordDecl *record_decl);
275ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const ZigClangRecordDecl *record_decl);277ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const ZigClangRecordDecl *record_decl);
...@@ -280,4 +282,7 @@ ZIG_EXTERN_C ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnum...@@ -280,4 +282,7 @@ ZIG_EXTERN_C ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnum
280ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const ZigClangDecl *decl);282ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const ZigClangDecl *decl);
281283
282ZIG_EXTERN_C bool ZigClangSourceLocation_eq(ZigClangSourceLocation a, ZigClangSourceLocation b);284ZIG_EXTERN_C bool ZigClangSourceLocation_eq(ZigClangSourceLocation a, ZigClangSourceLocation b);
285
286ZIG_EXTERN_C const ZigClangTypedefNameDecl *ZigClangTypedefType_getDecl(const ZigClangTypedefType *);
287ZIG_EXTERN_C ZigClangQualType ZigClangTypedefNameDecl_getUnderlyingType(const ZigClangTypedefNameDecl *);
283#endif288#endif