[llvm-dev] DICompileUnit duplication in LLVM 4.0.0?
David Blaikie via llvm-dev
llvm-dev at lists.llvm.org
Fri Jun 9 10:29:41 PDT 2017
+ 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>
More information about the llvm-dev
mailing list