authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-08-19 16:29:45-07:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-08-27 00:41:49+01:00
log72e00805a61719174b1668d5ce3cbef8338e4690
tree302f039fc8f31e4b4afbc09f503bbf085aadaafb
parentf2d7096bb9d21f5668d22567d1c96b95970cb480
signaturelock-open Commit is signed but in an unrecognized format.

llvm.Builder: add support for more instruction metadata

mlugg: this is cherry-picked from Andrew's nosanitize branch (with Jacob's fixes squashed in) since I needed this for `unpredictable` and `prof` metadata. The nosanitize-specific changes are reverted in the next commit. Co-authored-by: Jacob Young <jacobly0@users.noreply.github.com>

2 files changed, 254 insertions(+), 106 deletions(-)

src/codegen/llvm/Builder.zig+78-77
......@@ -7697,6 +7697,7 @@ pub const MetadataString = enum(u32) {
76977697
76987698pub const Metadata = enum(u32) {
76997699 none = 0,
7700 empty_tuple = 1,
77007701 _,
77017702
77027703 const first_forward_reference = 1 << 29;
......@@ -8355,7 +8356,7 @@ pub const Metadata = enum(u32) {
83558356};
83568357
83578358pub fn init(options: Options) Allocator.Error!Builder {
8358 var self = Builder{
8359 var self: Builder = .{
83598360 .gpa = options.allocator,
83608361 .strip = options.strip,
83618362
......@@ -8458,6 +8459,7 @@ pub fn init(options: Options) Allocator.Error!Builder {
84588459
84598460 try self.metadata_string_indices.append(self.gpa, 0);
84608461 assert(try self.metadataString("") == .none);
8462 assert(try self.debugTuple(&.{}) == .empty_tuple);
84618463
84628464 return self;
84638465}
......@@ -13759,7 +13761,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1375913761 const MetadataKindBlock = ir.MetadataKindBlock;
1376013762 var metadata_kind_block = try module_block.enterSubBlock(MetadataKindBlock, true);
1376113763
13762 inline for (@typeInfo(ir.MetadataKind).Enum.fields) |field| {
13764 inline for (@typeInfo(ir.FixedMetadataKind).Enum.fields) |field| {
1376313765 try metadata_kind_block.writeAbbrev(MetadataKindBlock.Kind{
1376413766 .id = field.value,
1376513767 .name = field.name,
......@@ -14046,7 +14048,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1404614048 else
1404714049 -%val << 1 | 1);
1404814050 }
14049 try metadata_block.writeUnabbrev(MetadataBlock.Enumerator.id, record.items);
14051 try metadata_block.writeUnabbrev(@intFromEnum(MetadataBlock.Enumerator.id), record.items);
1405014052 continue;
1405114053 };
1405214054 try metadata_block.writeAbbrevAdapted(MetadataBlock.Enumerator{
......@@ -14177,7 +14179,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1417714179
1417814180 try metadata_block.writeAbbrev(MetadataBlock.GlobalDeclAttachment{
1417914181 .value = @enumFromInt(constant_adapter.getConstantIndex(global.toConst())),
14180 .kind = ir.MetadataKind.dbg,
14182 .kind = .dbg,
1418114183 .metadata = @enumFromInt(metadata_adapter.getMetadataIndex(global_ptr.dbg) - 1),
1418214184 });
1418314185 }
......@@ -14220,20 +14222,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1422014222 constant_adapter: ConstantAdapter,
1422114223 metadata_adapter: MetadataAdapter,
1422214224 func: *const Function,
14223 instruction_index: u32 = 0,
14224
14225 pub fn init(
14226 const_adapter: ConstantAdapter,
14227 meta_adapter: MetadataAdapter,
14228 func: *const Function,
14229 ) @This() {
14230 return .{
14231 .constant_adapter = const_adapter,
14232 .metadata_adapter = meta_adapter,
14233 .func = func,
14234 .instruction_index = 0,
14235 };
14236 }
14225 instruction_index: Function.Instruction.Index,
1423714226
1423814227 pub fn get(adapter: @This(), value: anytype, comptime field_name: []const u8) @TypeOf(value) {
1423914228 _ = field_name;
......@@ -14282,19 +14271,12 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1428214271 }
1428314272
1428414273 pub fn offset(adapter: @This()) u32 {
14285 return @as(
14286 Function.Instruction.Index,
14287 @enumFromInt(adapter.instruction_index),
14288 ).valueIndex(adapter.func) + adapter.firstInstr();
14274 return adapter.instruction_index.valueIndex(adapter.func) + adapter.firstInstr();
1428914275 }
1429014276
1429114277 fn firstInstr(adapter: @This()) u32 {
1429214278 return adapter.constant_adapter.numConstants();
1429314279 }
14294
14295 pub fn next(adapter: *@This()) void {
14296 adapter.instruction_index += 1;
14297 }
1429814280 };
1429914281
1430014282 for (self.functions.items, 0..) |func, func_index| {
......@@ -14307,7 +14289,12 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1430714289
1430814290 try function_block.writeAbbrev(FunctionBlock.DeclareBlocks{ .num_blocks = func.blocks.len });
1430914291
14310 var adapter = FunctionAdapter.init(constant_adapter, metadata_adapter, &func);
14292 var adapter: FunctionAdapter = .{
14293 .constant_adapter = constant_adapter,
14294 .metadata_adapter = metadata_adapter,
14295 .func = &func,
14296 .instruction_index = @enumFromInt(0),
14297 };
1431114298
1431214299 // Emit function level metadata block
1431314300 if (!func.strip and func.debug_values.len > 0) {
......@@ -14330,21 +14317,23 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1433014317 var has_location = false;
1433114318
1433214319 var block_incoming_len: u32 = undefined;
14333 for (0..func.instructions.len) |instr_index| {
14334 const tag = tags[instr_index];
14335
14320 for (tags, datas, 0..) |tag, data, instr_index| {
14321 adapter.instruction_index = @enumFromInt(instr_index);
1433614322 record.clearRetainingCapacity();
1433714323
1433814324 switch (tag) {
14339 .block => block_incoming_len = datas[instr_index],
14340 .arg => {},
14325 .arg => continue,
14326 .block => {
14327 block_incoming_len = data;
14328 continue;
14329 },
1434114330 .@"unreachable" => try function_block.writeAbbrev(FunctionBlock.Unreachable{}),
1434214331 .call,
1434314332 .@"musttail call",
1434414333 .@"notail call",
1434514334 .@"tail call",
1434614335 => |kind| {
14347 var extra = func.extraDataTrail(Function.Instruction.Call, datas[instr_index]);
14336 var extra = func.extraDataTrail(Function.Instruction.Call, data);
1434814337
1434914338 const call_conv = extra.data.info.call_conv;
1435014339 const args = extra.trail.next(extra.data.args_len, Value, &func);
......@@ -14367,7 +14356,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1436714356 .@"notail call fast",
1436814357 .@"tail call fast",
1436914358 => |kind| {
14370 var extra = func.extraDataTrail(Function.Instruction.Call, datas[instr_index]);
14359 var extra = func.extraDataTrail(Function.Instruction.Call, data);
1437114360
1437214361 const call_conv = extra.data.info.call_conv;
1437314362 const args = extra.trail.next(extra.data.args_len, Value, &func);
......@@ -14405,7 +14394,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1440514394 .srem,
1440614395 .ashr,
1440714396 => |kind| {
14408 const extra = func.extraData(Function.Instruction.Binary, datas[instr_index]);
14397 const extra = func.extraData(Function.Instruction.Binary, data);
1440914398 try function_block.writeAbbrev(FunctionBlock.Binary{
1441014399 .opcode = kind.toBinaryOpcode(),
1441114400 .lhs = adapter.getOffsetValueIndex(extra.lhs),
......@@ -14417,7 +14406,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1441714406 .@"lshr exact",
1441814407 .@"ashr exact",
1441914408 => |kind| {
14420 const extra = func.extraData(Function.Instruction.Binary, datas[instr_index]);
14409 const extra = func.extraData(Function.Instruction.Binary, data);
1442114410 try function_block.writeAbbrev(FunctionBlock.BinaryExact{
1442214411 .opcode = kind.toBinaryOpcode(),
1442314412 .lhs = adapter.getOffsetValueIndex(extra.lhs),
......@@ -14437,7 +14426,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1443714426 .@"shl nuw",
1443814427 .@"shl nuw nsw",
1443914428 => |kind| {
14440 const extra = func.extraData(Function.Instruction.Binary, datas[instr_index]);
14429 const extra = func.extraData(Function.Instruction.Binary, data);
1444114430 try function_block.writeAbbrev(FunctionBlock.BinaryNoWrap{
1444214431 .opcode = kind.toBinaryOpcode(),
1444314432 .lhs = adapter.getOffsetValueIndex(extra.lhs),
......@@ -14468,7 +14457,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1446814457 .@"frem fast",
1446914458 .@"fsub fast",
1447014459 => |kind| {
14471 const extra = func.extraData(Function.Instruction.Binary, datas[instr_index]);
14460 const extra = func.extraData(Function.Instruction.Binary, data);
1447214461 try function_block.writeAbbrev(FunctionBlock.BinaryFast{
1447314462 .opcode = kind.toBinaryOpcode(),
1447414463 .lhs = adapter.getOffsetValueIndex(extra.lhs),
......@@ -14479,7 +14468,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1447914468 .alloca,
1448014469 .@"alloca inalloca",
1448114470 => |kind| {
14482 const extra = func.extraData(Function.Instruction.Alloca, datas[instr_index]);
14471 const extra = func.extraData(Function.Instruction.Alloca, data);
1448314472 const alignment = extra.info.alignment.toLlvm();
1448414473 try function_block.writeAbbrev(FunctionBlock.Alloca{
1448514474 .inst_type = extra.type,
......@@ -14508,7 +14497,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1450814497 .sext,
1450914498 .zext,
1451014499 => |kind| {
14511 const extra = func.extraData(Function.Instruction.Cast, datas[instr_index]);
14500 const extra = func.extraData(Function.Instruction.Cast, data);
1451214501 try function_block.writeAbbrev(FunctionBlock.Cast{
1451314502 .val = adapter.getOffsetValueIndex(extra.val),
1451414503 .type_index = extra.type,
......@@ -14542,7 +14531,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1454214531 .@"icmp ule",
1454314532 .@"icmp ult",
1454414533 => |kind| {
14545 const extra = func.extraData(Function.Instruction.Binary, datas[instr_index]);
14534 const extra = func.extraData(Function.Instruction.Binary, data);
1454614535 try function_block.writeAbbrev(FunctionBlock.Cmp{
1454714536 .lhs = adapter.getOffsetValueIndex(extra.lhs),
1454814537 .rhs = adapter.getOffsetValueIndex(extra.rhs),
......@@ -14566,7 +14555,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1456614555 .@"fcmp fast une",
1456714556 .@"fcmp fast uno",
1456814557 => |kind| {
14569 const extra = func.extraData(Function.Instruction.Binary, datas[instr_index]);
14558 const extra = func.extraData(Function.Instruction.Binary, data);
1457014559 try function_block.writeAbbrev(FunctionBlock.CmpFast{
1457114560 .lhs = adapter.getOffsetValueIndex(extra.lhs),
1457214561 .rhs = adapter.getOffsetValueIndex(extra.rhs),
......@@ -14575,14 +14564,14 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1457514564 });
1457614565 },
1457714566 .fneg => try function_block.writeAbbrev(FunctionBlock.FNeg{
14578 .val = adapter.getOffsetValueIndex(@enumFromInt(datas[instr_index])),
14567 .val = adapter.getOffsetValueIndex(@enumFromInt(data)),
1457914568 }),
1458014569 .@"fneg fast" => try function_block.writeAbbrev(FunctionBlock.FNegFast{
14581 .val = adapter.getOffsetValueIndex(@enumFromInt(datas[instr_index])),
14570 .val = adapter.getOffsetValueIndex(@enumFromInt(data)),
1458214571 .fast_math = FastMath.fast,
1458314572 }),
1458414573 .extractvalue => {
14585 var extra = func.extraDataTrail(Function.Instruction.ExtractValue, datas[instr_index]);
14574 var extra = func.extraDataTrail(Function.Instruction.ExtractValue, data);
1458614575 const indices = extra.trail.next(extra.data.indices_len, u32, &func);
1458714576 try function_block.writeAbbrev(FunctionBlock.ExtractValue{
1458814577 .val = adapter.getOffsetValueIndex(extra.data.val),
......@@ -14590,7 +14579,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1459014579 });
1459114580 },
1459214581 .insertvalue => {
14593 var extra = func.extraDataTrail(Function.Instruction.InsertValue, datas[instr_index]);
14582 var extra = func.extraDataTrail(Function.Instruction.InsertValue, data);
1459414583 const indices = extra.trail.next(extra.data.indices_len, u32, &func);
1459514584 try function_block.writeAbbrev(FunctionBlock.InsertValue{
1459614585 .val = adapter.getOffsetValueIndex(extra.data.val),
......@@ -14599,14 +14588,14 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1459914588 });
1460014589 },
1460114590 .extractelement => {
14602 const extra = func.extraData(Function.Instruction.ExtractElement, datas[instr_index]);
14591 const extra = func.extraData(Function.Instruction.ExtractElement, data);
1460314592 try function_block.writeAbbrev(FunctionBlock.ExtractElement{
1460414593 .val = adapter.getOffsetValueIndex(extra.val),
1460514594 .index = adapter.getOffsetValueIndex(extra.index),
1460614595 });
1460714596 },
1460814597 .insertelement => {
14609 const extra = func.extraData(Function.Instruction.InsertElement, datas[instr_index]);
14598 const extra = func.extraData(Function.Instruction.InsertElement, data);
1461014599 try function_block.writeAbbrev(FunctionBlock.InsertElement{
1461114600 .val = adapter.getOffsetValueIndex(extra.val),
1461214601 .elem = adapter.getOffsetValueIndex(extra.elem),
......@@ -14614,7 +14603,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1461414603 });
1461514604 },
1461614605 .select => {
14617 const extra = func.extraData(Function.Instruction.Select, datas[instr_index]);
14606 const extra = func.extraData(Function.Instruction.Select, data);
1461814607 try function_block.writeAbbrev(FunctionBlock.Select{
1461914608 .lhs = adapter.getOffsetValueIndex(extra.lhs),
1462014609 .rhs = adapter.getOffsetValueIndex(extra.rhs),
......@@ -14622,7 +14611,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1462214611 });
1462314612 },
1462414613 .@"select fast" => {
14625 const extra = func.extraData(Function.Instruction.Select, datas[instr_index]);
14614 const extra = func.extraData(Function.Instruction.Select, data);
1462614615 try function_block.writeAbbrev(FunctionBlock.SelectFast{
1462714616 .lhs = adapter.getOffsetValueIndex(extra.lhs),
1462814617 .rhs = adapter.getOffsetValueIndex(extra.rhs),
......@@ -14631,7 +14620,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1463114620 });
1463214621 },
1463314622 .shufflevector => {
14634 const extra = func.extraData(Function.Instruction.ShuffleVector, datas[instr_index]);
14623 const extra = func.extraData(Function.Instruction.ShuffleVector, data);
1463514624 try function_block.writeAbbrev(FunctionBlock.ShuffleVector{
1463614625 .lhs = adapter.getOffsetValueIndex(extra.lhs),
1463714626 .rhs = adapter.getOffsetValueIndex(extra.rhs),
......@@ -14641,7 +14630,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1464114630 .getelementptr,
1464214631 .@"getelementptr inbounds",
1464314632 => |kind| {
14644 var extra = func.extraDataTrail(Function.Instruction.GetElementPtr, datas[instr_index]);
14633 var extra = func.extraDataTrail(Function.Instruction.GetElementPtr, data);
1464514634 const indices = extra.trail.next(extra.data.indices_len, Value, &func);
1464614635 try function_block.writeAbbrevAdapted(
1464714636 FunctionBlock.GetElementPtr{
......@@ -14654,7 +14643,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1465414643 );
1465514644 },
1465614645 .load => {
14657 const extra = func.extraData(Function.Instruction.Load, datas[instr_index]);
14646 const extra = func.extraData(Function.Instruction.Load, data);
1465814647 try function_block.writeAbbrev(FunctionBlock.Load{
1465914648 .ptr = adapter.getOffsetValueIndex(extra.ptr),
1466014649 .ty = extra.type,
......@@ -14663,7 +14652,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1466314652 });
1466414653 },
1466514654 .@"load atomic" => {
14666 const extra = func.extraData(Function.Instruction.Load, datas[instr_index]);
14655 const extra = func.extraData(Function.Instruction.Load, data);
1466714656 try function_block.writeAbbrev(FunctionBlock.LoadAtomic{
1466814657 .ptr = adapter.getOffsetValueIndex(extra.ptr),
1466914658 .ty = extra.type,
......@@ -14674,7 +14663,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1467414663 });
1467514664 },
1467614665 .store => {
14677 const extra = func.extraData(Function.Instruction.Store, datas[instr_index]);
14666 const extra = func.extraData(Function.Instruction.Store, data);
1467814667 try function_block.writeAbbrev(FunctionBlock.Store{
1467914668 .ptr = adapter.getOffsetValueIndex(extra.ptr),
1468014669 .val = adapter.getOffsetValueIndex(extra.val),
......@@ -14683,7 +14672,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1468314672 });
1468414673 },
1468514674 .@"store atomic" => {
14686 const extra = func.extraData(Function.Instruction.Store, datas[instr_index]);
14675 const extra = func.extraData(Function.Instruction.Store, data);
1468714676 try function_block.writeAbbrev(FunctionBlock.StoreAtomic{
1468814677 .ptr = adapter.getOffsetValueIndex(extra.ptr),
1468914678 .val = adapter.getOffsetValueIndex(extra.val),
......@@ -14695,11 +14684,11 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1469514684 },
1469614685 .br => {
1469714686 try function_block.writeAbbrev(FunctionBlock.BrUnconditional{
14698 .block = datas[instr_index],
14687 .block = data,
1469914688 });
1470014689 },
1470114690 .br_cond => {
14702 const extra = func.extraData(Function.Instruction.BrCond, datas[instr_index]);
14691 const extra = func.extraData(Function.Instruction.BrCond, data);
1470314692 try function_block.writeAbbrev(FunctionBlock.BrConditional{
1470414693 .then_block = @intFromEnum(extra.then),
1470514694 .else_block = @intFromEnum(extra.@"else"),
......@@ -14707,7 +14696,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1470714696 });
1470814697 },
1470914698 .@"switch" => {
14710 var extra = func.extraDataTrail(Function.Instruction.Switch, datas[instr_index]);
14699 var extra = func.extraDataTrail(Function.Instruction.Switch, data);
1471114700
1471214701 try record.ensureUnusedCapacity(self.gpa, 3 + extra.data.cases_len * 2);
1471314702
......@@ -14730,7 +14719,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1473014719 try function_block.writeUnabbrev(12, record.items);
1473114720 },
1473214721 .va_arg => {
14733 const extra = func.extraData(Function.Instruction.VaArg, datas[instr_index]);
14722 const extra = func.extraData(Function.Instruction.VaArg, data);
1473414723 try function_block.writeAbbrev(FunctionBlock.VaArg{
1473514724 .list_type = extra.list.typeOf(@enumFromInt(func_index), self),
1473614725 .list = adapter.getOffsetValueIndex(extra.list),
......@@ -14740,7 +14729,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1474014729 .phi,
1474114730 .@"phi fast",
1474214731 => |kind| {
14743 var extra = func.extraDataTrail(Function.Instruction.Phi, datas[instr_index]);
14732 var extra = func.extraDataTrail(Function.Instruction.Phi, data);
1474414733 const vals = extra.trail.next(block_incoming_len, Value, &func);
1474514734 const blocks = extra.trail.next(block_incoming_len, Function.Block.Index, &func);
1474614735
......@@ -14764,11 +14753,11 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1476414753 try function_block.writeUnabbrev(16, record.items);
1476514754 },
1476614755 .ret => try function_block.writeAbbrev(FunctionBlock.Ret{
14767 .val = adapter.getOffsetValueIndex(@enumFromInt(datas[instr_index])),
14756 .val = adapter.getOffsetValueIndex(@enumFromInt(data)),
1476814757 }),
1476914758 .@"ret void" => try function_block.writeAbbrev(FunctionBlock.RetVoid{}),
1477014759 .atomicrmw => {
14771 const extra = func.extraData(Function.Instruction.AtomicRmw, datas[instr_index]);
14760 const extra = func.extraData(Function.Instruction.AtomicRmw, data);
1477214761 try function_block.writeAbbrev(FunctionBlock.AtomicRmw{
1477314762 .ptr = adapter.getOffsetValueIndex(extra.ptr),
1477414763 .val = adapter.getOffsetValueIndex(extra.val),
......@@ -14782,7 +14771,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1478214771 .cmpxchg,
1478314772 .@"cmpxchg weak",
1478414773 => |kind| {
14785 const extra = func.extraData(Function.Instruction.CmpXchg, datas[instr_index]);
14774 const extra = func.extraData(Function.Instruction.CmpXchg, data);
1478614775
1478714776 try function_block.writeAbbrev(FunctionBlock.CmpXchg{
1478814777 .ptr = adapter.getOffsetValueIndex(extra.ptr),
......@@ -14797,7 +14786,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1479714786 });
1479814787 },
1479914788 .fence => {
14800 const info: MemoryAccessInfo = @bitCast(datas[instr_index]);
14789 const info: MemoryAccessInfo = @bitCast(data);
1480114790 try function_block.writeAbbrev(FunctionBlock.Fence{
1480214791 .ordering = info.success_ordering,
1480314792 .sync_scope = info.sync_scope,
......@@ -14806,7 +14795,7 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1480614795 }
1480714796
1480814797 if (!func.strip) {
14809 if (func.debug_locations.get(@enumFromInt(instr_index))) |debug_location| {
14798 if (func.debug_locations.get(adapter.instruction_index)) |debug_location| {
1481014799 switch (debug_location) {
1481114800 .no_location => has_location = false,
1481214801 .location => |location| {
......@@ -14823,8 +14812,6 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1482314812 try function_block.writeAbbrev(FunctionBlock.DebugLocAgain{});
1482414813 }
1482514814 }
14826
14827 adapter.next();
1482814815 }
1482914816
1483014817 // VALUE_SYMTAB
......@@ -14850,18 +14837,32 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co
1485014837 }
1485114838
1485214839 // METADATA_ATTACHMENT_BLOCK
14853 if (!func.strip) blk: {
14854 const dbg = func.global.ptrConst(self).dbg;
14855
14856 if (dbg == .none) break :blk;
14857
14840 const any_nosanitize = true;
14841 if (!func.strip or any_nosanitize) {
1485814842 const MetadataAttachmentBlock = ir.MetadataAttachmentBlock;
1485914843 var metadata_attach_block = try function_block.enterSubBlock(MetadataAttachmentBlock, false);
1486014844
14861 try metadata_attach_block.writeAbbrev(MetadataAttachmentBlock.AttachmentSingle{
14862 .kind = ir.MetadataKind.dbg,
14863 .metadata = @enumFromInt(metadata_adapter.getMetadataIndex(dbg) - 1),
14864 });
14845 if (!func.strip) blk: {
14846 const dbg = func.global.ptrConst(self).dbg;
14847 if (dbg == .none) break :blk;
14848 try metadata_attach_block.writeAbbrev(MetadataAttachmentBlock.AttachmentGlobalSingle{
14849 .kind = .dbg,
14850 .metadata = @enumFromInt(metadata_adapter.getMetadataIndex(dbg) - 1),
14851 });
14852 }
14853
14854 var instr_index: u32 = 0;
14855 for (func.instructions.items(.tag)) |instr_tag| switch (instr_tag) {
14856 .arg, .block => {},
14857 else => {
14858 try metadata_attach_block.writeAbbrev(MetadataAttachmentBlock.AttachmentInstructionSingle{
14859 .inst = instr_index,
14860 .kind = .nosanitize,
14861 .metadata = @enumFromInt(metadata_adapter.getMetadataIndex(.empty_tuple) - 1),
14862 });
14863 instr_index += 1;
14864 },
14865 };
1486514866
1486614867 try metadata_attach_block.end();
1486714868 }
src/codegen/llvm/ir.zig+176-29
......@@ -20,8 +20,142 @@ const ColumnAbbrev = AbbrevOp{ .vbr = 8 };
2020
2121const BlockAbbrev = AbbrevOp{ .vbr = 6 };
2222
23pub const MetadataKind = enum(u1) {
23/// Unused tags are commented out so that they are omitted in the generated
24/// bitcode, which scans over this enum using reflection.
25pub const FixedMetadataKind = enum(u8) {
2426 dbg = 0,
27 //tbaa = 1,
28 //prof = 2,
29 //fpmath = 3,
30 //range = 4,
31 //@"tbaa.struct" = 5,
32 //@"invariant.load" = 6,
33 //@"alias.scope" = 7,
34 //@"noalias" = 8,
35 //nontemporal = 9,
36 //@"llvm.mem.parallel_loop_access" = 10,
37 //nonnull = 11,
38 //dereferenceable = 12,
39 //dereferenceable_or_null = 13,
40 //@"make.implicit" = 14,
41 //unpredictable = 15,
42 //@"invariant.group" = 16,
43 //@"align" = 17,
44 //@"llvm.loop" = 18,
45 //type = 19,
46 //section_prefix = 20,
47 //absolute_symbol = 21,
48 //associated = 22,
49 //callees = 23,
50 //irr_loop = 24,
51 //@"llvm.access.group" = 25,
52 //callback = 26,
53 //@"llvm.preserve.access.index" = 27,
54 //vcall_visibility = 28,
55 //noundef = 29,
56 //annotation = 30,
57 nosanitize = 31,
58 //func_sanitize = 32,
59 //exclude = 33,
60 //memprof = 34,
61 //callsite = 35,
62 //kcfi_type = 36,
63 //pcsections = 37,
64 //DIAssignID = 38,
65 //@"coro.outside.frame" = 39,
66};
67
68pub const MetadataCode = enum(u8) {
69 /// MDSTRING: [values]
70 STRING_OLD = 1,
71 /// VALUE: [type num, value num]
72 VALUE = 2,
73 /// NODE: [n x md num]
74 NODE = 3,
75 /// STRING: [values]
76 NAME = 4,
77 /// DISTINCT_NODE: [n x md num]
78 DISTINCT_NODE = 5,
79 /// [n x [id, name]]
80 KIND = 6,
81 /// [distinct, line, col, scope, inlined-at?]
82 LOCATION = 7,
83 /// OLD_NODE: [n x (type num, value num)]
84 OLD_NODE = 8,
85 /// OLD_FN_NODE: [n x (type num, value num)]
86 OLD_FN_NODE = 9,
87 /// NAMED_NODE: [n x mdnodes]
88 NAMED_NODE = 10,
89 /// [m x [value, [n x [id, mdnode]]]
90 ATTACHMENT = 11,
91 /// [distinct, tag, vers, header, n x md num]
92 GENERIC_DEBUG = 12,
93 /// [distinct, count, lo]
94 SUBRANGE = 13,
95 /// [isUnsigned|distinct, value, name]
96 ENUMERATOR = 14,
97 /// [distinct, tag, name, size, align, enc]
98 BASIC_TYPE = 15,
99 /// [distinct, filename, directory, checksumkind, checksum]
100 FILE = 16,
101 /// [distinct, ...]
102 DERIVED_TYPE = 17,
103 /// [distinct, ...]
104 COMPOSITE_TYPE = 18,
105 /// [distinct, flags, types, cc]
106 SUBROUTINE_TYPE = 19,
107 /// [distinct, ...]
108 COMPILE_UNIT = 20,
109 /// [distinct, ...]
110 SUBPROGRAM = 21,
111 /// [distinct, scope, file, line, column]
112 LEXICAL_BLOCK = 22,
113 ///[distinct, scope, file, discriminator]
114 LEXICAL_BLOCK_FILE = 23,
115 /// [distinct, scope, file, name, line, exportSymbols]
116 NAMESPACE = 24,
117 /// [distinct, scope, name, type, ...]
118 TEMPLATE_TYPE = 25,
119 /// [distinct, scope, name, type, value, ...]
120 TEMPLATE_VALUE = 26,
121 /// [distinct, ...]
122 GLOBAL_VAR = 27,
123 /// [distinct, ...]
124 LOCAL_VAR = 28,
125 /// [distinct, n x element]
126 EXPRESSION = 29,
127 /// [distinct, name, file, line, ...]
128 OBJC_PROPERTY = 30,
129 /// [distinct, tag, scope, entity, line, name]
130 IMPORTED_ENTITY = 31,
131 /// [distinct, scope, name, ...]
132 MODULE = 32,
133 /// [distinct, macinfo, line, name, value]
134 MACRO = 33,
135 /// [distinct, macinfo, line, file, ...]
136 MACRO_FILE = 34,
137 /// [count, offset] blob([lengths][chars])
138 STRINGS = 35,
139 /// [valueid, n x [id, mdnode]]
140 GLOBAL_DECL_ATTACHMENT = 36,
141 /// [distinct, var, expr]
142 GLOBAL_VAR_EXPR = 37,
143 /// [offset]
144 INDEX_OFFSET = 38,
145 /// [bitpos]
146 INDEX = 39,
147 /// [distinct, scope, name, file, line]
148 LABEL = 40,
149 /// [distinct, name, size, align,...]
150 STRING_TYPE = 41,
151 /// [distinct, scope, name, variable,...]
152 COMMON_BLOCK = 44,
153 /// [distinct, count, lo, up, stride]
154 GENERIC_SUBRANGE = 45,
155 /// [n x [type num, value num]]
156 ARG_LIST = 46,
157 /// [distinct, ...]
158 ASSIGN_ID = 47,
25159};
26160
27161pub const Identification = struct {
......@@ -622,16 +756,29 @@ pub const MetadataAttachmentBlock = struct {
622756 pub const id = 16;
623757
624758 pub const abbrevs = [_]type{
625 AttachmentSingle,
759 AttachmentGlobalSingle,
760 AttachmentInstructionSingle,
626761 };
627762
628 pub const AttachmentSingle = struct {
763 pub const AttachmentGlobalSingle = struct {
629764 pub const ops = [_]AbbrevOp{
630 .{ .literal = 11 },
765 .{ .literal = @intFromEnum(MetadataCode.ATTACHMENT) },
631766 .{ .fixed = 1 },
632767 MetadataAbbrev,
633768 };
634 kind: MetadataKind,
769 kind: FixedMetadataKind,
770 metadata: Builder.Metadata,
771 };
772
773 pub const AttachmentInstructionSingle = struct {
774 pub const ops = [_]AbbrevOp{
775 .{ .literal = @intFromEnum(MetadataCode.ATTACHMENT) },
776 ValueAbbrev,
777 .{ .fixed = 5 },
778 MetadataAbbrev,
779 };
780 inst: u32,
781 kind: FixedMetadataKind,
635782 metadata: Builder.Metadata,
636783 };
637784};
......@@ -666,7 +813,7 @@ pub const MetadataBlock = struct {
666813
667814 pub const Strings = struct {
668815 pub const ops = [_]AbbrevOp{
669 .{ .literal = 35 },
816 .{ .literal = @intFromEnum(MetadataCode.STRINGS) },
670817 .{ .vbr = 6 },
671818 .{ .vbr = 6 },
672819 .blob,
......@@ -678,7 +825,7 @@ pub const MetadataBlock = struct {
678825
679826 pub const File = struct {
680827 pub const ops = [_]AbbrevOp{
681 .{ .literal = 16 },
828 .{ .literal = @intFromEnum(MetadataCode.FILE) },
682829 .{ .literal = 0 }, // is distinct
683830 MetadataAbbrev, // filename
684831 MetadataAbbrev, // directory
......@@ -692,7 +839,7 @@ pub const MetadataBlock = struct {
692839
693840 pub const CompileUnit = struct {
694841 pub const ops = [_]AbbrevOp{
695 .{ .literal = 20 },
842 .{ .literal = @intFromEnum(MetadataCode.COMPILE_UNIT) },
696843 .{ .literal = 1 }, // is distinct
697844 .{ .literal = std.dwarf.LANG.C99 }, // source language
698845 MetadataAbbrev, // file
......@@ -726,7 +873,7 @@ pub const MetadataBlock = struct {
726873
727874 pub const Subprogram = struct {
728875 pub const ops = [_]AbbrevOp{
729 .{ .literal = 21 },
876 .{ .literal = @intFromEnum(MetadataCode.SUBPROGRAM) },
730877 .{ .literal = 0b111 }, // is distinct | has sp flags | has flags
731878 MetadataAbbrev, // scope
732879 MetadataAbbrev, // name
......@@ -763,7 +910,7 @@ pub const MetadataBlock = struct {
763910
764911 pub const LexicalBlock = struct {
765912 pub const ops = [_]AbbrevOp{
766 .{ .literal = 22 },
913 .{ .literal = @intFromEnum(MetadataCode.LEXICAL_BLOCK) },
767914 .{ .literal = 0 }, // is distinct
768915 MetadataAbbrev, // scope
769916 MetadataAbbrev, // file
......@@ -779,7 +926,7 @@ pub const MetadataBlock = struct {
779926
780927 pub const Location = struct {
781928 pub const ops = [_]AbbrevOp{
782 .{ .literal = 7 },
929 .{ .literal = @intFromEnum(MetadataCode.LOCATION) },
783930 .{ .literal = 0 }, // is distinct
784931 LineAbbrev, // line
785932 ColumnAbbrev, // column
......@@ -796,7 +943,7 @@ pub const MetadataBlock = struct {
796943
797944 pub const BasicType = struct {
798945 pub const ops = [_]AbbrevOp{
799 .{ .literal = 15 },
946 .{ .literal = @intFromEnum(MetadataCode.BASIC_TYPE) },
800947 .{ .literal = 0 }, // is distinct
801948 .{ .literal = std.dwarf.TAG.base_type }, // tag
802949 MetadataAbbrev, // name
......@@ -813,7 +960,7 @@ pub const MetadataBlock = struct {
813960
814961 pub const CompositeType = struct {
815962 pub const ops = [_]AbbrevOp{
816 .{ .literal = 18 },
963 .{ .literal = @intFromEnum(MetadataCode.COMPOSITE_TYPE) },
817964 .{ .literal = 0 | 0x2 }, // is distinct | is not used in old type ref
818965 .{ .fixed = 32 }, // tag
819966 MetadataAbbrev, // name
......@@ -852,7 +999,7 @@ pub const MetadataBlock = struct {
852999
8531000 pub const DerivedType = struct {
8541001 pub const ops = [_]AbbrevOp{
855 .{ .literal = 17 },
1002 .{ .literal = @intFromEnum(MetadataCode.DERIVED_TYPE) },
8561003 .{ .literal = 0 }, // is distinct
8571004 .{ .fixed = 32 }, // tag
8581005 MetadataAbbrev, // name
......@@ -880,7 +1027,7 @@ pub const MetadataBlock = struct {
8801027
8811028 pub const SubroutineType = struct {
8821029 pub const ops = [_]AbbrevOp{
883 .{ .literal = 19 },
1030 .{ .literal = @intFromEnum(MetadataCode.SUBROUTINE_TYPE) },
8841031 .{ .literal = 0 | 0x2 }, // is distinct | has no old type refs
8851032 .{ .literal = 0 }, // flags
8861033 MetadataAbbrev, // types
......@@ -891,7 +1038,7 @@ pub const MetadataBlock = struct {
8911038 };
8921039
8931040 pub const Enumerator = struct {
894 pub const id = 14;
1041 pub const id: MetadataCode = .ENUMERATOR;
8951042
8961043 pub const Flags = packed struct(u3) {
8971044 distinct: bool = false,
......@@ -900,7 +1047,7 @@ pub const MetadataBlock = struct {
9001047 };
9011048
9021049 pub const ops = [_]AbbrevOp{
903 .{ .literal = Enumerator.id },
1050 .{ .literal = @intFromEnum(Enumerator.id) },
9041051 .{ .fixed = @bitSizeOf(Flags) }, // flags
9051052 .{ .vbr = 6 }, // bit width
9061053 MetadataAbbrev, // name
......@@ -915,7 +1062,7 @@ pub const MetadataBlock = struct {
9151062
9161063 pub const Subrange = struct {
9171064 pub const ops = [_]AbbrevOp{
918 .{ .literal = 13 },
1065 .{ .literal = @intFromEnum(MetadataCode.SUBRANGE) },
9191066 .{ .literal = 0b10 }, // is distinct | version
9201067 MetadataAbbrev, // count
9211068 MetadataAbbrev, // lower bound
......@@ -929,7 +1076,7 @@ pub const MetadataBlock = struct {
9291076
9301077 pub const Expression = struct {
9311078 pub const ops = [_]AbbrevOp{
932 .{ .literal = 29 },
1079 .{ .literal = @intFromEnum(MetadataCode.EXPRESSION) },
9331080 .{ .literal = 0 | (3 << 1) }, // is distinct | version
9341081 MetadataArrayAbbrev, // elements
9351082 };
......@@ -939,7 +1086,7 @@ pub const MetadataBlock = struct {
9391086
9401087 pub const Node = struct {
9411088 pub const ops = [_]AbbrevOp{
942 .{ .literal = 3 },
1089 .{ .literal = @intFromEnum(MetadataCode.NODE) },
9431090 MetadataArrayAbbrev, // elements
9441091 };
9451092
......@@ -948,7 +1095,7 @@ pub const MetadataBlock = struct {
9481095
9491096 pub const LocalVar = struct {
9501097 pub const ops = [_]AbbrevOp{
951 .{ .literal = 28 },
1098 .{ .literal = @intFromEnum(MetadataCode.LOCAL_VAR) },
9521099 .{ .literal = 0b10 }, // is distinct | has alignment
9531100 MetadataAbbrev, // scope
9541101 MetadataAbbrev, // name
......@@ -970,7 +1117,7 @@ pub const MetadataBlock = struct {
9701117
9711118 pub const Parameter = struct {
9721119 pub const ops = [_]AbbrevOp{
973 .{ .literal = 28 },
1120 .{ .literal = @intFromEnum(MetadataCode.LOCAL_VAR) },
9741121 .{ .literal = 0b10 }, // is distinct | has alignment
9751122 MetadataAbbrev, // scope
9761123 MetadataAbbrev, // name
......@@ -993,7 +1140,7 @@ pub const MetadataBlock = struct {
9931140
9941141 pub const GlobalVar = struct {
9951142 pub const ops = [_]AbbrevOp{
996 .{ .literal = 27 },
1143 .{ .literal = @intFromEnum(MetadataCode.GLOBAL_VAR) },
9971144 .{ .literal = 0b101 }, // is distinct | version
9981145 MetadataAbbrev, // scope
9991146 MetadataAbbrev, // name
......@@ -1020,7 +1167,7 @@ pub const MetadataBlock = struct {
10201167
10211168 pub const GlobalVarExpression = struct {
10221169 pub const ops = [_]AbbrevOp{
1023 .{ .literal = 37 },
1170 .{ .literal = @intFromEnum(MetadataCode.GLOBAL_VAR_EXPR) },
10241171 .{ .literal = 0 }, // is distinct
10251172 MetadataAbbrev, // variable
10261173 MetadataAbbrev, // expression
......@@ -1032,7 +1179,7 @@ pub const MetadataBlock = struct {
10321179
10331180 pub const Constant = struct {
10341181 pub const ops = [_]AbbrevOp{
1035 .{ .literal = 2 },
1182 .{ .literal = @intFromEnum(MetadataCode.VALUE) },
10361183 MetadataAbbrev, // type
10371184 MetadataAbbrev, // value
10381185 };
......@@ -1043,7 +1190,7 @@ pub const MetadataBlock = struct {
10431190
10441191 pub const Name = struct {
10451192 pub const ops = [_]AbbrevOp{
1046 .{ .literal = 4 },
1193 .{ .literal = @intFromEnum(MetadataCode.NAME) },
10471194 .{ .array_fixed = 8 }, // name
10481195 };
10491196
......@@ -1052,7 +1199,7 @@ pub const MetadataBlock = struct {
10521199
10531200 pub const NamedNode = struct {
10541201 pub const ops = [_]AbbrevOp{
1055 .{ .literal = 10 },
1202 .{ .literal = @intFromEnum(MetadataCode.NAMED_NODE) },
10561203 MetadataArrayAbbrev, // elements
10571204 };
10581205
......@@ -1061,14 +1208,14 @@ pub const MetadataBlock = struct {
10611208
10621209 pub const GlobalDeclAttachment = struct {
10631210 pub const ops = [_]AbbrevOp{
1064 .{ .literal = 36 },
1211 .{ .literal = @intFromEnum(MetadataCode.GLOBAL_DECL_ATTACHMENT) },
10651212 ValueAbbrev, // value id
10661213 .{ .fixed = 1 }, // kind
10671214 MetadataAbbrev, // elements
10681215 };
10691216
10701217 value: Builder.Constant,
1071 kind: MetadataKind,
1218 kind: FixedMetadataKind,
10721219 metadata: Builder.Metadata,
10731220 };
10741221};