Skip to content

Commit 4f909da

Browse files
authored
[RemoveDIs] Add flag to control loading into new debug mode from bitcode (#85649)
--load-bitcode-into-experimental-debuginfo-iterators false: Convert to the old debug mode after reading. true: Upgrade to the new debug info format (*). unset: Same as false (for now). (*) As of this patch it actually just means "don't convert to either mode after loading". Auto-upgrading will be implemented in an upcoming patch. With this flag we can incrementally add support for RemoveDIs by overriding the "unset" behaviour in individual tools. The flag can be removed once all tools support the new debug info mode.
1 parent 4a6bc9f commit 4f909da

File tree

3 files changed

+57
-8
lines changed

3 files changed

+57
-8
lines changed

llvm/lib/Bitcode/Reader/BitcodeReader.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,15 @@ static cl::opt<bool> ExpandConstantExprs(
100100
cl::desc(
101101
"Expand constant expressions to instructions for testing purposes"));
102102

103+
/// Load bitcode directly into RemoveDIs format (use debug records instead
104+
/// of debug intrinsics). UNSET is treated as FALSE, so the default action
105+
/// is to do nothing. Individual tools can override this to incrementally add
106+
/// support for the RemoveDIs format.
107+
cl::opt<cl::boolOrDefault> LoadBitcodeIntoNewDbgInforFormat(
108+
"load-bitcode-into-experimental-debuginfo-iterators", cl::Hidden,
109+
cl::desc("Load bitcode directly into the new debug info format (regardless "
110+
"of input format)"));
111+
103112
namespace {
104113

105114
enum {
@@ -4276,9 +4285,11 @@ Error BitcodeReader::parseGlobalIndirectSymbolRecord(
42764285
Error BitcodeReader::parseModule(uint64_t ResumeBit,
42774286
bool ShouldLazyLoadMetadata,
42784287
ParserCallbacks Callbacks) {
4279-
// Force the debug-info mode into the old format for now.
4280-
// FIXME: Remove this once all tools support RemoveDIs.
4281-
TheModule->IsNewDbgInfoFormat = false;
4288+
// Load directly into RemoveDIs format if LoadBitcodeIntoNewDbgInforFormat
4289+
// has been set to true (default action: load into the old debug format).
4290+
TheModule->IsNewDbgInfoFormat =
4291+
UseNewDbgInfoFormat &&
4292+
LoadBitcodeIntoNewDbgInforFormat == cl::boolOrDefault::BOU_TRUE;
42824293

42834294
this->ValueTypeCallback = std::move(Callbacks.ValueType);
42844295
if (ResumeBit) {
@@ -6762,9 +6773,9 @@ Error BitcodeReader::materialize(GlobalValue *GV) {
67626773
if (Error JumpFailed = Stream.JumpToBit(DFII->second))
67636774
return JumpFailed;
67646775

6765-
// Set the debug info mode to "new", forcing a mismatch between
6776+
// Set the debug info mode to "new", possibly creating a mismatch between
67666777
// module and function debug modes. This is okay because we'll convert
6767-
// everything back to the old mode after parsing.
6778+
// everything back to the old mode after parsing if needed.
67686779
// FIXME: Remove this once all tools support RemoveDIs.
67696780
F->IsNewDbgInfoFormat = true;
67706781

@@ -6774,7 +6785,8 @@ Error BitcodeReader::materialize(GlobalValue *GV) {
67746785

67756786
// Convert new debug info records into intrinsics.
67766787
// FIXME: Remove this once all tools support RemoveDIs.
6777-
F->convertFromNewDbgValues();
6788+
if (!F->getParent()->IsNewDbgInfoFormat)
6789+
F->convertFromNewDbgValues();
67786790

67796791
if (StripDebugInfo)
67806792
stripDebugInfo(*F);

llvm/test/Bitcode/dbg-record-roundtrip.ll

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
;; Roundtrip tests.
2-
; RUN: llvm-as --write-experimental-debuginfo-iterators-to-bitcode=true %s -o - | llvm-dis | FileCheck %s
2+
3+
;; Load RemoveDIs mode in llvm-dis but write out debug intrinsics.
4+
; RUN: llvm-as --write-experimental-debuginfo-iterators-to-bitcode=true %s -o - \
5+
; RUN: | llvm-dis --load-bitcode-into-experimental-debuginfo-iterators=true --write-experimental-debuginfo=false \
6+
; RUN: | FileCheck %s
7+
8+
;; Load and write RemoveDIs mode in llvm-dis.
9+
; RUN: llvm-as --write-experimental-debuginfo-iterators-to-bitcode=true %s -o - \
10+
; RUN: | llvm-dis --load-bitcode-into-experimental-debuginfo-iterators=true --write-experimental-debuginfo=true \
11+
; RUN: | FileCheck %s --check-prefixes=RECORDS
12+
313
;; Check that verify-uselistorder passes regardless of input format.
414
; RUN: llvm-as %s --write-experimental-debuginfo-iterators-to-bitcode=true -o - | verify-uselistorder
515
; RUN: verify-uselistorder %s
@@ -39,16 +49,24 @@ entry:
3949
; CHECK-NEXT: dbg.value(metadata ![[empty:[0-9]+]], metadata ![[e]], metadata !DIExpression()), !dbg ![[dbg]]
4050
; CHECK-NEXT: dbg.value(metadata i32 poison, metadata ![[e]], metadata !DIExpression()), !dbg ![[dbg]]
4151
; CHECK-NEXT: dbg.value(metadata i32 1, metadata ![[f:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]]
52+
; RECORDS: entry:
53+
; RECORDS-NEXT: dbg_value(i32 %p, ![[e:[0-9]+]], !DIExpression(), ![[dbg:[0-9]+]])
54+
; RECORDS-NEXT: dbg_value(![[empty:[0-9]+]], ![[e]], !DIExpression(), ![[dbg]])
55+
; RECORDS-NEXT: dbg_value(i32 poison, ![[e]], !DIExpression(), ![[dbg]])
56+
; RECORDS-NEXT: dbg_value(i32 1, ![[f:[0-9]+]], !DIExpression(), ![[dbg]])
4257
tail call void @llvm.dbg.value(metadata i32 %p, metadata !32, metadata !DIExpression()), !dbg !19
4358
tail call void @llvm.dbg.value(metadata !29, metadata !32, metadata !DIExpression()), !dbg !19
4459
tail call void @llvm.dbg.value(metadata i32 poison, metadata !32, metadata !DIExpression()), !dbg !19
4560
tail call void @llvm.dbg.value(metadata i32 1, metadata !33, metadata !DIExpression()), !dbg !19
4661
;; Arglist with an argument, constant, local use before def, poison.
4762
; CHECK-NEXT: dbg.value(metadata !DIArgList(i32 %p, i32 0, i32 %0, i32 poison), metadata ![[f]], metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_LLVM_arg, 2, DW_OP_LLVM_arg, 3, DW_OP_plus, DW_OP_minus)), !dbg ![[dbg]]
63+
; RECORDS-NEXT: dbg_value(!DIArgList(i32 %p, i32 0, i32 %0, i32 poison), ![[f]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_LLVM_arg, 2, DW_OP_LLVM_arg, 3, DW_OP_plus, DW_OP_minus), ![[dbg]])
4864
tail call void @llvm.dbg.value(metadata !DIArgList(i32 %p, i32 0, i32 %0, i32 poison), metadata !33, metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_LLVM_arg, 2, DW_OP_LLVM_arg, 3, DW_OP_plus, DW_OP_minus)), !dbg !19
4965
;; Check dbg.assign use before def (value, addr and ID). Check expression order too.
5066
; CHECK: dbg.assign(metadata i32 %0, metadata ![[i:[0-9]+]], metadata !DIExpression(DW_OP_plus_uconst, 0),
5167
; CHECK-SAME: metadata ![[ID:[0-9]+]], metadata ptr %a, metadata !DIExpression(DW_OP_plus_uconst, 1)), !dbg ![[dbg]]
68+
; RECORDS: dbg_assign(i32 %0, ![[i:[0-9]+]], !DIExpression(DW_OP_plus_uconst, 0),
69+
; RECORDS-SAME: ![[ID:[0-9]+]], ptr %a, !DIExpression(DW_OP_plus_uconst, 1), ![[dbg]])
5270
tail call void @llvm.dbg.assign(metadata i32 %0, metadata !36, metadata !DIExpression(DW_OP_plus_uconst, 0), metadata !37, metadata ptr %a, metadata !DIExpression(DW_OP_plus_uconst, 1)), !dbg !19
5371
%a = alloca i32, align 4, !DIAssignID !37
5472
; CHECK: %a = alloca i32, align 4, !DIAssignID ![[ID]]
@@ -58,24 +76,35 @@ entry:
5876
; CHECK-NEXT: dbg.declare(metadata ptr poison, metadata ![[c:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]]
5977
; CHECK-NEXT: dbg.declare(metadata ptr null, metadata ![[d:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]]
6078
; CHECK-NEXT: dbg.declare(metadata ptr @g, metadata ![[h:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]]
79+
; RECORDS: %a = alloca i32, align 4, !DIAssignID ![[ID]]
80+
;; Check dbg.declare configurations.
81+
; RECORDS-NEXT: dbg_declare(ptr %a, ![[a:[0-9]+]], !DIExpression(), ![[dbg]])
82+
; RECORDS-NEXT: dbg_declare(![[empty:[0-9]+]], ![[b:[0-9]+]], !DIExpression(), ![[dbg]])
83+
; RECORDS-NEXT: dbg_declare(ptr poison, ![[c:[0-9]+]], !DIExpression(), ![[dbg]])
84+
; RECORDS-NEXT: dbg_declare(ptr null, ![[d:[0-9]+]], !DIExpression(), ![[dbg]])
85+
; RECORDS-NEXT: dbg_declare(ptr @g, ![[h:[0-9]+]], !DIExpression(), ![[dbg]])
6186
tail call void @llvm.dbg.declare(metadata ptr %a, metadata !17, metadata !DIExpression()), !dbg !19
6287
tail call void @llvm.dbg.declare(metadata !29, metadata !28, metadata !DIExpression()), !dbg !19
6388
tail call void @llvm.dbg.declare(metadata ptr poison, metadata !30, metadata !DIExpression()), !dbg !19
6489
tail call void @llvm.dbg.declare(metadata ptr null, metadata !31, metadata !DIExpression()), !dbg !19
6590
tail call void @llvm.dbg.declare(metadata ptr @g, metadata !35, metadata !DIExpression()), !dbg !19
6691
;; Argument value dbg.declare.
6792
; CHECK: dbg.declare(metadata ptr %storage, metadata ![[g:[0-9]+]], metadata !DIExpression()), !dbg ![[dbg]]
93+
; RECORDS: dbg_declare(ptr %storage, ![[g:[0-9]+]], !DIExpression(), ![[dbg]])
6894
tail call void @llvm.dbg.declare(metadata ptr %storage, metadata !34, metadata !DIExpression()), !dbg !19
6995
;; Use before def dbg.value.
7096
; CHECK: dbg.value(metadata i32 %0, metadata ![[e]], metadata !DIExpression()), !dbg ![[dbg]]
97+
; RECORDS: dbg_value(i32 %0, ![[e]], !DIExpression(), ![[dbg]])
7198
tail call void @llvm.dbg.value(metadata i32 %0, metadata !32, metadata !DIExpression()), !dbg !19
7299
%0 = load i32, ptr @g, align 4, !dbg !20
73100
;; Non-argument local value dbg.value.
74101
; CHECK: dbg.value(metadata i32 %0, metadata ![[e]], metadata !DIExpression()), !dbg ![[dbg]]
102+
; RECORDS: dbg_value(i32 %0, ![[e]], !DIExpression(), ![[dbg]])
75103
tail call void @llvm.dbg.value(metadata i32 %0, metadata !32, metadata !DIExpression()), !dbg !19
76104
store i32 %0, ptr %a, align 4, !dbg !19
77105
%1 = load i32, ptr %a, align 4, !dbg !25
78106
; CHECK: dbg.label(metadata ![[label:[0-9]+]]), !dbg ![[dbg]]
107+
; RECORDS: dbg_label(![[label:[0-9]+]], ![[dbg]])
79108
tail call void @llvm.dbg.label(metadata !38), !dbg !19
80109
ret i32 %1, !dbg !27
81110
}

llvm/tools/llvm-dis/llvm-dis.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ static cl::opt<bool> PrintThinLTOIndexOnly(
8080
cl::desc("Only read thinlto index and print the index as LLVM assembly."),
8181
cl::init(false), cl::Hidden, cl::cat(DisCategory));
8282

83+
extern cl::opt<bool> WriteNewDbgInfoFormat;
84+
8385
namespace {
8486

8587
static void printDebugLoc(const DebugLoc &DL, formatted_raw_ostream &OS) {
@@ -249,8 +251,14 @@ int main(int argc, char **argv) {
249251

250252
// All that llvm-dis does is write the assembly to a file.
251253
if (!DontPrint) {
252-
if (M)
254+
if (M) {
255+
bool ChangeDbgFormat = M->IsNewDbgInfoFormat != WriteNewDbgInfoFormat;
256+
if (ChangeDbgFormat)
257+
M->setIsNewDbgInfoFormat(WriteNewDbgInfoFormat);
253258
M->print(Out->os(), Annotator.get(), PreserveAssemblyUseListOrder);
259+
if (ChangeDbgFormat)
260+
M->setIsNewDbgInfoFormat(!WriteNewDbgInfoFormat);
261+
}
254262
if (Index)
255263
Index->print(Out->os());
256264
}

0 commit comments

Comments
 (0)