Matthew O'Connor via llvm-dev
2017-Jun-08 23:05 UTC
[llvm-dev] DICompileUnit duplication in LLVM 4.0.0?
Thank you. What I need to do to address this? Open an issue on bugs.llvm.org? I'm not sure what the fix needs to be in the cloner. On Thu, Jun 8, 2017 at 4:19 PM, Peter Collingbourne <peter at pcc.me.uk> wrote:> There have in the past been bugs in the cloner involving duplicate > DICompileUnits (see e.g. https://reviews.llvm.org/D29240), this one may > need a similar fix. > > Peter > > On Thu, Jun 8, 2017 at 3:07 PM, Matthew O'Connor via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > >> 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(); >> } >> >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >> > > > -- > -- > Peter >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170608/7cd9c76f/attachment.html>
David Blaikie via llvm-dev
2017-Jun-09 17:29 UTC
[llvm-dev] DICompileUnit duplication in LLVM 4.0.0?
+ Adrian to take a look On Thu, Jun 8, 2017 at 4:06 PM Matthew O'Connor via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Thank you. What I need to do to address this? Open an issue on > bugs.llvm.org? I'm not sure what the fix needs to be in the cloner. > > On Thu, Jun 8, 2017 at 4:19 PM, Peter Collingbourne <peter at pcc.me.uk> > wrote: > >> There have in the past been bugs in the cloner involving duplicate >> DICompileUnits (see e.g. https://reviews.llvm.org/D29240), this one may >> need a similar fix. >> >> Peter >> >> On Thu, Jun 8, 2017 at 3:07 PM, Matthew O'Connor via llvm-dev < >> llvm-dev at lists.llvm.org> wrote: >> >>> 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(); >>> } >>> >>> >>> _______________________________________________ >>> LLVM Developers mailing list >>> llvm-dev at lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>> >>> >> >> >> -- >> -- >> Peter >> > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170609/9816f615/attachment.html>
Adrian Prantl via llvm-dev
2017-Jun-09 18:09 UTC
[llvm-dev] DICompileUnit duplication in LLVM 4.0.0?
I'll certainly take a look (but note that I'm at WWDC this week and may not get to this until Monday-ish). -- adrian> On Jun 9, 2017, at 10:29 AM, David Blaikie <dblaikie at gmail.com <mailto:dblaikie at gmail.com>> wrote: > > + Adrian to take a look > > On Thu, Jun 8, 2017 at 4:06 PM Matthew O'Connor via llvm-dev <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote: > Thank you. What I need to do to address this? Open an issue on bugs.llvm.org <http://bugs.llvm.org/>? I'm not sure what the fix needs to be in the cloner. > > On Thu, Jun 8, 2017 at 4:19 PM, Peter Collingbourne <peter at pcc.me.uk <mailto:peter at pcc.me.uk>> wrote: > There have in the past been bugs in the cloner involving duplicate DICompileUnits (see e.g. https://reviews.llvm.org/D29240 <https://reviews.llvm.org/D29240>), this one may need a similar fix. > > Peter > > On Thu, Jun 8, 2017 at 3:07 PM, Matthew O'Connor via llvm-dev <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote: > 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 <http://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.gi <http://carte.gi/>t/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(); > } > > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev> > > > > > -- > -- > Peter > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170609/463d3a0b/attachment-0001.html>