Global
All checks were successful
All checks were successful
This commit is contained in:
parent
6c244c1243
commit
7b10a836f8
@ -512,6 +512,7 @@ pub const Value = struct {
|
||||
variable_reference: *Variable,
|
||||
local,
|
||||
argument,
|
||||
global,
|
||||
intrinsic: Intrinsic,
|
||||
dereference: *Value,
|
||||
call: Call,
|
||||
@ -959,7 +960,10 @@ pub const Module = struct {
|
||||
.call_no_builtins = false,
|
||||
|
||||
// DEFINITION-SITE ATTRIBUTES
|
||||
.definition_frame_pointer_kind = .none,
|
||||
.definition_frame_pointer_kind = switch (module.has_debug_info) {
|
||||
true => .all,
|
||||
false => .none,
|
||||
},
|
||||
.definition_less_precise_fpmad = false,
|
||||
.definition_null_pointer_is_valid = false,
|
||||
.definition_no_trapping_fp_math = false,
|
||||
@ -2267,6 +2271,30 @@ pub const Module = struct {
|
||||
module.offset -= global_string.len;
|
||||
}
|
||||
}
|
||||
|
||||
if (!global_keyword) {
|
||||
const v = module.parse_value(.{});
|
||||
module.skip_space();
|
||||
module.expect_character(';');
|
||||
|
||||
const global = module.globals.add();
|
||||
const global_storage = module.values.add();
|
||||
global_storage.* = .{
|
||||
.bb = .global,
|
||||
};
|
||||
global.* = .{
|
||||
.variable = .{
|
||||
.storage = global_storage,
|
||||
.initial_value = v,
|
||||
.type = global_type,
|
||||
.scope = &module.scope,
|
||||
.name = global_name,
|
||||
.line = global_line,
|
||||
.column = global_column,
|
||||
},
|
||||
.linkage = .internal,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2761,6 +2789,29 @@ pub const Module = struct {
|
||||
}
|
||||
}
|
||||
},
|
||||
.global => {
|
||||
module.analyze(null, global.variable.initial_value, .{ .type = global.variable.type });
|
||||
const global_variable = module.llvm.module.create_global_variable(.{
|
||||
.linkage = switch (global.linkage) {
|
||||
.internal => .InternalLinkage,
|
||||
.external => .ExternalLinkage,
|
||||
},
|
||||
.name = global.variable.name,
|
||||
.initial_value = global.variable.initial_value.llvm.?.to_constant(),
|
||||
.type = global.variable.type.?.resolve(module).handle,
|
||||
});
|
||||
global_variable.to_value().set_alignment(global.variable.type.?.get_byte_alignment());
|
||||
global.variable.storage.?.llvm = global_variable.to_value();
|
||||
global.variable.storage.?.type = module.get_pointer_type(.{ .type = global.variable.type.? });
|
||||
|
||||
if (module.has_debug_info) {
|
||||
const linkage_name = global.variable.name;
|
||||
const local_to_unit = global.linkage == .internal;
|
||||
const alignment = 0; // TODO
|
||||
const global_variable_expression = module.llvm.di_builder.create_global_variable(module.scope.llvm.?, global.variable.name, linkage_name, module.llvm.file, global.variable.line, global.variable.type.?.llvm.debug.?, local_to_unit, module.llvm.di_builder.null_expression(), alignment);
|
||||
global_variable.add_debug_info(global_variable_expression);
|
||||
}
|
||||
},
|
||||
else => @trap(),
|
||||
}
|
||||
}
|
||||
@ -2828,12 +2879,12 @@ pub const Module = struct {
|
||||
type: ?*Type = null,
|
||||
};
|
||||
|
||||
pub fn analyze(module: *Module, function: *Global, value: *Value, analysis: ValueAnalysis) void {
|
||||
pub fn analyze(module: *Module, function: ?*Global, value: *Value, analysis: ValueAnalysis) void {
|
||||
module.analyze_value_type(function, value, analysis);
|
||||
module.emit_value(function, value);
|
||||
}
|
||||
|
||||
pub fn emit_value(module: *Module, function: *Global, value: *Value) void {
|
||||
pub fn emit_value(module: *Module, function: ?*Global, value: *Value) void {
|
||||
const value_type = value.type orelse unreachable;
|
||||
assert(value.llvm == null);
|
||||
|
||||
@ -3345,7 +3396,7 @@ pub const Module = struct {
|
||||
value.llvm = llvm_value;
|
||||
}
|
||||
|
||||
pub fn analyze_value_type(module: *Module, function: *Global, value: *Value, analysis: ValueAnalysis) void {
|
||||
pub fn analyze_value_type(module: *Module, function: ?*Global, value: *Value, analysis: ValueAnalysis) void {
|
||||
assert(value.type == null);
|
||||
assert(value.llvm == null);
|
||||
|
||||
|
@ -197,4 +197,6 @@ const names = &[_][]const u8{
|
||||
"pointer",
|
||||
"pointer_cast",
|
||||
"u1_return",
|
||||
"local_type_inference",
|
||||
"global",
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user