[llvm-dev] DICompileUnit duplication in LLVM 4.0.0?
Matthew O'Connor via llvm-dev
llvm-dev at lists.llvm.org
Thu Jun 8 15:07:56 PDT 2017
All,
I'm seeing duplication of DICompileUnits in a pass that worked in 3.8. I
assume I'm doing something wrong. Would someone be willing to point me in
the right direction?
The below minimized pass reproduces my issue in 4.0 with the following
error:
DICompileUnit not listed in llvm.dbg.cu
!1707 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1,
producer: "clang version 4.0.0 (tags/RELEASE_400/final)", isOptimized:
true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, imports: !1708)
dsc-opt:
/home/moconnor/Source/carte.git/llvm-carte/llvm-4.0.0/llvm/lib/IR/Verifier.cpp:4500:
virtual bool
{anonymous}::VerifierLegacyPass::doFinalization(llvm::Module&): Assertion
`!V->hasBrokenDebugInfo() && "Module contains invalid debug info"' failed.
Pass implementation:
#define DEBUG_TYPE "dupl"
#include "llvm/Pass.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include <vector>
using namespace llvm;
struct FunctionDuplication;
namespace llvm {
void initializeFunctionDuplicationPass(PassRegistry &);
}
struct FunctionDuplication : public ModulePass {
static char ID;
FunctionDuplication() : ModulePass(ID) {}
virtual StringRef getPassName() const override {
return "Duplicate every function";
}
virtual void getAnalysisUsage(AnalysisUsage &) const override;
virtual bool runOnModule(Module &) override;
Function *duplicate(Module &, Function &Old, FunctionType *NewTy) const;
};
void FunctionDuplication::getAnalysisUsage(AnalysisUsage &AU) const {
ModulePass::getAnalysisUsage(AU);
}
Function *FunctionDuplication::duplicate(Module &M, Function &Old,
FunctionType *NewTy) const {
Function *New = Function::Create(NewTy, Old.getLinkage(), "", &M);
New->setAttributes(Old.getAttributes());
New->setCallingConv(Old.getCallingConv());
// Map old arguments to the new arguments.
ValueToValueMapTy VMap;
for (auto OldFI = Old.arg_begin(), OldFE = Old.arg_end(),
NewFI = New->arg_begin();
OldFI != OldFE; ++OldFI, ++NewFI) {
Argument &OldA = *OldFI;
Argument &NewA = *NewFI;
NewA.setName(OldA.getName());
VMap[&OldA] = &NewA;
}
SmallVector<ReturnInst *, 16> Returns;
CloneAndPruneFunctionInto(New, &Old, VMap, true, Returns);
return New;
}
bool FunctionDuplication::runOnModule(Module &M) {
DataLayout const &DL = M.getDataLayout();
bool Modified = false;
std::vector<Function *> Functions;
for (auto &Fn : M.functions()) {
Functions.push_back(&Fn);
}
for (auto *F : Functions) {
if (F->size() > 0) {
dbgs() << "duplicating " << F->getName() << "\n";
duplicate(M, *F, F->getFunctionType());
Modified = true;
}
}
return Modified;
}
char FunctionDuplication::ID = 0;
INITIALIZE_PASS(FunctionDuplication, "dupl", "Duplicate every function",
false,
false)
ModulePass *createFunctionDuplicationPass(void) {
return new FunctionDuplication();
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170608/72721792/attachment.html>
More information about the llvm-dev
mailing list