Skip to content

Commit 9616944

Browse files
authored
Merge pull request #4290 from swiftwasm/main
2 parents e337ef3 + 30d318a commit 9616944

21 files changed

+817
-836
lines changed

lib/SILOptimizer/Mandatory/MoveKillsCopyableAddressesChecker.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,7 +1777,9 @@ bool DataflowState::process(
17771777
if (auto debug = DebugVarCarryingInst::getFromValue(address)) {
17781778
debug.markAsMoved();
17791779
if (auto varInfo = debug.getVarInfo()) {
1780-
builder.createDebugValue(
1780+
SILBuilderWithScope undefBuilder(builder);
1781+
undefBuilder.setCurrentDebugScope(debug.inst->getDebugScope());
1782+
undefBuilder.createDebugValue(
17811783
debug.inst->getLoc(),
17821784
SILUndef::get(address->getType(), builder.getModule()), *varInfo,
17831785
false /*poison*/, true /*was moved*/);
@@ -1923,7 +1925,9 @@ static bool performSingleBasicBlockAnalysis(DataflowState &dataflowState,
19231925
// Also, mark the alloc_stack as being moved at some point.
19241926
if (auto debug = DebugVarCarryingInst::getFromValue(address)) {
19251927
if (auto varInfo = debug.getVarInfo()) {
1926-
builder.createDebugValue(
1928+
SILBuilderWithScope undefBuilder(builder);
1929+
undefBuilder.setCurrentDebugScope(debug.inst->getDebugScope());
1930+
undefBuilder.createDebugValue(
19271931
debug.inst->getLoc(),
19281932
SILUndef::get(address->getType(), builder.getModule()), *varInfo,
19291933
false,
@@ -2031,11 +2035,15 @@ static bool performSingleBasicBlockAnalysis(DataflowState &dataflowState,
20312035
IsInitialization);
20322036
if (auto debug = DebugVarCarryingInst::getFromValue(address)) {
20332037
if (auto varInfo = debug.getVarInfo()) {
2034-
builder.createDebugValue(
2035-
debug.inst->getLoc(),
2036-
SILUndef::get(address->getType(), builder.getModule()), *varInfo,
2037-
false,
2038+
{
2039+
SILBuilderWithScope undefBuilder(builder);
2040+
undefBuilder.setCurrentDebugScope(debug.inst->getDebugScope());
2041+
undefBuilder.createDebugValue(
2042+
debug.inst->getLoc(),
2043+
SILUndef::get(address->getType(), builder.getModule()), *varInfo,
2044+
false,
20382045
/*was moved*/ true);
2046+
}
20392047
{
20402048
// Make sure at the reinit point to create a new debug value after the
20412049
// reinit instruction so we reshow the variable.
@@ -2078,7 +2086,9 @@ static bool performSingleBasicBlockAnalysis(DataflowState &dataflowState,
20782086
dumpBitVector(llvm::dbgs(), bitVector); llvm::dbgs() << '\n');
20792087
if (auto debug = DebugVarCarryingInst::getFromValue(address)) {
20802088
if (auto varInfo = debug.getVarInfo()) {
2081-
builder.createDebugValue(
2089+
SILBuilderWithScope undefBuilder(builder);
2090+
undefBuilder.setCurrentDebugScope(debug.inst->getDebugScope());
2091+
undefBuilder.createDebugValue(
20822092
debug.inst->getLoc(),
20832093
SILUndef::get(address->getType(), builder.getModule()), *varInfo,
20842094
false,

test/DebugInfo/move_function_dbginfo.swift

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ public protocol P {
3939
// CHECK: call void @llvm.dbg.declare(metadata {{.*}}** %m.debug, metadata ![[M_COPYABLE_VALUE_TEST:[0-9]*]],
4040
//
4141
// We should have a llvm.dbg.addr for k since we moved it.
42-
// CHECK: call void @llvm.dbg.addr(metadata {{.*}}** %k.debug, metadata ![[K_COPYABLE_VALUE_TEST:[0-9]*]],
42+
// CHECK: call void @llvm.dbg.addr(metadata {{.*}}** %k.debug, metadata ![[K_COPYABLE_VALUE_METADATA:[0-9]*]], metadata !DIExpression()), !dbg ![[ADDR_LOC:[0-9]*]]
4343
//
4444
// Our undef should be an llvm.dbg.value. Counter-intuitively this works for
4545
// both llvm.dbg.addr /and/ llvm.dbg.value. Importantly though its metadata
4646
// should be for k since that is the variable that we are telling the debugger
4747
// is no longer defined.
48-
// CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC* undef, metadata ![[K_COPYABLE_VALUE_TEST]],
48+
// CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC* undef, metadata ![[K_COPYABLE_VALUE_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
4949
//
5050
// CHECK: ret void
5151
// CHECK-NEXT: }
@@ -82,8 +82,10 @@ public func copyableValueTest() {
8282

8383
// CHECK-LABEL: define swiftcc void @"$s21move_function_dbginfo15copyableVarTestyyF"()
8484
// CHECK: call void @llvm.dbg.declare(metadata %T21move_function_dbginfo5KlassC** %m.debug,
85-
// CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_METADATA:[0-9]+]],
86-
// CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC** undef, metadata ![[K_COPYABLE_VAR_METADATA]],
85+
// CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_METADATA:[0-9]+]], metadata !DIExpression()), !dbg ![[ADDR_LOC:[0-9]*]]
86+
// CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC** undef, metadata ![[K_COPYABLE_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
87+
// TODO: Should this be a deref like the original?
88+
// CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
8789
// CHECK: ret void
8890
// CHECK-NEXT: }
8991
//
@@ -124,8 +126,8 @@ public func copyableVarTest() {
124126
// CHECK: @llvm.dbg.declare(metadata %swift.type** %T1,
125127
// CHECK: @llvm.dbg.declare(metadata %swift.opaque** %x.debug,
126128
// CHECK: @llvm.dbg.declare(metadata i8** %m.debug,
127-
// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDR_LET_METADATA:[0-9]+]],
128-
// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDR_LET_METADATA]],
129+
// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDR_LET_METADATA:[0-9]+]], metadata !DIExpression(DW_OP_deref)), !dbg ![[ADDR_LOC:[0-9]*]]
130+
// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDR_LET_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
129131
// CHECK: ret void
130132
// CHECK-NEXT: }
131133
//
@@ -174,8 +176,9 @@ public func addressOnlyValueTest<T : P>(_ x: T) {
174176
// CHECK: @llvm.dbg.declare(metadata %swift.type** %T1,
175177
// CHECK: @llvm.dbg.declare(metadata %swift.opaque** %x.debug,
176178
// CHECK: @llvm.dbg.declare(metadata i8** %m.debug,
177-
// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDRONLY_VAR_METADATA:[0-9]+]],
178-
// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDRONLY_VAR_METADATA]],
179+
// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDRONLY_VAR_METADATA:[0-9]+]], metadata !DIExpression(DW_OP_deref)), !dbg ![[ADDR_LOC:[0-9]*]]
180+
// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDRONLY_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
181+
// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDRONLY_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
179182
// CHECK: ret void
180183
// CHECK-NEXT: }
181184
//
@@ -222,3 +225,12 @@ public func addressOnlyVarTest<T : P>(_ x: T) {
222225
k = x
223226
k.doSomething()
224227
}
228+
229+
//////////////////////////
230+
// Late Metadata Checks //
231+
//////////////////////////
232+
233+
// CHECK-DAG: ![[K_COPYABLE_VALUE_METADATA]] = !DILocalVariable(name: "k",
234+
// CHECK-DAG: ![[K_COPYABLE_VAR_METADATA]] = !DILocalVariable(name: "k",
235+
// CHECK-DAG: ![[K_ADDR_LET_METADATA]] = !DILocalVariable(name: "k",
236+
// CHECK-DAG: ![[K_ADDRONLY_VAR_METADATA]] = !DILocalVariable(name: "k",

tools/swift-inspect/Package.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ let package = Package(
1616
dependencies: [
1717
"SymbolicationShims",
1818
.product(name: "ArgumentParser", package: "swift-argument-parser"),
19+
],
20+
swiftSettings: [
21+
.unsafeFlags([
22+
"-parse-as-library",
23+
]),
1924
]),
2025
.testTarget(
2126
name: "swiftInspectTests",

tools/swift-inspect/Sources/SymbolicationShims/SymbolicationShims.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
#if defined(__APPLE__)
14+
1315
#include <stdint.h>
1416
#include <ptrauth.h>
1517

@@ -28,3 +30,5 @@ static inline uintptr_t GetPtrauthMask(void) {
2830
return (uintptr_t)~0ull;
2931
#endif
3032
}
33+
34+
#endif

tools/swift-inspect/Sources/swift-inspect/Backtrace.swift

Lines changed: 18 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -12,45 +12,26 @@
1212

1313
import SwiftRemoteMirror
1414

15-
struct Backtrace {
16-
enum Style {
17-
case oneLine
18-
case long
19-
}
20-
21-
/// The pointers to the locations in the backtrace. These are stored from
22-
/// deepest to shallowest, so main() will be somewhere near the end.
23-
var ptrs: [swift_reflection_ptr_t]
24-
25-
func symbolString(
26-
ptr: swift_reflection_ptr_t,
27-
inspector: Inspector
28-
) -> String {
29-
let symbol = inspector.getSymbol(address: swift_addr_t(ptr))
30-
let name = symbol.name ?? "<unknown>"
31-
let library = symbol.library ?? "<unknown>"
32-
return "\(hex: ptr) (\(library)) \(name)"
33-
}
34-
35-
func symbolicatedOneLine(inspector: Inspector) -> String {
36-
return ptrs.reversed().map {
37-
symbolString(ptr: $0, inspector: inspector)
38-
}.joined(separator: " | ")
39-
}
15+
internal enum BacktraceStyle {
16+
case oneline
17+
case long
18+
}
4019

41-
func symbolicatedLong(inspector: Inspector) -> String {
42-
return ptrs.reversed().enumerated().map {
43-
let indent = String(repeating: " ", count: $0 + 1)
44-
return indent + symbolString(ptr: $1, inspector: inspector)
45-
}.joined(separator: "\n")
20+
internal func backtrace(_ stack: [swift_reflection_ptr_t], style: BacktraceStyle,
21+
_ symbolicate: (swift_addr_t) -> (module: String?, symbol: String?)) -> String {
22+
func entry(_ address: swift_reflection_ptr_t) -> String {
23+
let (module, symbol) = symbolicate(address)
24+
return "\(hex: address) (\(module ?? "<uknown>")) \(symbol ?? "<unknown>")"
4625
}
4726

48-
func symbolicated(style: Style, inspector: Inspector) -> String {
49-
switch style {
50-
case .oneLine:
51-
return symbolicatedOneLine(inspector: inspector)
52-
case .long:
53-
return symbolicatedLong(inspector: inspector)
54-
}
27+
// The pointers to the locations in the backtrace are stored from deepest to
28+
// shallowest, so `main` will be somewhere near the end.
29+
switch style {
30+
case .oneline:
31+
return self.reversed().map { entry($0) }.joined(separator: " | ")
32+
case .long:
33+
return self.reversed().enumerated().map {
34+
" \(String(repeating: " ", count: $0 + 1)\(entry($1))"
35+
}.joined(separtor: "\n")
5536
}
5637
}

0 commit comments

Comments
 (0)