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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233603 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2015-03-30 21:36:43 +00:00
parent 7f3757eb9b
commit a55ae077e4
6 changed files with 39 additions and 20 deletions

View File

@ -1376,6 +1376,7 @@ DITypeIdentifierMap generateDITypeIdentifierMap(const NamedMDNode *CU_Nodes);
/// metadata for debugging. We also remove debug locations for instructions. /// metadata for debugging. We also remove debug locations for instructions.
/// Return true if module is modified. /// Return true if module is modified.
bool StripDebugInfo(Module &M); bool StripDebugInfo(Module &M);
bool stripDebugInfo(Function &F);
/// \brief Return Debug Info Metadata Version by checking module flags. /// \brief Return Debug Info Metadata Version by checking module flags.
unsigned getDebugMetadataVersionFromModule(const Module &M); unsigned getDebugMetadataVersionFromModule(const Module &M);

View File

@ -54,6 +54,7 @@ public:
virtual std::error_code MaterializeModule(Module *M) = 0; virtual std::error_code MaterializeModule(Module *M) = 0;
virtual std::error_code materializeMetadata() = 0; virtual std::error_code materializeMetadata() = 0;
virtual void setStripDebugInfo() = 0;
virtual std::vector<StructType *> getIdentifiedStructTypes() const = 0; virtual std::vector<StructType *> getIdentifiedStructTypes() const = 0;
}; };

View File

@ -16,6 +16,7 @@
#include "llvm/Bitcode/LLVMBitCodes.h" #include "llvm/Bitcode/LLVMBitCodes.h"
#include "llvm/IR/AutoUpgrade.h" #include "llvm/IR/AutoUpgrade.h"
#include "llvm/IR/Constants.h" #include "llvm/IR/Constants.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DebugInfoMetadata.h" #include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DerivedTypes.h" #include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/DiagnosticPrinter.h" #include "llvm/IR/DiagnosticPrinter.h"
@ -218,6 +219,8 @@ class BitcodeReader : public GVMaterializer {
/// True if any Metadata block has been materialized. /// True if any Metadata block has been materialized.
bool IsMetadataMaterialized; bool IsMetadataMaterialized;
bool StripDebugInfo = false;
public: public:
std::error_code Error(BitcodeError E, const Twine &Message); std::error_code Error(BitcodeError E, const Twine &Message);
std::error_code Error(BitcodeError E); std::error_code Error(BitcodeError E);
@ -255,6 +258,8 @@ public:
/// Materialize any deferred Metadata block. /// Materialize any deferred Metadata block.
std::error_code materializeMetadata() override; std::error_code materializeMetadata() override;
void setStripDebugInfo() override;
private: private:
std::vector<StructType *> IdentifiedStructTypes; std::vector<StructType *> IdentifiedStructTypes;
StructType *createIdentifiedStructType(LLVMContext &Context, StringRef Name); StructType *createIdentifiedStructType(LLVMContext &Context, StringRef Name);
@ -2609,6 +2614,10 @@ std::error_code BitcodeReader::materializeMetadata() {
return std::error_code(); return std::error_code();
} }
void BitcodeReader::setStripDebugInfo() {
StripDebugInfo = true;
}
/// RememberAndSkipFunctionBody - When we see the block for a function body, /// RememberAndSkipFunctionBody - When we see the block for a function body,
/// remember where it is and then skip it. This lets us lazily deserialize the /// remember where it is and then skip it. This lets us lazily deserialize the
/// functions. /// functions.
@ -4305,6 +4314,9 @@ std::error_code BitcodeReader::materialize(GlobalValue *GV) {
return EC; return EC;
F->setIsMaterializable(false); F->setIsMaterializable(false);
if (StripDebugInfo)
stripDebugInfo(*F);
// Upgrade any old intrinsic calls in the function. // Upgrade any old intrinsic calls in the function.
for (UpgradedIntrinsicMap::iterator I = UpgradedIntrinsics.begin(), for (UpgradedIntrinsicMap::iterator I = UpgradedIntrinsics.begin(),
E = UpgradedIntrinsics.end(); I != E; ++I) { E = UpgradedIntrinsics.end(); I != E; ++I) {

View File

@ -25,6 +25,7 @@
#include "llvm/IR/Instructions.h" #include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h" #include "llvm/IR/Intrinsics.h"
#include "llvm/IR/GVMaterializer.h"
#include "llvm/IR/Module.h" #include "llvm/IR/Module.h"
#include "llvm/IR/ValueHandle.h" #include "llvm/IR/ValueHandle.h"
#include "llvm/Support/Debug.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))); 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 llvm::StripDebugInfo(Module &M) {
bool Changed = false; bool Changed = false;
@ -978,16 +992,11 @@ bool llvm::StripDebugInfo(Module &M) {
} }
} }
for (Function &F : M) { for (Function &F : M)
for (BasicBlock &BB : F) { Changed |= stripDebugInfo(F);
for (Instruction &I : BB) {
if (I.getDebugLoc()) { if ( GVMaterializer *Materializer = M.getMaterializer())
Changed = true; Materializer->setStripDebugInfo();
I.setDebugLoc(DebugLoc());
}
}
}
}
return Changed; return Changed;
} }

View File

@ -20,6 +20,7 @@
#include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/CodeGen/Analysis.h" #include "llvm/CodeGen/Analysis.h"
#include "llvm/CodeGen/CommandFlags.h" #include "llvm/CodeGen/CommandFlags.h"
#include "llvm/IR/AutoUpgrade.h"
#include "llvm/IR/Constants.h" #include "llvm/IR/Constants.h"
#include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/DiagnosticPrinter.h" #include "llvm/IR/DiagnosticPrinter.h"
@ -602,11 +603,8 @@ getModuleForFile(LLVMContext &Context, claimed_file &F,
Module &M = Obj.getModule(); Module &M = Obj.getModule();
// Fixme (pr23045). We would like to upgrade the metadata with something like M.materializeMetadata();
// Result->materializeMetadata(); UpgradeDebugInfo(M);
// UpgradeDebugInfo(*Result);
// but that fails to drop old debug info from function bodies.
M.materializeAllPermanently();
SmallPtrSet<GlobalValue *, 8> Used; SmallPtrSet<GlobalValue *, 8> Used;
collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false); collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false);

View File

@ -15,6 +15,7 @@
#include "llvm/Linker/Linker.h" #include "llvm/Linker/Linker.h"
#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/STLExtras.h"
#include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/IR/AutoUpgrade.h"
#include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/DiagnosticPrinter.h" #include "llvm/IR/DiagnosticPrinter.h"
#include "llvm/IR/LLVMContext.h" #include "llvm/IR/LLVMContext.h"
@ -69,11 +70,8 @@ loadFile(const char *argv0, const std::string &FN, LLVMContext &Context) {
if (!Result) if (!Result)
Err.print(argv0, errs()); Err.print(argv0, errs());
// Fixme (pr23045). We would like to upgrade the metadata with something like Result->materializeMetadata();
// Result->materializeMetadata(); UpgradeDebugInfo(*Result);
// UpgradeDebugInfo(*Result);
// but that fails to drop old debug info from function bodies.
Result->materializeAllPermanently();
return Result; return Result;
} }