Skip to content

Commit 2f01fd9

Browse files
authored
[RemoveDIs] Load into new debug info format by default in LLVM (#89799)
This patch enables parsing and creating modules directly into the new debug info format. Prior to this patch, all modules were constructed with the old debug info format by default, and would be converted into the new format just before running LLVM passes. This is an important milestone, in that this means that every tool will now be exposed to debug records, rather than those that run LLVM passes. As far as I've tested, all LLVM tools/projects now either handle debug records, or convert them to the old intrinsic format. There are a few unit tests that need updating for this patch; these are either cases of tests that previously needed to set the debug info format to function, or tests that depend on the old debug info format in some way. There should be no visible change in the output of any LLVM tool as a result of this patch, although the likelihood of this patch breaking downstream code means an NFC tag might be a little misleading, if not technically incorrect: This will probably break some downstream tools that don't already handle debug records. If your downstream code breaks as a result of this change, the simplest fix is to convert the module in question to the old debug format before you process it, using `Module::convertFromNewDbgValues()`. For more information about how to handle debug records or about what has changed, see the migration document: https://llvm.org/docs/RemoveDIsDebugInfo.html
1 parent 167427f commit 2f01fd9

File tree

16 files changed

+143
-61
lines changed

16 files changed

+143
-61
lines changed

llvm/docs/ReleaseNotes.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,13 @@ Changes to the Metadata Info
170170
Changes to the Debug Info
171171
---------------------------------
172172

173+
* LLVM has switched from using debug intrinsics internally to using debug
174+
records by default. This should happen transparently when using the DIBuilder
175+
to construct debug variable information, but will require changes for any code
176+
that interacts with debug intrinsics directly. Debug intrinsics will only be
177+
supported on a best-effort basis from here onwards; for more information, see
178+
the `migration docs <https://llvm.org/docs/RemoveDIsDebugInfo.html>`_.
179+
173180
Changes to the LLVM tools
174181
---------------------------------
175182
* llvm-nm and llvm-objdump can now print symbol information from linked

llvm/include/llvm/AsmParser/LLParser.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,6 @@ namespace llvm {
337337

338338
// Top-Level Entities
339339
bool parseTopLevelEntities();
340-
bool finalizeDebugInfoFormat(Module *M);
341340
void dropUnknownMetadataReferences();
342341
bool validateEndOfModule(bool UpgradeDebugInfo);
343342
bool validateEndOfIndex();

llvm/lib/AsmParser/LLParser.cpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -74,23 +74,6 @@ static std::string getTypeString(Type *T) {
7474
return Tmp.str();
7575
}
7676

77-
// Whatever debug info format we parsed, we should convert to the expected debug
78-
// info format immediately afterwards.
79-
bool LLParser::finalizeDebugInfoFormat(Module *M) {
80-
// We should have already returned an error if we observed both intrinsics and
81-
// records in this IR.
82-
assert(!(SeenNewDbgInfoFormat && SeenOldDbgInfoFormat) &&
83-
"Mixed debug intrinsics/records seen without a parsing error?");
84-
if (PreserveInputDbgFormat == cl::boolOrDefault::BOU_TRUE) {
85-
UseNewDbgInfoFormat = SeenNewDbgInfoFormat;
86-
WriteNewDbgInfoFormatToBitcode = SeenNewDbgInfoFormat;
87-
WriteNewDbgInfoFormat = SeenNewDbgInfoFormat;
88-
} else if (M) {
89-
M->setIsNewDbgInfoFormat(false);
90-
}
91-
return false;
92-
}
93-
9477
/// Run: module ::= toplevelentity*
9578
bool LLParser::Run(bool UpgradeDebugInfo,
9679
DataLayoutCallbackTy DataLayoutCallback) {
@@ -108,7 +91,7 @@ bool LLParser::Run(bool UpgradeDebugInfo,
10891
}
10992

11093
return parseTopLevelEntities() || validateEndOfModule(UpgradeDebugInfo) ||
111-
validateEndOfIndex() || finalizeDebugInfoFormat(M);
94+
validateEndOfIndex();
11295
}
11396

11497
bool LLParser::parseStandaloneConstantValue(Constant *&C,
@@ -207,6 +190,18 @@ void LLParser::dropUnknownMetadataReferences() {
207190
bool LLParser::validateEndOfModule(bool UpgradeDebugInfo) {
208191
if (!M)
209192
return false;
193+
194+
// We should have already returned an error if we observed both intrinsics and
195+
// records in this IR.
196+
assert(!(SeenNewDbgInfoFormat && SeenOldDbgInfoFormat) &&
197+
"Mixed debug intrinsics/records seen without a parsing error?");
198+
if (PreserveInputDbgFormat == cl::boolOrDefault::BOU_TRUE) {
199+
UseNewDbgInfoFormat = SeenNewDbgInfoFormat;
200+
WriteNewDbgInfoFormatToBitcode = SeenNewDbgInfoFormat;
201+
WriteNewDbgInfoFormat = SeenNewDbgInfoFormat;
202+
M->setNewDbgInfoFormatFlag(SeenNewDbgInfoFormat);
203+
}
204+
210205
// Handle any function attribute group forward references.
211206
for (const auto &RAG : ForwardRefAttrGroups) {
212207
Value *V = RAG.first;
@@ -439,6 +434,9 @@ bool LLParser::validateEndOfModule(bool UpgradeDebugInfo) {
439434
UpgradeModuleFlags(*M);
440435
UpgradeSectionAttributes(*M);
441436

437+
if (PreserveInputDbgFormat != cl::boolOrDefault::BOU_TRUE)
438+
M->setIsNewDbgInfoFormat(UseNewDbgInfoFormat);
439+
442440
if (!Slots)
443441
return false;
444442
// Initialize the slot mapping.

llvm/lib/Bitcode/Reader/BitcodeReader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4319,7 +4319,7 @@ Error BitcodeReader::parseModule(uint64_t ResumeBit,
43194319
if (PreserveInputDbgFormat != cl::boolOrDefault::BOU_TRUE) {
43204320
TheModule->IsNewDbgInfoFormat =
43214321
UseNewDbgInfoFormat &&
4322-
LoadBitcodeIntoNewDbgInfoFormat == cl::boolOrDefault::BOU_TRUE;
4322+
LoadBitcodeIntoNewDbgInfoFormat != cl::boolOrDefault::BOU_FALSE;
43234323
}
43244324

43254325
this->ValueTypeCallback = std::move(Callbacks.ValueType);

llvm/lib/IR/BasicBlock.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ template class llvm::SymbolTableListTraits<Instruction,
181181
BasicBlock::BasicBlock(LLVMContext &C, const Twine &Name, Function *NewParent,
182182
BasicBlock *InsertBefore)
183183
: Value(Type::getLabelTy(C), Value::BasicBlockVal),
184-
IsNewDbgInfoFormat(false), Parent(nullptr) {
184+
IsNewDbgInfoFormat(UseNewDbgInfoFormat), Parent(nullptr) {
185185

186186
if (NewParent)
187187
insertInto(NewParent, InsertBefore);

llvm/lib/IR/Function.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ static cl::opt<unsigned> NonGlobalValueMaxNameSize(
8383
"non-global-value-max-name-size", cl::Hidden, cl::init(1024),
8484
cl::desc("Maximum size for the name of non-global values."));
8585

86+
extern cl::opt<bool> UseNewDbgInfoFormat;
87+
8688
void Function::convertToNewDbgValues() {
8789
IsNewDbgInfoFormat = true;
8890
for (auto &BB : *this) {
@@ -438,7 +440,7 @@ Function::Function(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace,
438440
: GlobalObject(Ty, Value::FunctionVal,
439441
OperandTraits<Function>::op_begin(this), 0, Linkage, name,
440442
computeAddrSpace(AddrSpace, ParentModule)),
441-
NumArgs(Ty->getNumParams()), IsNewDbgInfoFormat(false) {
443+
NumArgs(Ty->getNumParams()), IsNewDbgInfoFormat(UseNewDbgInfoFormat) {
442444
assert(FunctionType::isValidReturnType(getReturnType()) &&
443445
"invalid return type");
444446
setGlobalObjectSubClassData(0);

llvm/lib/IR/Module.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454

5555
using namespace llvm;
5656

57+
extern cl::opt<bool> UseNewDbgInfoFormat;
58+
5759
//===----------------------------------------------------------------------===//
5860
// Methods to implement the globals and functions lists.
5961
//
@@ -72,7 +74,7 @@ template class llvm::SymbolTableListTraits<GlobalIFunc>;
7274
Module::Module(StringRef MID, LLVMContext &C)
7375
: Context(C), ValSymTab(std::make_unique<ValueSymbolTable>(-1)),
7476
ModuleID(std::string(MID)), SourceFileName(std::string(MID)), DL(""),
75-
IsNewDbgInfoFormat(false) {
77+
IsNewDbgInfoFormat(UseNewDbgInfoFormat) {
7678
Context.addModule(this);
7779
}
7880

llvm/tools/llvm-as/llvm-as.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,10 @@ int main(int argc, char **argv) {
142142
}
143143

144144
// Convert to new debug format if requested.
145-
assert(!M->IsNewDbgInfoFormat && "Unexpectedly in new debug mode");
146-
if (UseNewDbgInfoFormat && WriteNewDbgInfoFormatToBitcode) {
147-
M->convertToNewDbgValues();
145+
M->setIsNewDbgInfoFormat(UseNewDbgInfoFormat &&
146+
WriteNewDbgInfoFormatToBitcode);
147+
if (M->IsNewDbgInfoFormat)
148148
M->removeDebugIntrinsicDeclarations();
149-
}
150149

151150
std::unique_ptr<ModuleSummaryIndex> Index = std::move(ModuleAndIndex.Index);
152151

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ int main(int argc, char **argv) {
258258
// All that llvm-dis does is write the assembly to a file.
259259
if (!DontPrint) {
260260
if (M) {
261-
ScopedDbgInfoFormatSetter FormatSetter(*M, WriteNewDbgInfoFormat);
261+
M->setIsNewDbgInfoFormat(WriteNewDbgInfoFormat);
262262
if (WriteNewDbgInfoFormat)
263263
M->removeDebugIntrinsicDeclarations();
264264
M->print(Out->os(), Annotator.get(), PreserveAssemblyUseListOrder);

llvm/tools/llvm-link/llvm-link.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -489,12 +489,6 @@ int main(int argc, char **argv) {
489489
if (LoadBitcodeIntoNewDbgInfoFormat == cl::boolOrDefault::BOU_UNSET)
490490
LoadBitcodeIntoNewDbgInfoFormat = cl::boolOrDefault::BOU_TRUE;
491491

492-
// RemoveDIs debug-info transition: tests may request that we /try/ to use the
493-
// new debug-info format.
494-
if (TryUseNewDbgInfoFormat) {
495-
// Turn the new debug-info format on.
496-
UseNewDbgInfoFormat = true;
497-
}
498492
// Since llvm-link collects multiple IR modules together, for simplicity's
499493
// sake we disable the "PreserveInputDbgFormat" flag to enforce a single
500494
// debug info format.
@@ -556,7 +550,7 @@ int main(int argc, char **argv) {
556550
SetFormat(WriteNewDbgInfoFormat);
557551
Composite->print(Out.os(), nullptr, PreserveAssemblyUseListOrder);
558552
} else if (Force || !CheckBitcodeOutputToConsole(Out.os())) {
559-
SetFormat(WriteNewDbgInfoFormatToBitcode);
553+
SetFormat(UseNewDbgInfoFormat && WriteNewDbgInfoFormatToBitcode);
560554
WriteBitcodeToFile(*Composite, Out.os(), PreserveBitcodeUseListOrder);
561555
}
562556

0 commit comments

Comments
 (0)