aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/c.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2022-10-09 01:48:26 -0400
committerJacob Young <jacobly0@users.noreply.github.com>2022-10-25 05:11:28 -0400
commita12535f5014cb2d4878581871287f17a31f28961 (patch)
tree7bbb5199f9797d19d1c3bb66e391c5d142fec65c /src/codegen/c.zig
parentf399dd107a2b0387ca54688741d6c3fa0109ed39 (diff)
downloadzig-a12535f5014cb2d4878581871287f17a31f28961.tar.gz
zig-a12535f5014cb2d4878581871287f17a31f28961.zip
cbe: fix global access
Diffstat (limited to 'src/codegen/c.zig')
-rw-r--r--src/codegen/c.zig24
1 files changed, 10 insertions, 14 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index 6b25cf8360..a60e6986a4 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -386,6 +386,10 @@ pub const DeclGen = struct {
val: Value,
decl_index: Decl.Index,
) error{ OutOfMemory, AnalysisFail }!void {
+ if (ty.isPtrAtRuntime() and !ty.elemType2().isFnOrHasRuntimeBits()) {
+ return dg.writeCValue(writer, CValue{ .undefined_ptr = ty });
+ }
+
if (ty.isSlice()) {
try writer.writeByte('(');
try dg.renderTypecast(writer, ty);
@@ -404,23 +408,15 @@ pub const DeclGen = struct {
// them). The analysis until now should ensure that the C function
// pointers are compatible. If they are not, then there is a bug
// somewhere and we should let the C compiler tell us about it.
- if (ty.castPtrToFn() == null) {
- // Determine if we must pointer cast.
- if (ty.eql(decl.ty, dg.module)) {
- try writer.writeByte('&');
- try dg.renderDeclName(writer, decl_index);
- return;
- }
-
+ const need_typecast = if (ty.castPtrToFn()) |_| false else !ty.eql(decl.ty, dg.module);
+ if (need_typecast) {
try writer.writeAll("((");
try dg.renderTypecast(writer, ty);
- try writer.writeAll(")&");
- try dg.renderDeclName(writer, decl_index);
try writer.writeByte(')');
- return;
}
-
+ try writer.writeByte('&');
try dg.renderDeclName(writer, decl_index);
+ if (need_typecast) try writer.writeByte(')');
}
// Renders a "parent" pointer by recursing to the root decl/variable
@@ -1830,7 +1826,7 @@ pub const DeclGen = struct {
if (dg.module.decl_exports.get(decl_index)) |exports| {
return writer.writeAll(exports[0].options.name);
- } else if (decl.val.tag() == .extern_fn) {
+ } else if (decl.isExtern()) {
return writer.writeAll(mem.sliceTo(decl.name, 0));
} else {
const gpa = dg.module.gpa;
@@ -1997,7 +1993,7 @@ pub fn genDecl(o: *Object) !void {
try o.dg.renderTypeAndName(fwd_decl_writer, o.dg.decl.ty, decl_c_value, .Mut, o.dg.decl.@"align");
try fwd_decl_writer.writeAll(";\n");
- if (variable.init.isUndefDeep()) {
+ if (variable.is_extern or variable.init.isUndefDeep()) {
return;
}