authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-15 18:27:09+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-16 10:53:41+02:00
logd83a26f068f42c6f9cafd25b7038b70553a496d8
tree016bc2d9fa343ceac3a1b1f0fd6971dde706a1e4
parent03438118369605df178f4bfdb5b1a8ad6a349be7

stage2 llvm: keep track of inlined functions


14 files changed, 132 insertions(+), 46 deletions(-)

src/Air.zig+7-3
......@@ -326,9 +326,12 @@ pub const Inst = struct {
326326 /// Result type is always void.
327327 /// Uses the `dbg_stmt` field.
328328 dbg_stmt,
329 /// Marks change of source function. Emitted around an inline call.
329 /// Marks the start of an inline call.
330330 /// Uses `ty_pl` with the payload being the index of a Value.Function in air.values.
331 dbg_func,
331 dbg_inline_begin,
332 /// Marks the end of an inline call.
333 /// Uses `ty_pl` with the payload being the index of a Value.Function in air.values.
334 dbg_inline_end,
332335 /// Marks the beginning of a local variable. The operand is a pointer pointing
333336 /// to the storage for the variable. The local may be a const or a var.
334337 /// Result type is always void.
......@@ -973,7 +976,8 @@ pub fn typeOfIndex(air: Air, inst: Air.Inst.Index) Type {
973976
974977 .breakpoint,
975978 .dbg_stmt,
976 .dbg_func,
979 .dbg_inline_begin,
980 .dbg_inline_end,
977981 .dbg_var_ptr,
978982 .dbg_var_val,
979983 .store,
src/Liveness.zig+2-1
......@@ -314,7 +314,8 @@ fn analyzeInst(
314314 .const_ty,
315315 .breakpoint,
316316 .dbg_stmt,
317 .dbg_func,
317 .dbg_inline_begin,
318 .dbg_inline_end,
318319 .unreach,
319320 .fence,
320321 .ret_addr,
src/Sema.zig+10-5
......@@ -4765,7 +4765,9 @@ fn analyzeCall(
47654765 }
47664766
47674767 const new_func_resolved_ty = try Type.Tag.function.create(sema.arena, new_fn_info);
4768 if (!is_comptime_call) try sema.emitDbgFunc(block, parent_func.?, module_fn, new_func_resolved_ty);
4768 if (!is_comptime_call) {
4769 try sema.emitDbgInline(block, parent_func.?, module_fn, new_func_resolved_ty, .dbg_inline_begin);
4770 }
47694771
47704772 const result = result: {
47714773 sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
......@@ -4781,7 +4783,9 @@ fn analyzeCall(
47814783 break :result try sema.analyzeBlockBody(block, call_src, &child_block, merges);
47824784 };
47834785
4784 if (!is_comptime_call) try sema.emitDbgFunc(block, module_fn, parent_func.?, parent_func.?.owner_decl.ty);
4786 if (!is_comptime_call) {
4787 try sema.emitDbgInline(block, module_fn, parent_func.?, parent_func.?.owner_decl.ty, .dbg_inline_end);
4788 }
47854789
47864790 if (should_memoize and is_comptime_call) {
47874791 const result_val = try sema.resolveConstMaybeUndefVal(block, call_src, result);
......@@ -5187,19 +5191,20 @@ fn instantiateGenericCall(
51875191 return func_inst;
51885192}
51895193
5190fn emitDbgFunc(
5194fn emitDbgInline(
51915195 sema: *Sema,
51925196 block: *Block,
51935197 old_func: *Module.Fn,
51945198 new_func: *Module.Fn,
51955199 new_func_ty: Type,
5200 tag: Air.Inst.Tag,
51965201) CompileError!void {
5197 // No change of file; no dbg_func needed.
5202 // No change of file; no dbg_inline needed.
51985203 if (old_func == new_func) return;
51995204
52005205 try sema.air_values.append(sema.gpa, try Value.Tag.function.create(sema.arena, new_func));
52015206 _ = try block.addInst(.{
5202 .tag = .dbg_func,
5207 .tag = tag,
52035208 .data = .{ .ty_pl = .{
52045209 .ty = try sema.addType(new_func_ty),
52055210 .payload = @intCast(u32, sema.air_values.items.len - 1),
src/arch/aarch64/CodeGen.zig+5-2
......@@ -598,7 +598,6 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
598598 .fence => try self.airFence(),
599599 .cond_br => try self.airCondBr(inst),
600600 .dbg_stmt => try self.airDbgStmt(inst),
601 .dbg_func => try self.airDbgFunc(inst),
602601 .fptrunc => try self.airFptrunc(inst),
603602 .fpext => try self.airFpext(inst),
604603 .intcast => try self.airIntCast(inst),
......@@ -650,6 +649,10 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
650649 .dbg_var_val,
651650 => try self.airDbgVar(inst),
652651
652 .dbg_inline_begin,
653 .dbg_inline_end,
654 => try self.airDbgInline(inst),
655
653656 .call => try self.airCall(inst, .auto),
654657 .call_always_tail => try self.airCall(inst, .always_tail),
655658 .call_never_tail => try self.airCall(inst, .never_tail),
......@@ -2716,7 +2719,7 @@ fn airDbgStmt(self: *Self, inst: Air.Inst.Index) !void {
27162719 return self.finishAirBookkeeping();
27172720}
27182721
2719fn airDbgFunc(self: *Self, inst: Air.Inst.Index) !void {
2722fn airDbgInline(self: *Self, inst: Air.Inst.Index) !void {
27202723 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
27212724 const function = self.air.values[ty_pl.payload].castTag(.function).?.data;
27222725 // TODO emit debug info for function change
src/arch/arm/CodeGen.zig+5-2
......@@ -595,7 +595,6 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
595595 .fence => try self.airFence(),
596596 .cond_br => try self.airCondBr(inst),
597597 .dbg_stmt => try self.airDbgStmt(inst),
598 .dbg_func => try self.airDbgFunc(inst),
599598 .fptrunc => try self.airFptrunc(inst),
600599 .fpext => try self.airFpext(inst),
601600 .intcast => try self.airIntCast(inst),
......@@ -647,6 +646,10 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
647646 .dbg_var_val,
648647 => try self.airDbgVar(inst),
649648
649 .dbg_inline_begin,
650 .dbg_inline_end,
651 => try self.airDbgInline(inst),
652
650653 .call => try self.airCall(inst, .auto),
651654 .call_always_tail => try self.airCall(inst, .always_tail),
652655 .call_never_tail => try self.airCall(inst, .never_tail),
......@@ -2836,7 +2839,7 @@ fn airDbgStmt(self: *Self, inst: Air.Inst.Index) !void {
28362839 return self.finishAirBookkeeping();
28372840}
28382841
2839fn airDbgFunc(self: *Self, inst: Air.Inst.Index) !void {
2842fn airDbgInline(self: *Self, inst: Air.Inst.Index) !void {
28402843 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
28412844 const function = self.air.values[ty_pl.payload].castTag(.function).?.data;
28422845 // TODO emit debug info for function change
src/arch/riscv64/CodeGen.zig+5-2
......@@ -562,7 +562,6 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
562562 .fence => try self.airFence(),
563563 .cond_br => try self.airCondBr(inst),
564564 .dbg_stmt => try self.airDbgStmt(inst),
565 .dbg_func => try self.airDbgFunc(inst),
566565 .fptrunc => try self.airFptrunc(inst),
567566 .fpext => try self.airFpext(inst),
568567 .intcast => try self.airIntCast(inst),
......@@ -614,6 +613,10 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
614613 .dbg_var_val,
615614 => try self.airDbgVar(inst),
616615
616 .dbg_inline_begin,
617 .dbg_inline_end,
618 => try self.airDbgInline(inst),
619
617620 .call => try self.airCall(inst, .auto),
618621 .call_always_tail => try self.airCall(inst, .always_tail),
619622 .call_never_tail => try self.airCall(inst, .never_tail),
......@@ -1641,7 +1644,7 @@ fn airDbgStmt(self: *Self, inst: Air.Inst.Index) !void {
16411644 return self.finishAirBookkeeping();
16421645}
16431646
1644fn airDbgFunc(self: *Self, inst: Air.Inst.Index) !void {
1647fn airDbgInline(self: *Self, inst: Air.Inst.Index) !void {
16451648 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
16461649 const function = self.air.values[ty_pl.payload].castTag(.function).?.data;
16471650 // TODO emit debug info for function change
src/arch/wasm/CodeGen.zig+2-1
......@@ -1227,7 +1227,8 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
12271227
12281228 // TODO
12291229 .dbg_stmt,
1230 .dbg_func,
1230 .dbg_inline_begin,
1231 .dbg_inline_end,
12311232 .dbg_var_ptr,
12321233 .dbg_var_val,
12331234 => WValue.none,
src/arch/x86_64/CodeGen.zig+5-2
......@@ -679,7 +679,6 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
679679 .fence => try self.airFence(),
680680 .cond_br => try self.airCondBr(inst),
681681 .dbg_stmt => try self.airDbgStmt(inst),
682 .dbg_func => try self.airDbgFunc(inst),
683682 .fptrunc => try self.airFptrunc(inst),
684683 .fpext => try self.airFpext(inst),
685684 .intcast => try self.airIntCast(inst),
......@@ -731,6 +730,10 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
731730 .dbg_var_val,
732731 => try self.airDbgVar(inst),
733732
733 .dbg_inline_begin,
734 .dbg_inline_end,
735 => try self.airDbgInline(inst),
736
734737 .call => try self.airCall(inst, .auto),
735738 .call_always_tail => try self.airCall(inst, .always_tail),
736739 .call_never_tail => try self.airCall(inst, .never_tail),
......@@ -3671,7 +3674,7 @@ fn airDbgStmt(self: *Self, inst: Air.Inst.Index) !void {
36713674 return self.finishAirBookkeeping();
36723675}
36733676
3674fn airDbgFunc(self: *Self, inst: Air.Inst.Index) !void {
3677fn airDbgInline(self: *Self, inst: Air.Inst.Index) !void {
36753678 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
36763679 const function = self.air.values[ty_pl.payload].castTag(.function).?.data;
36773680 // TODO emit debug info for function change
src/codegen/c.zig+5-2
......@@ -1687,7 +1687,6 @@ fn genBody(f: *Function, body: []const Air.Inst.Index) error{ AnalysisFail, OutO
16871687 .block => try airBlock(f, inst),
16881688 .bitcast => try airBitcast(f, inst),
16891689 .dbg_stmt => try airDbgStmt(f, inst),
1690 .dbg_func => try airDbgFunc(f, inst),
16911690 .intcast => try airIntCast(f, inst),
16921691 .trunc => try airTrunc(f, inst),
16931692 .bool_to_int => try airBoolToInt(f, inst),
......@@ -1727,6 +1726,10 @@ fn genBody(f: *Function, body: []const Air.Inst.Index) error{ AnalysisFail, OutO
17271726 .dbg_var_val,
17281727 => try airDbgVar(f, inst),
17291728
1729 .dbg_inline_begin,
1730 .dbg_inline_end,
1731 => try airDbgInline(f, inst),
1732
17301733 .call => try airCall(f, inst, .auto),
17311734 .call_always_tail => try airCall(f, inst, .always_tail),
17321735 .call_never_tail => try airCall(f, inst, .never_tail),
......@@ -2661,7 +2664,7 @@ fn airDbgStmt(f: *Function, inst: Air.Inst.Index) !CValue {
26612664 return CValue.none;
26622665}
26632666
2664fn airDbgFunc(f: *Function, inst: Air.Inst.Index) !CValue {
2667fn airDbgInline(f: *Function, inst: Air.Inst.Index) !CValue {
26652668 const ty_pl = f.air.instructions.items(.data)[inst].ty_pl;
26662669 const writer = f.object.writer();
26672670 const function = f.air.values[ty_pl.payload].castTag(.function).?.data;
src/codegen/llvm.zig+58-20
......@@ -620,7 +620,8 @@ pub const Object = struct {
620620
621621 llvm_func.fnSetSubprogram(subprogram);
622622
623 di_scope = subprogram.toScope();
623 const lexical_block = dib.createLexicalBlock(subprogram.toScope(), di_file.?, line_number, 1);
624 di_scope = lexical_block.toScope();
624625 }
625626
626627 var fg: FuncGen = .{
......@@ -639,6 +640,7 @@ pub const Object = struct {
639640 .single_threaded = module.comp.bin_file.options.single_threaded,
640641 .di_scope = di_scope,
641642 .di_file = di_file,
643 .base_line = dg.decl.src_line,
642644 .prev_dbg_line = 0,
643645 .prev_dbg_column = 0,
644646 };
......@@ -3210,9 +3212,13 @@ pub const FuncGen = struct {
32103212 builder: *const llvm.Builder,
32113213 di_scope: ?*llvm.DIScope,
32123214 di_file: ?*llvm.DIFile,
3215 base_line: u32,
32133216 prev_dbg_line: c_uint,
32143217 prev_dbg_column: c_uint,
32153218
3219 /// Stack of locations where a call was inlined.
3220 dbg_inlined: std.ArrayListUnmanaged(DbgState) = .{},
3221
32163222 /// This stores the LLVM values used in a function, such that they can be referred to
32173223 /// in other instructions. This table is cleared before every function is generated.
32183224 func_inst_table: std.AutoHashMapUnmanaged(Air.Inst.Ref, *const llvm.Value),
......@@ -3240,11 +3246,13 @@ pub const FuncGen = struct {
32403246
32413247 single_threaded: bool,
32423248
3249 const DbgState = struct { loc: *llvm.DILocation, scope: *llvm.DIScope, base_line: u32 };
32433250 const BreakBasicBlocks = std.ArrayListUnmanaged(*const llvm.BasicBlock);
32443251 const BreakValues = std.ArrayListUnmanaged(*const llvm.Value);
32453252
32463253 fn deinit(self: *FuncGen) void {
32473254 self.builder.dispose();
3255 self.dbg_inlined.deinit(self.gpa);
32483256 self.func_inst_table.deinit(self.gpa);
32493257 self.blocks.deinit(self.gpa);
32503258 }
......@@ -3463,7 +3471,8 @@ pub const FuncGen = struct {
34633471 .const_ty => unreachable,
34643472 .unreach => self.airUnreach(inst),
34653473 .dbg_stmt => self.airDbgStmt(inst),
3466 .dbg_func => try self.airDbgFunc(inst),
3474 .dbg_inline_begin => try self.airDbgInline(inst, true),
3475 .dbg_inline_end => try self.airDbgInline(inst, false),
34673476 .dbg_var_ptr => try self.airDbgVarPtr(inst),
34683477 .dbg_var_val => try self.airDbgVarVal(inst),
34693478 // zig fmt: on
......@@ -4179,24 +4188,44 @@ pub const FuncGen = struct {
41794188 fn airDbgStmt(self: *FuncGen, inst: Air.Inst.Index) ?*const llvm.Value {
41804189 const di_scope = self.di_scope orelse return null;
41814190 const dbg_stmt = self.air.instructions.items(.data)[inst].dbg_stmt;
4182 self.prev_dbg_line = @intCast(c_uint, self.dg.decl.src_line + dbg_stmt.line + 1);
4191 self.prev_dbg_line = @intCast(c_uint, self.base_line + dbg_stmt.line + 1);
41834192 self.prev_dbg_column = @intCast(c_uint, dbg_stmt.column + 1);
4184 self.builder.setCurrentDebugLocation(self.prev_dbg_line, self.prev_dbg_column, di_scope);
4193 const inlined_at = if (self.dbg_inlined.items.len > 0)
4194 self.dbg_inlined.items[self.dbg_inlined.items.len - 1].loc
4195 else
4196 null;
4197 self.builder.setCurrentDebugLocation(self.prev_dbg_line, self.prev_dbg_column, di_scope, inlined_at);
41854198 return null;
41864199 }
41874200
4188 fn airDbgFunc(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value {
4201 fn airDbgInline(self: *FuncGen, inst: Air.Inst.Index, start: bool) !?*const llvm.Value {
41894202 const dib = self.dg.object.di_builder orelse return null;
41904203 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
4191
4192 const function = self.air.values[ty_pl.payload].castTag(.function).?.data;
4193 const decl = function.owner_decl;
4204
4205 const func = self.air.values[ty_pl.payload].castTag(.function).?.data;
4206 const decl = func.owner_decl;
4207 const di_file = try self.dg.object.getDIFile(self.gpa, decl.src_namespace.file_scope);
4208 self.di_file = di_file;
4209 const line_number = decl.src_line + 1;
4210 const cur_debug_location = self.builder.getCurrentDebugLocation2();
4211 if (start) {
4212 try self.dbg_inlined.append(self.gpa, .{
4213 .loc = @ptrCast(*llvm.DILocation, cur_debug_location),
4214 .scope = self.di_scope.?,
4215 .base_line = self.base_line,
4216 });
4217 } else {
4218 const old = self.dbg_inlined.pop();
4219 self.di_scope = old.scope;
4220 self.base_line = old.base_line;
4221 return null;
4222 }
4223
41944224 const fn_ty = try self.air.getRefType(ty_pl.ty).copy(self.dg.object.type_map_arena.allocator());
4195 const llvm_func = try self.dg.resolveLlvmFunctionExtra(decl, fn_ty);
4225 const fqn = try decl.getFullyQualifiedName(self.gpa);
4226 defer self.gpa.free(fqn);
41964227 const fn_info = fn_ty.fnInfo();
4197 const di_file = try self.dg.object.getDIFile(self.gpa, decl.src_namespace.file_scope);
41984228
4199 const line_number = decl.src_line + 1;
42004229 const is_internal_linkage = !self.dg.module.decl_exports.contains(decl);
42014230 const noret_bit: c_uint = if (fn_info.return_type.isNoReturn())
42024231 llvm.DIFlags.NoReturn
......@@ -4205,22 +4234,23 @@ pub const FuncGen = struct {
42054234 const subprogram = dib.createFunction(
42064235 di_file.toScope(),
42074236 decl.name,
4208 llvm_func.getValueName(),
4237 fqn,
42094238 di_file,
42104239 line_number,
4211 try self.dg.lowerDebugType(fn_ty),
4240 try self.dg.object.lowerDebugType(fn_ty, .full),
42124241 is_internal_linkage,
42134242 true, // is definition
4214 line_number + function.lbrace_line, // scope line
4243 line_number + func.lbrace_line, // scope line
42154244 llvm.DIFlags.StaticMember | noret_bit,
42164245 self.dg.module.comp.bin_file.options.optimize_mode != .Debug,
42174246 null, // decl_subprogram
42184247 );
4219 try self.dg.object.di_map.put(self.gpa, decl, subprogram.toNode());
42204248
4221 llvm_func.fnSetSubprogram(subprogram);
4249 try self.dg.object.di_map.put(self.gpa, decl, subprogram.toNode());
42224250
4223 self.di_scope = subprogram.toScope();
4251 const lexical_block = dib.createLexicalBlock(subprogram.toScope(), di_file, line_number, 1);
4252 self.di_scope = lexical_block.toScope();
4253 self.base_line = decl.src_line;
42244254 return null;
42254255 }
42264256
......@@ -4240,7 +4270,11 @@ pub const FuncGen = struct {
42404270 true, // always preserve
42414271 0, // flags
42424272 );
4243 const debug_loc = llvm.getDebugLoc(self.prev_dbg_line, self.prev_dbg_column, self.di_scope.?);
4273 const inlined_at = if (self.dbg_inlined.items.len > 0)
4274 self.dbg_inlined.items[self.dbg_inlined.items.len - 1].loc
4275 else
4276 null;
4277 const debug_loc = llvm.getDebugLoc(self.prev_dbg_line, self.prev_dbg_column, self.di_scope.?, inlined_at);
42444278 const insert_block = self.builder.getInsertBlock();
42454279 _ = dib.insertDeclareAtEnd(operand, di_local_var, debug_loc, insert_block);
42464280 return null;
......@@ -4262,7 +4296,11 @@ pub const FuncGen = struct {
42624296 true, // always preserve
42634297 0, // flags
42644298 );
4265 const debug_loc = llvm.getDebugLoc(self.prev_dbg_line, self.prev_dbg_column, self.di_scope.?);
4299 const inlined_at = if (self.dbg_inlined.items.len > 0)
4300 self.dbg_inlined.items[self.dbg_inlined.items.len - 1].loc
4301 else
4302 null;
4303 const debug_loc = llvm.getDebugLoc(self.prev_dbg_line, self.prev_dbg_column, self.di_scope.?, inlined_at);
42664304 const insert_block = self.builder.getInsertBlock();
42674305 if (isByRef(operand_ty)) {
42684306 _ = dib.insertDeclareAtEnd(operand, di_local_var, debug_loc, insert_block);
......@@ -5524,7 +5562,7 @@ pub const FuncGen = struct {
55245562 self.arg_index, // includes +1 because 0 is return type
55255563 );
55265564
5527 const debug_loc = llvm.getDebugLoc(lbrace_line, lbrace_col, self.di_scope.?);
5565 const debug_loc = llvm.getDebugLoc(lbrace_line, lbrace_col, self.di_scope.?, null);
55285566 const insert_block = self.builder.getInsertBlock();
55295567 if (isByRef(inst_ty)) {
55305568 _ = dib.insertDeclareAtEnd(arg_val, di_local_var, debug_loc, insert_block);
src/codegen/llvm/bindings.zig+4-4
......@@ -839,8 +839,8 @@ pub const Builder = opaque {
839839 pub const buildExactSDiv = LLVMBuildExactSDiv;
840840 extern fn LLVMBuildExactSDiv(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value;
841841
842 pub const setCurrentDebugLocation = ZigLLVMSetCurrentDebugLocation;
843 extern fn ZigLLVMSetCurrentDebugLocation(builder: *const Builder, line: c_uint, column: c_uint, scope: *DIScope) void;
842 pub const setCurrentDebugLocation = ZigLLVMSetCurrentDebugLocation2;
843 extern fn ZigLLVMSetCurrentDebugLocation2(builder: *const Builder, line: c_uint, column: c_uint, scope: *DIScope, inlined_at: ?*DILocation) void;
844844
845845 pub const clearCurrentDebugLocation = ZigLLVMClearCurrentDebugLocation;
846846 extern fn ZigLLVMClearCurrentDebugLocation(builder: *const Builder) void;
......@@ -1479,8 +1479,8 @@ pub const DISubprogram = opaque {
14791479 extern fn ZigLLVMSubprogramReplaceLinkageName(subprogram: *DISubprogram, linkage_name: *MDString) void;
14801480};
14811481
1482pub const getDebugLoc = ZigLLVMGetDebugLoc;
1483extern fn ZigLLVMGetDebugLoc(line: c_uint, col: c_uint, scope: *DIScope) *DILocation;
1482pub const getDebugLoc = ZigLLVMGetDebugLoc2;
1483extern fn ZigLLVMGetDebugLoc2(line: c_uint, col: c_uint, scope: *DIScope, inlined_at: ?*DILocation) *DILocation;
14841484
14851485pub const DIBuilder = opaque {
14861486 pub const dispose = ZigLLVMDisposeDIBuilder;
src/print_air.zig+3-2
......@@ -242,7 +242,8 @@ const Writer = struct {
242242 .constant => try w.writeConstant(s, inst),
243243 .assembly => try w.writeAssembly(s, inst),
244244 .dbg_stmt => try w.writeDbgStmt(s, inst),
245 .dbg_func => try w.writeDbgFunc(s, inst),
245
246 .dbg_inline_begin, .dbg_inline_end => try w.writeDbgInline(s, inst),
246247 .aggregate_init => try w.writeAggregateInit(s, inst),
247248 .union_init => try w.writeUnionInit(s, inst),
248249 .br => try w.writeBr(s, inst),
......@@ -553,7 +554,7 @@ const Writer = struct {
553554 try s.print("{d}:{d}", .{ dbg_stmt.line + 1, dbg_stmt.column + 1 });
554555 }
555556
556 fn writeDbgFunc(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void {
557 fn writeDbgInline(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void {
557558 const ty_pl = w.air.instructions.items(.data)[inst].ty_pl;
558559 const function = w.air.values[ty_pl.payload].castTag(.function).?.data;
559560 try s.print("{s}", .{function.owner_decl.name});
src/zig_llvm.cpp+17
......@@ -799,6 +799,15 @@ void ZigLLVMSetCurrentDebugLocation(LLVMBuilderRef builder,
799799 unwrap(builder)->SetCurrentDebugLocation(debug_loc);
800800}
801801
802void ZigLLVMSetCurrentDebugLocation2(LLVMBuilderRef builder, unsigned int line,
803 unsigned int column, ZigLLVMDIScope *scope, ZigLLVMDILocation *inlined_at)
804{
805 DIScope* di_scope = reinterpret_cast<DIScope*>(scope);
806 DebugLoc debug_loc = DILocation::get(di_scope->getContext(), line, column, di_scope,
807 reinterpret_cast<DILocation *>(inlined_at), false);
808 unwrap(builder)->SetCurrentDebugLocation(debug_loc);
809}
810
802811void ZigLLVMClearCurrentDebugLocation(LLVMBuilderRef builder) {
803812 unwrap(builder)->SetCurrentDebugLocation(DebugLoc());
804813}
......@@ -1025,6 +1034,14 @@ ZigLLVMDILocation *ZigLLVMGetDebugLoc(unsigned line, unsigned col, ZigLLVMDIScop
10251034 return reinterpret_cast<ZigLLVMDILocation*>(debug_loc.get());
10261035}
10271036
1037ZigLLVMDILocation *ZigLLVMGetDebugLoc2(unsigned line, unsigned col, ZigLLVMDIScope *scope,
1038 ZigLLVMDILocation *inlined_at) {
1039 DIScope* di_scope = reinterpret_cast<DIScope*>(scope);
1040 DebugLoc debug_loc = DILocation::get(di_scope->getContext(), line, col, di_scope,
1041 reinterpret_cast<DILocation *>(inlined_at), false);
1042 return reinterpret_cast<ZigLLVMDILocation*>(debug_loc.get());
1043}
1044
10281045void ZigLLVMSetFastMath(LLVMBuilderRef builder_wrapped, bool on_state) {
10291046 if (on_state) {
10301047 FastMathFlags fmf;
src/zig_llvm.h+4
......@@ -232,6 +232,8 @@ ZIG_EXTERN_C void ZigLLVMSetModuleCodeModel(LLVMModuleRef module, LLVMCodeModel
232232
233233ZIG_EXTERN_C void ZigLLVMSetCurrentDebugLocation(LLVMBuilderRef builder,
234234 unsigned int line, unsigned int column, struct ZigLLVMDIScope *scope);
235ZIG_EXTERN_C void ZigLLVMSetCurrentDebugLocation2(LLVMBuilderRef builder, unsigned int line,
236 unsigned int column, ZigLLVMDIScope *scope, ZigLLVMDILocation *inlined_at);
235237ZIG_EXTERN_C void ZigLLVMClearCurrentDebugLocation(LLVMBuilderRef builder);
236238
237239ZIG_EXTERN_C struct ZigLLVMDIScope *ZigLLVMLexicalBlockToScope(struct ZigLLVMDILexicalBlock *lexical_block);
......@@ -290,6 +292,8 @@ ZIG_EXTERN_C void ZigLLVMDIBuilderFinalize(struct ZigLLVMDIBuilder *dibuilder);
290292
291293ZIG_EXTERN_C struct ZigLLVMDILocation *ZigLLVMGetDebugLoc(unsigned line, unsigned col,
292294 struct ZigLLVMDIScope *scope);
295ZIG_EXTERN_C struct ZigLLVMDILocation *ZigLLVMGetDebugLoc2(unsigned line, unsigned col,
296 ZigLLVMDIScope *scope, ZigLLVMDILocation *inlined_at);
293297
294298ZIG_EXTERN_C LLVMValueRef ZigLLVMInsertDeclareAtEnd(struct ZigLLVMDIBuilder *dib,
295299 LLVMValueRef storage, struct ZigLLVMDILocalVariable *var_info,