Skip to content

Commit b960f1d

Browse files
committed
translate-c: move some code to the C API
See #1964
1 parent 4172fe9 commit b960f1d

File tree

3 files changed

+60
-24
lines changed

3 files changed

+60
-24
lines changed

src/translate_c.cpp

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ static TransScopeSwitch *trans_scope_switch_create(Context *c, TransScope *paren
113113
static TransScopeBlock *trans_scope_block_find(TransScope *scope);
114114

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

119119
static 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
11281128
}
11291129
case clang::Type::Enum:
11301130
{
1131-
const clang::EnumType *enum_ty = static_cast<const clang::EnumType*>(ty);
1132-
return resolve_enum_decl(c, enum_ty->getDecl());
1131+
const ZigClangEnumType *enum_ty = reinterpret_cast<const ZigClangEnumType*>(ty);
1132+
return resolve_enum_decl(c, ZigClangEnumType_getDecl(enum_ty));
11331133
}
11341134
case clang::Type::ConstantArray:
11351135
{
@@ -2673,8 +2673,8 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *
26732673

26742674
case clang::Type::Enum:
26752675
{
2676-
const clang::EnumType *enum_ty = static_cast<const clang::EnumType*>(ty);
2677-
AstNode *enum_type = resolve_enum_decl(c, enum_ty->getDecl());
2676+
const ZigClangEnumType *enum_ty = reinterpret_cast<const ZigClangEnumType *>(ty);
2677+
AstNode *enum_type = resolve_enum_decl(c, ZigClangEnumType_getDecl(enum_ty));
26782678
return to_enum_zero_cmp(c, res, enum_type);
26792679
}
26802680

@@ -4013,23 +4013,23 @@ static AstNode *resolve_typedef_decl(Context *c, const clang::TypedefNameDecl *t
40134013
return symbol_node;
40144014
}
40154015

4016-
struct AstNode *demote_enum_to_opaque(Context *c, const clang::EnumDecl *enum_decl,
4017-
Buf *full_type_name, Buf *bare_name)
4016+
struct AstNode *demote_enum_to_opaque(Context *c, const ZigClangEnumDecl *enum_decl, Buf *full_type_name,
4017+
Buf *bare_name)
40184018
{
40194019
AstNode *opaque_node = trans_create_node_opaque(c);
40204020
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);
40224022
return opaque_node;
40234023
}
40244024
AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
40254025
add_global_weak_alias(c, bare_name, full_type_name);
40264026
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);
40284028
return symbol_node;
40294029
}
40304030

4031-
static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl) {
4032-
auto existing_entry = c->decl_table.maybe_get((void*)enum_decl->getCanonicalDecl());
4031+
static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl) {
4032+
auto existing_entry = c->decl_table.maybe_get(ZigClangEnumDecl_getCanonicalDecl(enum_decl));
40334033
if (existing_entry) {
40344034
return existing_entry->value;
40354035
}
@@ -4039,24 +4039,26 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)
40394039
Buf *bare_name = is_anonymous ? nullptr : buf_create_from_str(raw_name);
40404040
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);
40434043
if (!enum_def) {
40444044
return demote_enum_to_opaque(c, enum_decl, full_type_name, bare_name);
40454045
}
40464046

40474047

40484048
bool pure_enum = true;
40494049
uint32_t field_count = 0;
4050-
for (auto it = enum_def->enumerator_begin(),
4051-
it_end = enum_def->enumerator_end();
4050+
for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(),
4051+
it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end();
40524052
it != it_end; ++it, field_count += 1)
40534053
{
40544054
const clang::EnumConstantDecl *enum_const = *it;
40554055
if (enum_const->getInitExpr()) {
40564056
pure_enum = false;
40574057
}
40584058
}
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));
40604062
assert(tag_int_type);
40614063

40624064
AstNode *enum_node = trans_create_node(c, NodeTypeContainerDecl);
@@ -4065,15 +4067,15 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)
40654067
// TODO only emit this tag type if the enum tag type is not the default.
40664068
// I don't know what the default is, need to figure out how clang is deciding.
40674069
// it appears to at least be different across gcc/msvc
4068-
if (!c_is_builtin_type(c, enum_decl->getIntegerType(), clang::BuiltinType::UInt) &&
4069-
!c_is_builtin_type(c, enum_decl->getIntegerType(), clang::BuiltinType::Int))
4070+
if (!c_is_builtin_type(c, bitcast(ZigClangEnumDecl_getIntegerType(enum_decl)), clang::BuiltinType::UInt) &&
4071+
!c_is_builtin_type(c, bitcast(ZigClangEnumDecl_getIntegerType(enum_decl)), clang::BuiltinType::Int))
40704072
{
40714073
enum_node->data.container_decl.init_arg_expr = tag_int_type;
40724074
}
40734075
enum_node->data.container_decl.fields.resize(field_count);
40744076
uint32_t i = 0;
4075-
for (auto it = enum_def->enumerator_begin(),
4076-
it_end = enum_def->enumerator_end();
4077+
for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(),
4078+
it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end();
40774079
it != it_end; ++it, i += 1)
40784080
{
40794081
const clang::EnumConstantDecl *enum_const = *it;
@@ -4106,13 +4108,13 @@ static AstNode *resolve_enum_decl(Context *c, const clang::EnumDecl *enum_decl)
41064108
}
41074109

41084110
if (is_anonymous) {
4109-
c->decl_table.put(enum_decl->getCanonicalDecl(), enum_node);
4111+
c->decl_table.put(ZigClangEnumDecl_getCanonicalDecl(enum_decl), enum_node);
41104112
return enum_node;
41114113
} else {
41124114
AstNode *symbol_node = trans_create_node_symbol(c, full_type_name);
41134115
add_global_weak_alias(c, bare_name, full_type_name);
41144116
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);
41164118
return enum_node;
41174119
}
41184120
}
@@ -4398,7 +4400,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *zdecl) {
43984400
resolve_typedef_decl(c, static_cast<const clang::TypedefNameDecl *>(decl));
43994401
break;
44004402
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));
44024404
break;
44034405
case clang::Decl::Record:
44044406
resolve_record_decl(c, (const ZigClangRecordDecl *)(decl));

src/zig_clang.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,17 +218,33 @@ const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *r
218218
return reinterpret_cast<const ZigClangRecordDecl *>(record_decl);
219219
}
220220

221+
const 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+
221226
const ZigClangTagDecl *ZigClangRecordDecl_getCanonicalDecl(const ZigClangRecordDecl *record_decl) {
222227
const clang::TagDecl *tag_decl = reinterpret_cast<const clang::RecordDecl*>(record_decl)->getCanonicalDecl();
223228
return reinterpret_cast<const ZigClangTagDecl *>(tag_decl);
224229
}
225230

231+
const 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+
226236
const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *zig_record_decl) {
227237
const clang::RecordDecl *record_decl = reinterpret_cast<const clang::RecordDecl *>(zig_record_decl);
228238
const clang::RecordDecl *definition = record_decl->getDefinition();
229239
return reinterpret_cast<const ZigClangRecordDecl *>(definition);
230240
}
231241

242+
const 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+
232248
bool ZigClangRecordDecl_isUnion(const ZigClangRecordDecl *record_decl) {
233249
return reinterpret_cast<const clang::RecordDecl*>(record_decl)->isUnion();
234250
}
@@ -252,8 +268,17 @@ ZigClangSourceLocation ZigClangRecordDecl_getLocation(const ZigClangRecordDecl *
252268
return bitcast(record_decl->getLocation());
253269
}
254270

271+
ZigClangSourceLocation ZigClangEnumDecl_getLocation(const ZigClangEnumDecl *self) {
272+
auto casted = reinterpret_cast<const clang::EnumDecl *>(self);
273+
return bitcast(casted->getLocation());
274+
}
275+
255276
bool ZigClangSourceLocation_eq(ZigClangSourceLocation zig_a, ZigClangSourceLocation zig_b) {
256277
clang::SourceLocation a = bitcast(zig_a);
257278
clang::SourceLocation b = bitcast(zig_b);
258279
return a == b;
259280
}
281+
282+
ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnumDecl *self) {
283+
return bitcast(reinterpret_cast<const clang::EnumDecl *>(self)->getIntegerType());
284+
}

src/zig_clang.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,22 @@ ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *, voi
260260
bool (*Fn)(void *context, const ZigClangDecl *decl));
261261

262262
ZIG_EXTERN_C const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *record_ty);
263+
ZIG_EXTERN_C const ZigClangEnumDecl *ZigClangEnumType_getDecl(const ZigClangEnumType *record_ty);
263264

264265
ZIG_EXTERN_C const ZigClangTagDecl *ZigClangRecordDecl_getCanonicalDecl(const ZigClangRecordDecl *record_decl);
266+
ZIG_EXTERN_C const ZigClangTagDecl *ZigClangEnumDecl_getCanonicalDecl(const ZigClangEnumDecl *);
267+
268+
ZIG_EXTERN_C const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *);
269+
ZIG_EXTERN_C const ZigClangEnumDecl *ZigClangEnumDecl_getDefinition(const ZigClangEnumDecl *);
270+
271+
ZIG_EXTERN_C ZigClangSourceLocation ZigClangRecordDecl_getLocation(const ZigClangRecordDecl *);
272+
ZIG_EXTERN_C ZigClangSourceLocation ZigClangEnumDecl_getLocation(const ZigClangEnumDecl *);
273+
265274
ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const ZigClangRecordDecl *record_decl);
266275
ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const ZigClangRecordDecl *record_decl);
267276
ZIG_EXTERN_C bool ZigClangRecordDecl_isAnonymousStructOrUnion(const ZigClangRecordDecl *record_decl);
268-
ZIG_EXTERN_C const ZigClangRecordDecl *ZigClangRecordDecl_getDefinition(const ZigClangRecordDecl *);
269-
ZIG_EXTERN_C ZigClangSourceLocation ZigClangRecordDecl_getLocation(const ZigClangRecordDecl *);
277+
278+
ZIG_EXTERN_C ZigClangQualType ZigClangEnumDecl_getIntegerType(const ZigClangEnumDecl *);
270279

271280
ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const ZigClangDecl *decl);
272281

0 commit comments

Comments
 (0)