From 23ba61e76f71cd97bf9f5cd4e149a92397f55235 Mon Sep 17 00:00:00 2001 From: Dmitry Babokin Date: Mon, 20 May 2013 22:28:47 +0400 Subject: [PATCH] Fix for #462: broken debug infor support with LLVM 3.3+ --- module.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/module.cpp b/module.cpp index ad672672..3b25476f 100644 --- a/module.cpp +++ b/module.cpp @@ -195,6 +195,14 @@ lStripUnusedDebugInfo(llvm::Module *module) { // debugging metadata organization on the LLVM side changed, // here is a bunch of asserting to make sure that element 12 of // the compile unit's MDNode has the subprograms array.... + // + // Update: This is not an approved way of working with debug info + // metadata. It's not supposed to be deleted. But in out use-case + // it's quite useful thing, as we link in bunch of unnecessary + // stuff and remove it later on. Removing it is useful, as it + // reduces size of the binary significantly (manyfold for small + // programs). +#if defined(LLVM_3_1) || defined(LLVM_3_2) llvm::MDNode *nodeSPMD = llvm::dyn_cast(cuNode->getOperand(12)); Assert(nodeSPMD != NULL); @@ -212,6 +220,21 @@ lStripUnusedDebugInfo(llvm::Module *module) { llvm::MDNode *replNode = llvm::MDNode::get(*g->ctx, llvm::ArrayRef(usedSubprogramsArray)); cuNode->replaceOperandWith(12, replNode); +#else // LLVM 3.3+ + llvm::MDNode *nodeSPMDArray = + llvm::dyn_cast(cuNode->getOperand(9)); + Assert(nodeSPMDArray != NULL); + llvm::DIArray nodeSPs(nodeSPMDArray); + Assert(nodeSPs.getNumElements() == subprograms.getNumElements()); + for (int i = 0; i < (int)nodeSPs.getNumElements(); ++i) + Assert(nodeSPs.getElement(i) == subprograms.getElement(i)); + + // And now we can go and stuff it into the node with some + // confidence... + llvm::MDNode *replNode = + m->diBuilder->getOrCreateArray(llvm::ArrayRef(usedSubprograms)); + cuNode->replaceOperandWith(9, replNode); +#endif } }