[llvm-dev] DICompileUnit duplication in LLVM 4.0.0?

Adrian Prantl via llvm-dev llvm-dev at lists.llvm.org
Fri Jun 9 11:09:07 PDT 2017


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>


More information about the llvm-dev mailing list