Skip to content

Commit 6f34d08

Browse files
committed
translate-c: move some code to the C API
See #1964
1 parent 5f8dbca commit 6f34d08

File tree

3 files changed

+52
-22
lines changed

3 files changed

+52
-22
lines changed

src/translate_c.cpp

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ static TransScopeBlock *trans_scope_block_find(TransScope *scope);
114114

115115
static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record_decl);
116116
static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl);
117-
static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *typedef_decl);
117+
static AstNode *resolve_typedef_decl(Context *c, const ZigClangTypedefNameDecl *typedef_decl);
118118

119119
static 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

595-
static uint32_t qual_type_int_bit_width(Context *c, const clang::QualType &qt, ZigClangSourceLocation source_loc) {
595+
static 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

639-
static AstNode *qual_type_to_log2_int_ref(Context *c, const clang::QualType &qt,
639+
static 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

672-
static bool qual_type_child_is_fn_proto(const clang::QualType &qt) {
672+
static 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

3955-
static AstNode *resolve_typdef_as_builtin(Context *c, const clang::TypedefNameDecl *typedef_decl, const char *primitive_name) {
3957+
static 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

3961-
static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *typedef_decl) {
3962-
auto existing_entry = c->decl_table.maybe_get((void*)typedef_decl->getCanonicalDecl());
3963+
static 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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,11 @@ const ZigClangTagDecl *ZigClangEnumDecl_getCanonicalDecl(const ZigClangEnumDecl
233233
return reinterpret_cast<const ZigClangTagDecl *>(tag_decl);
234234
}
235235

236+
const 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+
236241
const 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

281+
ZigClangSourceLocation ZigClangTypedefNameDecl_getLocation(const ZigClangTypedefNameDecl *self) {
282+
auto casted = reinterpret_cast<const clang::TypedefNameDecl *>(self);
283+
return bitcast(casted->getLocation());
284+
}
285+
276286
bool 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
282292
ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnumDecl *self) {
283293
return bitcast(reinterpret_cast<const clang::EnumDecl *>(self)->getIntegerType());
284294
}
295+
296+
const 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+
302+
ZigClangQualType 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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,12 +264,14 @@ ZIG_EXTERN_C const ZigClangEnumDecl *ZigClangEnumType_getDecl(const ZigClangEnum
264264

265265
ZIG_EXTERN_C const ZigClangTagDecl *ZigClangRecordDecl_getCanonicalDecl(const ZigClangRecordDecl *record_decl);
266266
ZIG_EXTERN_C const ZigClangTagDecl *ZigClangEnumDecl_getCanonicalDecl(const ZigClangEnumDecl *);
267+
ZIG_EXTERN_C const ZigClangTypedefNameDecl *ZigClangTypedefNameDecl_getCanonicalDecl(const ZigClangTypedefNameDecl *);
267268

268269
ZIG_EXTERN_C const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *);
269270
ZIG_EXTERN_C const ZigClangEnumDecl *ZigClangEnumDecl_getDefinition(const ZigClangEnumDecl *);
270271

271272
ZIG_EXTERN_C ZigClangSourceLocation ZigClangRecordDecl_getLocation(const ZigClangRecordDecl *);
272273
ZIG_EXTERN_C ZigClangSourceLocation ZigClangEnumDecl_getLocation(const ZigClangEnumDecl *);
274+
ZIG_EXTERN_C ZigClangSourceLocation ZigClangTypedefNameDecl_getLocation(const ZigClangTypedefNameDecl *);
273275

274276
ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const ZigClangRecordDecl *record_decl);
275277
ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const ZigClangRecordDecl *record_decl);
@@ -280,4 +282,7 @@ ZIG_EXTERN_C ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnum
280282
ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const ZigClangDecl *decl);
281283

282284
ZIG_EXTERN_C bool ZigClangSourceLocation_eq(ZigClangSourceLocation a, ZigClangSourceLocation b);
285+
286+
ZIG_EXTERN_C const ZigClangTypedefNameDecl *ZigClangTypedefType_getDecl(const ZigClangTypedefType *);
287+
ZIG_EXTERN_C ZigClangQualType ZigClangTypedefNameDecl_getUnderlyingType(const ZigClangTypedefNameDecl *);
283288
#endif

0 commit comments

Comments
 (0)