Skip to content

Commit 242d268

Browse files
authored
Merge pull request #21277 from antlilja/llvm-module-flags
LLVM: Set module flags through Builder instead of LLVM API bindings
2 parents 9bcb0e9 + 15b4c01 commit 242d268

File tree

6 files changed

+88
-98
lines changed

6 files changed

+88
-98
lines changed

src/codegen/llvm.zig

Lines changed: 80 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -898,58 +898,7 @@ pub const Object = struct {
898898
.{ .optimized = comp.root_mod.optimize_mode != .Debug },
899899
);
900900

901-
const i32_2 = try builder.intConst(.i32, 2);
902-
const i32_3 = try builder.intConst(.i32, 3);
903-
const debug_info_version = try builder.debugModuleFlag(
904-
try builder.metadataConstant(i32_2),
905-
try builder.metadataString("Debug Info Version"),
906-
try builder.metadataConstant(i32_3),
907-
);
908-
909-
switch (comp.config.debug_format) {
910-
.strip => unreachable,
911-
.dwarf => |f| {
912-
const i32_4 = try builder.intConst(.i32, 4);
913-
const dwarf_version = try builder.debugModuleFlag(
914-
try builder.metadataConstant(i32_2),
915-
try builder.metadataString("Dwarf Version"),
916-
try builder.metadataConstant(i32_4),
917-
);
918-
switch (f) {
919-
.@"32" => {
920-
try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
921-
debug_info_version,
922-
dwarf_version,
923-
});
924-
},
925-
.@"64" => {
926-
const dwarf64 = try builder.debugModuleFlag(
927-
try builder.metadataConstant(i32_2),
928-
try builder.metadataString("DWARF64"),
929-
try builder.metadataConstant(.@"1"),
930-
);
931-
try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
932-
debug_info_version,
933-
dwarf_version,
934-
dwarf64,
935-
});
936-
},
937-
}
938-
},
939-
.code_view => {
940-
const code_view = try builder.debugModuleFlag(
941-
try builder.metadataConstant(i32_2),
942-
try builder.metadataString("CodeView"),
943-
try builder.metadataConstant(.@"1"),
944-
);
945-
try builder.debugNamed(try builder.metadataString("llvm.module.flags"), &.{
946-
debug_info_version,
947-
code_view,
948-
});
949-
},
950-
}
951-
952-
try builder.debugNamed(try builder.metadataString("llvm.dbg.cu"), &.{debug_compile_unit});
901+
try builder.metadataNamed(try builder.metadataString("llvm.dbg.cu"), &.{debug_compile_unit});
953902
break :debug_info .{ debug_compile_unit, debug_enums_fwd_ref, debug_globals_fwd_ref };
954903
} else .{.none} ** 3;
955904

@@ -1149,6 +1098,84 @@ pub const Object = struct {
11491098
}
11501099
}
11511100

1101+
{
1102+
var module_flags = try std.ArrayList(Builder.Metadata).initCapacity(o.gpa, 6);
1103+
defer module_flags.deinit();
1104+
1105+
const behavior_error = try o.builder.metadataConstant(try o.builder.intConst(.i32, 1));
1106+
const behavior_warning = try o.builder.metadataConstant(try o.builder.intConst(.i32, 2));
1107+
const behavior_max = try o.builder.metadataConstant(try o.builder.intConst(.i32, 7));
1108+
const behavior_min = try o.builder.metadataConstant(try o.builder.intConst(.i32, 8));
1109+
1110+
const pic_level = target_util.picLevel(comp.root_mod.resolved_target.result);
1111+
if (comp.root_mod.pic) {
1112+
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1113+
behavior_min,
1114+
try o.builder.metadataString("PIC Level"),
1115+
try o.builder.metadataConstant(try o.builder.intConst(.i32, pic_level)),
1116+
));
1117+
}
1118+
1119+
if (comp.config.pie) {
1120+
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1121+
behavior_max,
1122+
try o.builder.metadataString("PIE Level"),
1123+
try o.builder.metadataConstant(try o.builder.intConst(.i32, pic_level)),
1124+
));
1125+
}
1126+
1127+
if (comp.root_mod.code_model != .default) {
1128+
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1129+
behavior_error,
1130+
try o.builder.metadataString("Code Model"),
1131+
try o.builder.metadataConstant(try o.builder.intConst(.i32, @as(i32, switch (comp.root_mod.code_model) {
1132+
.tiny => 0,
1133+
.small => 1,
1134+
.kernel => 2,
1135+
.medium => 3,
1136+
.large => 4,
1137+
else => unreachable,
1138+
}))),
1139+
));
1140+
}
1141+
1142+
if (!o.builder.strip) {
1143+
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1144+
behavior_warning,
1145+
try o.builder.metadataString("Debug Info Version"),
1146+
try o.builder.metadataConstant(try o.builder.intConst(.i32, 3)),
1147+
));
1148+
1149+
switch (comp.config.debug_format) {
1150+
.strip => unreachable,
1151+
.dwarf => |f| {
1152+
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1153+
behavior_max,
1154+
try o.builder.metadataString("Dwarf Version"),
1155+
try o.builder.metadataConstant(try o.builder.intConst(.i32, 4)),
1156+
));
1157+
1158+
if (f == .@"64") {
1159+
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1160+
behavior_max,
1161+
try o.builder.metadataString("DWARF64"),
1162+
try o.builder.metadataConstant(.@"1"),
1163+
));
1164+
}
1165+
},
1166+
.code_view => {
1167+
module_flags.appendAssumeCapacity(try o.builder.metadataModuleFlag(
1168+
behavior_warning,
1169+
try o.builder.metadataString("CodeView"),
1170+
try o.builder.metadataConstant(.@"1"),
1171+
));
1172+
},
1173+
}
1174+
}
1175+
1176+
try o.builder.metadataNamed(try o.builder.metadataString("llvm.module.flags"), module_flags.items);
1177+
}
1178+
11521179
const target_triple_sentinel =
11531180
try o.gpa.dupeZ(u8, o.builder.target_triple.slice(&o.builder).?);
11541181
defer o.gpa.free(target_triple_sentinel);
@@ -1235,14 +1262,13 @@ pub const Object = struct {
12351262
}
12361263

12371264
const optimize_mode = comp.root_mod.optimize_mode;
1238-
const pic = comp.root_mod.pic;
12391265

12401266
const opt_level: llvm.CodeGenOptLevel = if (optimize_mode == .Debug)
12411267
.None
12421268
else
12431269
.Aggressive;
12441270

1245-
const reloc_mode: llvm.RelocMode = if (pic)
1271+
const reloc_mode: llvm.RelocMode = if (comp.root_mod.pic)
12461272
.PIC
12471273
else if (comp.config.link_mode == .dynamic)
12481274
llvm.RelocMode.DynamicNoPIC
@@ -1276,13 +1302,6 @@ pub const Object = struct {
12761302
);
12771303
errdefer target_machine.dispose();
12781304

1279-
const large_pic = target_util.usesLargePIC(comp.root_mod.resolved_target.result);
1280-
1281-
if (pic) module.setModulePICLevel(large_pic);
1282-
if (comp.config.pie) module.setModulePIELevel(large_pic);
1283-
1284-
if (code_model != .Default) module.setModuleCodeModel(code_model);
1285-
12861305
if (comp.llvm_opt_bisect_limit >= 0) {
12871306
context.setOptBisectLimit(comp.llvm_opt_bisect_limit);
12881307
}

src/codegen/llvm/Builder.zig

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11899,10 +11899,10 @@ pub fn trailingMetadataStringAssumeCapacity(self: *Builder) MetadataString {
1189911899
return @enumFromInt(gop.index);
1190011900
}
1190111901

11902-
pub fn debugNamed(self: *Builder, name: MetadataString, operands: []const Metadata) Allocator.Error!void {
11902+
pub fn metadataNamed(self: *Builder, name: MetadataString, operands: []const Metadata) Allocator.Error!void {
1190311903
try self.metadata_extra.ensureUnusedCapacity(self.gpa, operands.len);
1190411904
try self.metadata_named.ensureUnusedCapacity(self.gpa, 1);
11905-
self.debugNamedAssumeCapacity(name, operands);
11905+
self.metadataNamedAssumeCapacity(name, operands);
1190611906
}
1190711907

1190811908
fn metadataNone(self: *Builder) Allocator.Error!Metadata {
@@ -12213,14 +12213,14 @@ pub fn strTuple(
1221312213
return self.strTupleAssumeCapacity(str, elements);
1221412214
}
1221512215

12216-
pub fn debugModuleFlag(
12216+
pub fn metadataModuleFlag(
1221712217
self: *Builder,
1221812218
behavior: Metadata,
1221912219
name: MetadataString,
1222012220
constant: Metadata,
1222112221
) Allocator.Error!Metadata {
1222212222
try self.ensureUnusedMetadataCapacity(1, Metadata.ModuleFlag, 0);
12223-
return self.debugModuleFlagAssumeCapacity(behavior, name, constant);
12223+
return self.metadataModuleFlagAssumeCapacity(behavior, name, constant);
1222412224
}
1222512225

1222612226
pub fn debugLocalVar(
@@ -12365,8 +12365,7 @@ fn metadataDistinctAssumeCapacity(self: *Builder, tag: Metadata.Tag, value: anyt
1236512365
return @enumFromInt(gop.index);
1236612366
}
1236712367

12368-
fn debugNamedAssumeCapacity(self: *Builder, name: MetadataString, operands: []const Metadata) void {
12369-
assert(!self.strip);
12368+
fn metadataNamedAssumeCapacity(self: *Builder, name: MetadataString, operands: []const Metadata) void {
1237012369
assert(name != .none);
1237112370
const extra_index: u32 = @intCast(self.metadata_extra.items.len);
1237212371
self.metadata_extra.appendSliceAssumeCapacity(@ptrCast(operands));
@@ -12949,13 +12948,12 @@ fn strTupleAssumeCapacity(
1294912948
return @enumFromInt(gop.index);
1295012949
}
1295112950

12952-
fn debugModuleFlagAssumeCapacity(
12951+
fn metadataModuleFlagAssumeCapacity(
1295312952
self: *Builder,
1295412953
behavior: Metadata,
1295512954
name: MetadataString,
1295612955
constant: Metadata,
1295712956
) Metadata {
12958-
assert(!self.strip);
1295912957
return self.metadataSimpleAssumeCapacity(.module_flag, Metadata.ModuleFlag{
1296012958
.behavior = behavior,
1296112959
.name = name,

src/codegen/llvm/bindings.zig

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,6 @@ pub const Context = opaque {
5151
pub const Module = opaque {
5252
pub const dispose = LLVMDisposeModule;
5353
extern fn LLVMDisposeModule(*Module) void;
54-
55-
pub const setModulePICLevel = ZigLLVMSetModulePICLevel;
56-
extern fn ZigLLVMSetModulePICLevel(module: *Module, big: bool) void;
57-
58-
pub const setModulePIELevel = ZigLLVMSetModulePIELevel;
59-
extern fn ZigLLVMSetModulePIELevel(module: *Module, large: bool) void;
60-
61-
pub const setModuleCodeModel = ZigLLVMSetModuleCodeModel;
62-
extern fn ZigLLVMSetModuleCodeModel(module: *Module, code_model: CodeModel) void;
6354
};
6455

6556
pub const disposeMessage = LLVMDisposeMessage;

src/target.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ pub fn requiresPIC(target: std.Target, linking_libc: bool) bool {
4949
(target.abi == .ohos and target.cpu.arch == .aarch64);
5050
}
5151

52-
pub fn usesLargePIC(target: std.Target) bool {
52+
pub fn picLevel(target: std.Target) u32 {
5353
// MIPS always uses PIC level 1; other platforms vary in their default PIC levels, but they
5454
// support both level 1 and 2, in which case we prefer 2.
55-
return !target.cpu.arch.isMIPS();
55+
return if (target.cpu.arch.isMIPS()) 1 else 2;
5656
}
5757

5858
/// This is not whether the target supports Position Independent Code, but whether the -fPIC

src/zig_llvm.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -435,20 +435,6 @@ void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv) {
435435
cl::ParseCommandLineOptions(argc, argv);
436436
}
437437

438-
void ZigLLVMSetModulePICLevel(LLVMModuleRef module, bool big) {
439-
unwrap(module)->setPICLevel(big ? PICLevel::Level::BigPIC : PICLevel::Level::SmallPIC);
440-
}
441-
442-
void ZigLLVMSetModulePIELevel(LLVMModuleRef module, bool large) {
443-
unwrap(module)->setPIELevel(large ? PIELevel::Level::Large : PIELevel::Level::Small);
444-
}
445-
446-
void ZigLLVMSetModuleCodeModel(LLVMModuleRef module, LLVMCodeModel code_model) {
447-
bool JIT;
448-
unwrap(module)->setCodeModel(*unwrap(code_model, JIT));
449-
assert(!JIT);
450-
}
451-
452438
bool ZigLLVMWriteImportLibrary(const char *def_path, const ZigLLVM_ArchType arch,
453439
const char *output_lib_path, bool kill_at)
454440
{

src/zig_llvm.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,6 @@ enum ZigLLVM_CallingConv {
155155
ZigLLVM_MaxID = 1023,
156156
};
157157

158-
ZIG_EXTERN_C void ZigLLVMSetModulePICLevel(LLVMModuleRef module, bool big);
159-
ZIG_EXTERN_C void ZigLLVMSetModulePIELevel(LLVMModuleRef module, bool large);
160-
ZIG_EXTERN_C void ZigLLVMSetModuleCodeModel(LLVMModuleRef module, LLVMCodeModel code_model);
161-
162158
ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv);
163159

164160
// synchronize with llvm/include/ADT/Triple.h::ArchType

0 commit comments

Comments
 (0)