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);
114114
115115static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record_decl);
116116static 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
119119static int trans_stmt_extra(Context *c, TransScope *scope, const clang::Stmt *stmt,
120120 ResultUsed result_used, TransLRValue lrval,
......@@ -592,7 +592,7 @@ static bool qual_type_is_fn_ptr(clang::QualType qt) {
592592 return false;
593593}
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) {
596596 const clang::Type *ty = qt.getTypePtr();
597597 switch (ty->getTypeClass()) {
598598 case clang::Type::Builtin:
......@@ -614,8 +614,8 @@ static uint32_t qual_type_int_bit_width(Context *c, const clang::QualType &qt, Z
614614 }
615615 case clang::Type::Typedef:
616616 {
617 const clang::TypedefType *typedef_ty = static_cast<const clang::TypedefType*>(ty);
618 const clang::TypedefNameDecl *typedef_decl = typedef_ty->getDecl();
617 const ZigClangTypedefType *typedef_ty = reinterpret_cast<const ZigClangTypedefType*>(ty);
618 const ZigClangTypedefNameDecl *typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);
619619 const char *type_name = ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)typedef_decl);
620620 if (strcmp(type_name, "uint8_t") == 0 || strcmp(type_name, "int8_t") == 0) {
621621 return 8;
......@@ -636,7 +636,7 @@ static uint32_t qual_type_int_bit_width(Context *c, const clang::QualType &qt, Z
636636}
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,
640640 ZigClangSourceLocation source_loc)
641641{
642642 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,
669669 return log2int_fn_call;
670670}
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) {
673673 if (qt.getTypePtr()->getTypeClass() == clang::Type::Paren) {
674674 const clang::ParenType *paren_type = static_cast<const clang::ParenType *>(qt.getTypePtr());
675675 if (paren_type->getInnerType()->getTypeClass() == clang::Type::FunctionProto) {
......@@ -797,9 +797,11 @@ static bool type_is_opaque(Context *c, const clang::Type *ty, ZigClangSourceLoca
797797 return type_is_opaque(c, elaborated_ty->getNamedType().getTypePtr(), source_loc);
798798 }
799799 case clang::Type::Typedef: {
800 const clang::TypedefType *typedef_ty = static_cast<const clang::TypedefType*>(ty);
801 const clang::TypedefNameDecl *typedef_decl = typedef_ty->getDecl();
802 return type_is_opaque(c, typedef_decl->getUnderlyingType().getTypePtr(), source_loc);
800 const ZigClangTypedefType *typedef_ty = reinterpret_cast<const ZigClangTypedefType*>(ty);
801 const ZigClangTypedefNameDecl *typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);
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);
803805 }
804806 default:
805807 return false;
......@@ -978,8 +980,8 @@ static AstNode *trans_type(Context *c, const clang::Type *ty, ZigClangSourceLoca
978980 }
979981 case clang::Type::Typedef:
980982 {
981 const clang::TypedefType *typedef_ty = static_cast<const clang::TypedefType*>(ty);
982 const clang::TypedefNameDecl *typedef_decl = typedef_ty->getDecl();
983 const ZigClangTypedefType *typedef_ty = reinterpret_cast<const ZigClangTypedefType*>(ty);
984 const ZigClangTypedefNameDecl *typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);
983985 return resolve_typedef_decl(c, typedef_decl);
984986 }
985987 case clang::Type::Elaborated:
......@@ -2661,9 +2663,9 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *
26612663
26622664 case clang::Type::Typedef:
26632665 {
2664 const clang::TypedefType *typedef_ty = static_cast<const clang::TypedefType*>(ty);
2665 const clang::TypedefNameDecl *typedef_decl = typedef_ty->getDecl();
2666 auto existing_entry = c->decl_table.maybe_get((void*)typedef_decl->getCanonicalDecl());
2666 const ZigClangTypedefType *typedef_ty = reinterpret_cast<const ZigClangTypedefType*>(ty);
2667 const ZigClangTypedefNameDecl *typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);
2668 auto existing_entry = c->decl_table.maybe_get((void*)ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl));
26672669 if (existing_entry) {
26682670 return existing_entry->value;
26692671 }
......@@ -3952,19 +3954,19 @@ static void visit_fn_decl(Context *c, const clang::FunctionDecl *fn_decl) {
39523954 add_top_level_decl(c, fn_def_node->data.fn_def.fn_proto->data.fn_proto.name, fn_def_node);
39533955}
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) {
39563958 AstNode *node = trans_create_node_symbol_str(c, primitive_name);
39573959 c->decl_table.put(typedef_decl, node);
39583960 return node;
39593961}
39603962
3961static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *typedef_decl) {
3962 auto existing_entry = c->decl_table.maybe_get((void*)typedef_decl->getCanonicalDecl());
3963static AstNode *resolve_typedef_decl(Context *c, const ZigClangTypedefNameDecl *typedef_decl) {
3964 auto existing_entry = c->decl_table.maybe_get((void*)ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl));
39633965 if (existing_entry) {
39643966 return existing_entry->value;
39653967 }
39663968
3967 clang::QualType child_qt = typedef_decl->getUnderlyingType();
3969 ZigClangQualType child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
39683970 Buf *type_name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)typedef_decl));
39693971
39703972 if (buf_eql_str(type_name, "uint8_t")) {
......@@ -3999,11 +4001,12 @@ static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *t
39994001
40004002 // trans_qual_type here might cause us to look at this typedef again so we put the item in the map first
40014003 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));
40054007 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));
40074010 c->decl_table.put(typedef_decl, nullptr);
40084011 // TODO add global var with type_name equal to @compileError("unable to resolve C type")
40094012 return nullptr;
......@@ -4397,7 +4400,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *zdecl) {
43974400 visit_fn_decl(c, static_cast<const clang::FunctionDecl*>(decl));
43984401 break;
43994402 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));
44014404 break;
44024405 case clang::Decl::Enum:
44034406 resolve_enum_decl(c, reinterpret_cast<const ZigClangEnumDecl *>(decl));
src/zig_clang.cpp+22
......@@ -233,6 +233,11 @@ const ZigClangTagDecl *ZigClangEnumDecl_getCanonicalDecl(const ZigClangEnumDecl
233233 return reinterpret_cast<const ZigClangTagDecl *>(tag_decl);
234234}
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
236241const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *zig_record_decl) {
237242 const clang::RecordDecl *record_decl = reinterpret_cast<const clang::RecordDecl *>(zig_record_decl);
238243 const clang::RecordDecl *definition = record_decl->getDefinition();
......@@ -273,6 +278,11 @@ ZigClangSourceLocation ZigClangEnumDecl_getLocation(const ZigClangEnumDecl *self
273278 return bitcast(casted->getLocation());
274279}
275280
281ZigClangSourceLocation ZigClangTypedefNameDecl_getLocation(const ZigClangTypedefNameDecl *self) {
282 auto casted = reinterpret_cast<const clang::TypedefNameDecl *>(self);
283 return bitcast(casted->getLocation());
284}
285
276286bool ZigClangSourceLocation_eq(ZigClangSourceLocation zig_a, ZigClangSourceLocation zig_b) {
277287 clang::SourceLocation a = bitcast(zig_a);
278288 clang::SourceLocation b = bitcast(zig_b);
......@@ -282,3 +292,15 @@ bool ZigClangSourceLocation_eq(ZigClangSourceLocation zig_a, ZigClangSourceLocat
282292ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnumDecl *self) {
283293 return bitcast(reinterpret_cast<const clang::EnumDecl *>(self)->getIntegerType());
284294}
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
264264
265265ZIG_EXTERN_C const ZigClangTagDecl *ZigClangRecordDecl_getCanonicalDecl(const ZigClangRecordDecl *record_decl);
266266ZIG_EXTERN_C const ZigClangTagDecl *ZigClangEnumDecl_getCanonicalDecl(const ZigClangEnumDecl *);
267ZIG_EXTERN_C const ZigClangTypedefNameDecl *ZigClangTypedefNameDecl_getCanonicalDecl(const ZigClangTypedefNameDecl *);
267268
268269ZIG_EXTERN_C const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *);
269270ZIG_EXTERN_C const ZigClangEnumDecl *ZigClangEnumDecl_getDefinition(const ZigClangEnumDecl *);
270271
271272ZIG_EXTERN_C ZigClangSourceLocation ZigClangRecordDecl_getLocation(const ZigClangRecordDecl *);
272273ZIG_EXTERN_C ZigClangSourceLocation ZigClangEnumDecl_getLocation(const ZigClangEnumDecl *);
274ZIG_EXTERN_C ZigClangSourceLocation ZigClangTypedefNameDecl_getLocation(const ZigClangTypedefNameDecl *);
273275
274276ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const ZigClangRecordDecl *record_decl);
275277ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const ZigClangRecordDecl *record_decl);
......@@ -280,4 +282,7 @@ ZIG_EXTERN_C ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnum
280282ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const ZigClangDecl *decl);
281283
282284ZIG_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 *);
283288#endif