diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-03-30 21:36:43 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-03-30 21:36:43 +0000 |
commit | 0d68b4c5ed89f1c8a9e4466badf69de159ee20d7 (patch) | |
tree | e2a4aa5f1b2ed0f7a569f6a352772d15adaeed9a | |
parent | 4bd905e9c524925247b0b6a651117a342cc5db68 (diff) | |
download | bcm5719-llvm-0d68b4c5ed89f1c8a9e4466badf69de159ee20d7.tar.gz bcm5719-llvm-0d68b4c5ed89f1c8a9e4466badf69de159ee20d7.zip |
Fix PR23045.
Keep a note in the materializer that we are stripping debug info so that
user doing a lazy read of the module don't hit outdated formats.
Thanks to Duncan for suggesting the fix.
llvm-svn: 233603
-rw-r--r-- | llvm/include/llvm/IR/DebugInfo.h | 1 | ||||
-rw-r--r-- | llvm/include/llvm/IR/GVMaterializer.h | 1 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/IR/DebugInfo.cpp | 29 | ||||
-rw-r--r-- | llvm/tools/gold/gold-plugin.cpp | 8 | ||||
-rw-r--r-- | llvm/tools/llvm-link/llvm-link.cpp | 8 |
6 files changed, 39 insertions, 20 deletions
diff --git a/llvm/include/llvm/IR/DebugInfo.h b/llvm/include/llvm/IR/DebugInfo.h index 25198328bf5..4aca3455c05 100644 --- a/llvm/include/llvm/IR/DebugInfo.h +++ b/llvm/include/llvm/IR/DebugInfo.h @@ -1376,6 +1376,7 @@ DITypeIdentifierMap generateDITypeIdentifierMap(const NamedMDNode *CU_Nodes); /// metadata for debugging. We also remove debug locations for instructions. /// Return true if module is modified. bool StripDebugInfo(Module &M); +bool stripDebugInfo(Function &F); /// \brief Return Debug Info Metadata Version by checking module flags. unsigned getDebugMetadataVersionFromModule(const Module &M); diff --git a/llvm/include/llvm/IR/GVMaterializer.h b/llvm/include/llvm/IR/GVMaterializer.h index ae2f2e1aefb..779f2e01818 100644 --- a/llvm/include/llvm/IR/GVMaterializer.h +++ b/llvm/include/llvm/IR/GVMaterializer.h @@ -54,6 +54,7 @@ public: virtual std::error_code MaterializeModule(Module *M) = 0; virtual std::error_code materializeMetadata() = 0; + virtual void setStripDebugInfo() = 0; virtual std::vector<StructType *> getIdentifiedStructTypes() const = 0; }; diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 84753ffd181..274b982283c 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -16,6 +16,7 @@ #include "llvm/Bitcode/LLVMBitCodes.h" #include "llvm/IR/AutoUpgrade.h" #include "llvm/IR/Constants.h" +#include "llvm/IR/DebugInfo.h" #include "llvm/IR/DebugInfoMetadata.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/DiagnosticPrinter.h" @@ -218,6 +219,8 @@ class BitcodeReader : public GVMaterializer { /// True if any Metadata block has been materialized. bool IsMetadataMaterialized; + bool StripDebugInfo = false; + public: std::error_code Error(BitcodeError E, const Twine &Message); std::error_code Error(BitcodeError E); @@ -255,6 +258,8 @@ public: /// Materialize any deferred Metadata block. std::error_code materializeMetadata() override; + void setStripDebugInfo() override; + private: std::vector<StructType *> IdentifiedStructTypes; StructType *createIdentifiedStructType(LLVMContext &Context, StringRef Name); @@ -2609,6 +2614,10 @@ std::error_code BitcodeReader::materializeMetadata() { return std::error_code(); } +void BitcodeReader::setStripDebugInfo() { + StripDebugInfo = true; +} + /// RememberAndSkipFunctionBody - When we see the block for a function body, /// remember where it is and then skip it. This lets us lazily deserialize the /// functions. @@ -4305,6 +4314,9 @@ std::error_code BitcodeReader::materialize(GlobalValue *GV) { return EC; F->setIsMaterializable(false); + if (StripDebugInfo) + stripDebugInfo(*F); + // Upgrade any old intrinsic calls in the function. for (UpgradedIntrinsicMap::iterator I = UpgradedIntrinsics.begin(), E = UpgradedIntrinsics.end(); I != E; ++I) { diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp index d772583ba6e..bc40907ba18 100644 --- a/llvm/lib/IR/DebugInfo.cpp +++ b/llvm/lib/IR/DebugInfo.cpp @@ -25,6 +25,7 @@ #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Intrinsics.h" +#include "llvm/IR/GVMaterializer.h" #include "llvm/IR/Module.h" #include "llvm/IR/ValueHandle.h" #include "llvm/Support/Debug.h" @@ -945,6 +946,19 @@ template <> DITypeRef DIDescriptor::getFieldAs<DITypeRef>(unsigned Elt) const { return DITypeRef(cast_or_null<Metadata>(getField(DbgNode, Elt))); } +bool llvm::stripDebugInfo(Function &F) { + bool Changed = false; + for (BasicBlock &BB : F) { + for (Instruction &I : BB) { + if (I.getDebugLoc()) { + Changed = true; + I.setDebugLoc(DebugLoc()); + } + } + } + return Changed; +} + bool llvm::StripDebugInfo(Module &M) { bool Changed = false; @@ -978,16 +992,11 @@ bool llvm::StripDebugInfo(Module &M) { } } - for (Function &F : M) { - for (BasicBlock &BB : F) { - for (Instruction &I : BB) { - if (I.getDebugLoc()) { - Changed = true; - I.setDebugLoc(DebugLoc()); - } - } - } - } + for (Function &F : M) + Changed |= stripDebugInfo(F); + + if ( GVMaterializer *Materializer = M.getMaterializer()) + Materializer->setStripDebugInfo(); return Changed; } diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp index 16e5045bcb9..93ce3bc0f44 100644 --- a/llvm/tools/gold/gold-plugin.cpp +++ b/llvm/tools/gold/gold-plugin.cpp @@ -20,6 +20,7 @@ #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/CodeGen/Analysis.h" #include "llvm/CodeGen/CommandFlags.h" +#include "llvm/IR/AutoUpgrade.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/DiagnosticPrinter.h" @@ -602,11 +603,8 @@ getModuleForFile(LLVMContext &Context, claimed_file &F, Module &M = Obj.getModule(); - // Fixme (pr23045). We would like to upgrade the metadata with something like - // Result->materializeMetadata(); - // UpgradeDebugInfo(*Result); - // but that fails to drop old debug info from function bodies. - M.materializeAllPermanently(); + M.materializeMetadata(); + UpgradeDebugInfo(M); SmallPtrSet<GlobalValue *, 8> Used; collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false); diff --git a/llvm/tools/llvm-link/llvm-link.cpp b/llvm/tools/llvm-link/llvm-link.cpp index a15855b392a..29c4c736b33 100644 --- a/llvm/tools/llvm-link/llvm-link.cpp +++ b/llvm/tools/llvm-link/llvm-link.cpp @@ -15,6 +15,7 @@ #include "llvm/Linker/Linker.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/IR/AutoUpgrade.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/DiagnosticPrinter.h" #include "llvm/IR/LLVMContext.h" @@ -69,11 +70,8 @@ loadFile(const char *argv0, const std::string &FN, LLVMContext &Context) { if (!Result) Err.print(argv0, errs()); - // Fixme (pr23045). We would like to upgrade the metadata with something like - // Result->materializeMetadata(); - // UpgradeDebugInfo(*Result); - // but that fails to drop old debug info from function bodies. - Result->materializeAllPermanently(); + Result->materializeMetadata(); + UpgradeDebugInfo(*Result); return Result; } |