Fix for debug information in trunk.

This commit is contained in:
Vsevolod Livinskiy
2015-04-10 10:02:59 +03:00
parent 391b59930b
commit ac4d0bf7ed
3 changed files with 94 additions and 29 deletions

View File

@@ -928,7 +928,15 @@ lDefineConstantInt(const char *name, int val, llvm::Module *module,
// have the DW_AT_artifical attribute. It's not clear if this // have the DW_AT_artifical attribute. It's not clear if this
// matters for anything though. // matters for anything though.
#if defined(LLVM_3_6) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5)
llvm::DIGlobalVariable var = m->diBuilder->createGlobalVariable(
name,
file,
0 /* line */,
diType,
true /* static */,
sym->storagePtr);
#elif defined(LLVM_3_6)
llvm::Constant *sym_const_storagePtr = llvm::dyn_cast<llvm::Constant>(sym->storagePtr); llvm::Constant *sym_const_storagePtr = llvm::dyn_cast<llvm::Constant>(sym->storagePtr);
Assert(sym_const_storagePtr); Assert(sym_const_storagePtr);
llvm::DIGlobalVariable var = m->diBuilder->createGlobalVariable( llvm::DIGlobalVariable var = m->diBuilder->createGlobalVariable(
@@ -940,15 +948,7 @@ lDefineConstantInt(const char *name, int val, llvm::Module *module,
diType, diType,
true /* static */, true /* static */,
sym_const_storagePtr); sym_const_storagePtr);
#elif defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) #else // LLVM 3.7+
llvm::DIGlobalVariable var = m->diBuilder->createGlobalVariable(
name,
file,
0 /* line */,
diType,
true /* static */,
sym->storagePtr);
#else
llvm::Constant *sym_const_storagePtr = llvm::dyn_cast<llvm::Constant>(sym->storagePtr); llvm::Constant *sym_const_storagePtr = llvm::dyn_cast<llvm::Constant>(sym->storagePtr);
Assert(sym_const_storagePtr); Assert(sym_const_storagePtr);
m->diBuilder->createGlobalVariable( m->diBuilder->createGlobalVariable(

28
ctx.cpp
View File

@@ -341,7 +341,7 @@ FunctionEmitContext::FunctionEmitContext(Function *func, Symbol *funSym,
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
AssertPos(currentPos, diFile.Verify()); AssertPos(currentPos, diFile.Verify());
#else // LLVM 3.7 #else // LLVM 3.7+
//comming soon //comming soon
#endif #endif
@@ -352,7 +352,7 @@ FunctionEmitContext::FunctionEmitContext(Function *func, Symbol *funSym,
#endif #endif
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
AssertPos(currentPos, scope.Verify()); AssertPos(currentPos, scope.Verify());
#else // LLVM 3.7 #else // LLVM 3.7+
//comming soon //comming soon
#endif #endif
@@ -364,17 +364,21 @@ FunctionEmitContext::FunctionEmitContext(Function *func, Symbol *funSym,
diSubprogramType = functionType->GetDIType(scope); diSubprogramType = functionType->GetDIType(scope);
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
AssertPos(currentPos, diSubprogramType.Verify()); AssertPos(currentPos, diSubprogramType.Verify());
#else // LLVM 3.7 #else // LLVM 3.7+
//comming soon //comming soon
#endif #endif
} }
#if !defined(LLVM_3_2) && !defined(LLVM_3_3) #if defined(LLVM_3_2) || defined(LLVM_3_3)
llvm::DIType diSubprogramType_n = diSubprogramType;
#elif defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
Assert(diSubprogramType.isCompositeType()); Assert(diSubprogramType.isCompositeType());
llvm::DICompositeType diSubprogramType_n = llvm::DICompositeType diSubprogramType_n =
static_cast<llvm::DICompositeType>(diSubprogramType); static_cast<llvm::DICompositeType>(diSubprogramType);
#else #else // LLVM 3.7+
llvm::DIType diSubprogramType_n = diSubprogramType; Assert(llvm::isa<llvm::MDCompositeTypeBase>(diSubprogramType));
llvm::DICompositeType diSubprogramType_n =
llvm::cast<llvm::MDCompositeTypeBase>(diSubprogramType);
#endif #endif
std::string mangledName = llvmFunction->getName(); std::string mangledName = llvmFunction->getName();
@@ -396,7 +400,7 @@ FunctionEmitContext::FunctionEmitContext(Function *func, Symbol *funSym,
isOptimized, llvmFunction); isOptimized, llvmFunction);
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
AssertPos(currentPos, diSubprogram.Verify()); AssertPos(currentPos, diSubprogram.Verify());
#else // LLVM 3.7 #else // LLVM 3.7+
//comming soon //comming soon
#endif #endif
@@ -1681,7 +1685,7 @@ FunctionEmitContext::StartScope() {
#endif // LLVM 3.2, 3.3, 3.4 and 3.6+ #endif // LLVM 3.2, 3.3, 3.4 and 3.6+
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
AssertPos(currentPos, lexicalBlock.Verify()); AssertPos(currentPos, lexicalBlock.Verify());
#else // LLVM 3.7 #else // LLVM 3.7+
//comming soon //comming soon
#endif #endif
debugScopes.push_back(lexicalBlock); debugScopes.push_back(lexicalBlock);
@@ -1714,7 +1718,7 @@ FunctionEmitContext::EmitVariableDebugInfo(Symbol *sym) {
llvm::DIType diType = sym->type->GetDIType(scope); llvm::DIType diType = sym->type->GetDIType(scope);
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
AssertPos(currentPos, diType.Verify()); AssertPos(currentPos, diType.Verify());
#else // LLVM 3.7 #else // LLVM 3.7+
//comming soon //comming soon
#endif #endif
llvm::DIVariable var = llvm::DIVariable var =
@@ -1727,7 +1731,7 @@ FunctionEmitContext::EmitVariableDebugInfo(Symbol *sym) {
true /* preserve through opts */); true /* preserve through opts */);
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
AssertPos(currentPos, var.Verify()); AssertPos(currentPos, var.Verify());
#else // LLVM 3.7 #else // LLVM 3.7+
//comming soon //comming soon
#endif #endif
#if !defined(LLVM_3_2) && !defined(LLVM_3_3) && !defined(LLVM_3_4) && !defined(LLVM_3_5)// LLVM 3.6+ #if !defined(LLVM_3_2) && !defined(LLVM_3_3) && !defined(LLVM_3_4) && !defined(LLVM_3_5)// LLVM 3.6+
@@ -1751,7 +1755,7 @@ FunctionEmitContext::EmitFunctionParameterDebugInfo(Symbol *sym, int argNum) {
llvm::DIType diType = sym->type->GetDIType(scope); llvm::DIType diType = sym->type->GetDIType(scope);
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
AssertPos(currentPos, diType.Verify()); AssertPos(currentPos, diType.Verify());
#else // LLVM 3.7 #else // LLVM 3.7+
//comming soon //comming soon
#endif #endif
int flags = 0; int flags = 0;
@@ -1768,7 +1772,7 @@ FunctionEmitContext::EmitFunctionParameterDebugInfo(Symbol *sym, int argNum) {
argNum+1); argNum+1);
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
AssertPos(currentPos, var.Verify()); AssertPos(currentPos, var.Verify());
#else // LLVM 3.7 #else // LLVM 3.7+
//comming soon //comming soon
#endif #endif
#if !defined(LLVM_3_2) && !defined(LLVM_3_3) && !defined(LLVM_3_4) && !defined(LLVM_3_5)// LLVM 3.6+ #if !defined(LLVM_3_2) && !defined(LLVM_3_3) && !defined(LLVM_3_4) && !defined(LLVM_3_5)// LLVM 3.6+

View File

@@ -189,22 +189,39 @@ lStripUnusedDebugInfo(llvm::Module *module) {
// get the instruction`s debugging metadata // get the instruction`s debugging metadata
llvm::MDNode *node = inst->getMetadata(llvm::LLVMContext::MD_dbg); llvm::MDNode *node = inst->getMetadata(llvm::LLVMContext::MD_dbg);
while (node) { while (node) {
#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) || (LLVM_3_6)
llvm::DILocation dloc(node); llvm::DILocation dloc(node);
#else // LLVM 3.7+
llvm::DILocation dloc(llvm::cast<llvm::MDLocation>(node));
#endif
// get the scope of the current instruction`s location // get the scope of the current instruction`s location
llvm::DIScope scope = dloc.getScope(); llvm::DIScope scope = dloc.getScope();
// node becomes NULL if this was the original location // node becomes NULL if this was the original location
node = dloc.getOrigLocation(); node = dloc.getOrigLocation();
// now following a chain of nested scopes // now following a chain of nested scopes
while (!0) { while (!0) {
#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) || (LLVM_3_6)
if (scope.isLexicalBlockFile()) if (scope.isLexicalBlockFile())
scope = llvm::DILexicalBlockFile(scope).getScope(); scope = llvm::DILexicalBlockFile(scope).getScope();
else if (scope.isLexicalBlock()) else if (scope.isLexicalBlock())
scope = llvm::DILexicalBlock(scope).getContext(); scope = llvm::DILexicalBlock(scope).getContext();
else if (scope.isNameSpace()) else if (scope.isNameSpace())
scope = llvm::DINameSpace(scope).getContext(); scope = llvm::DINameSpace(scope).getContext();
#else // LLVM 3.7+
if (llvm::isa<llvm::MDLexicalBlockFile>(scope))
scope = llvm::DILexicalBlockFile(llvm::cast<llvm::MDLexicalBlockFile>(scope)).getContext();
else if (llvm::isa<llvm::MDLexicalBlockBase>(scope))
scope = llvm::DILexicalBlock(llvm::cast<llvm::MDLexicalBlockBase>(scope)).getContext();
else if (llvm::isa<llvm::MDNamespace>(scope))
scope = llvm::DINameSpace(llvm::cast<llvm::MDNamespace>(scope)).getContext();
#endif
else break; else break;
} }
#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) || (LLVM_3_6)
if (scope.isSubprogram()) { if (scope.isSubprogram()) {
#else // LLVM 3.7+
if (llvm::isa<llvm::MDSubprogram>(scope)) {
#endif
// good, the chain ended with a function; adding // good, the chain ended with a function; adding
SPall.insert(scope); SPall.insert(scope);
} }
@@ -215,10 +232,18 @@ lStripUnusedDebugInfo(llvm::Module *module) {
if (llvm::NamedMDNode *cuNodes = module->getNamedMetadata("llvm.dbg.cu")) { if (llvm::NamedMDNode *cuNodes = module->getNamedMetadata("llvm.dbg.cu")) {
for (unsigned i = 0, ie = cuNodes->getNumOperands(); i != ie; ++i) { for (unsigned i = 0, ie = cuNodes->getNumOperands(); i != ie; ++i) {
llvm::MDNode *cuNode = cuNodes->getOperand(i); llvm::MDNode *cuNode = cuNodes->getOperand(i);
#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) || (LLVM_3_6)
llvm::DICompileUnit cu(cuNode); llvm::DICompileUnit cu(cuNode);
#else // LLVM 3.7+
llvm::DICompileUnit cu(llvm::cast<llvm::MDCompileUnit>(cuNode));
#endif
llvm::DIArray subprograms = cu.getSubprograms(); llvm::DIArray subprograms = cu.getSubprograms();
#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) || (LLVM_3_6)
if (subprograms.getNumElements() == 0) if (subprograms.getNumElements() == 0)
#else // LLVM 3.7+
if (subprograms.size() == 0)
#endif
continue; continue;
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5)
@@ -230,11 +255,17 @@ lStripUnusedDebugInfo(llvm::Module *module) {
#endif #endif
// determine what functions of those extracted belong to the unit // determine what functions of those extracted belong to the unit
#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) || (LLVM_3_6)
for (unsigned j = 0, je = subprograms.getNumElements(); j != je; ++j) for (unsigned j = 0, je = subprograms.getNumElements(); j != je; ++j)
#else // LLVM 3.7+
for (unsigned j = 0, je = subprograms.size(); j != je; ++j)
#endif
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5)
SPset.insert(subprograms->getOperand(j)); SPset.insert(subprograms->getOperand(j));
#else // LLVM 3.6+ #elif defined(LLVM_3_6)
SPset.insert(subprograms.getElement(j)); SPset.insert(subprograms.getElement(j));
#else // LLVM 3.7+
SPset.insert(subprograms [j]);
#endif #endif
std::set_intersection(SPall.begin(), SPall.end(), std::set_intersection(SPall.begin(), SPall.end(),
@@ -243,7 +274,11 @@ lStripUnusedDebugInfo(llvm::Module *module) {
Debug(SourcePos(), "%d / %d functions left in module with debug " Debug(SourcePos(), "%d / %d functions left in module with debug "
"info.", (int)usedSubprograms.size(), "info.", (int)usedSubprograms.size(),
#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) || (LLVM_3_6)
(int)subprograms.getNumElements()); (int)subprograms.getNumElements());
#else // LLVM 3.7+
(int)subprograms.size());
#endif
// We'd now like to replace the array of subprograms in the // We'd now like to replace the array of subprograms in the
// compile unit with only the ones that actually have function // compile unit with only the ones that actually have function
@@ -298,15 +333,25 @@ lStripUnusedDebugInfo(llvm::Module *module) {
cuNode->replaceOperandWith(9, replNode); cuNode->replaceOperandWith(9, replNode);
#else // LLVM 3.6+ #else // LLVM 3.6+
llvm::DIArray nodeSPs = cu.getSubprograms(); llvm::DIArray nodeSPs = cu.getSubprograms();
#if defined(LLVM_3_6)
Assert(nodeSPs.getNumElements() == subprograms.getNumElements()); Assert(nodeSPs.getNumElements() == subprograms.getNumElements());
for (int i = 0; i < (int)nodeSPs.getNumElements(); ++i) for (int i = 0; i < (int)nodeSPs.getNumElements(); ++i)
Assert(nodeSPs.getElement(i) == subprograms.getElement(i)); Assert(nodeSPs.getElement(i) == subprograms.getElement(i));
#else // LLVM 3.7+
Assert(nodeSPs.size() == subprograms.size());
for (int i = 0; i < (int)nodeSPs.size(); ++i)
Assert(nodeSPs [i] == subprograms [i]);
#endif
// And now we can go and stuff it into the unit with some // And now we can go and stuff it into the unit with some
// confidence... // confidence...
llvm::MDNode *replNode = llvm::MDNode::get(module->getContext(), llvm::MDNode *replNode = llvm::MDNode::get(module->getContext(),
llvm::ArrayRef<llvm::Metadata *>(usedSubprograms)); llvm::ArrayRef<llvm::Metadata *>(usedSubprograms));
#if defined(LLVM_3_6)
cu.replaceSubprograms(llvm::DIArray(replNode)); cu.replaceSubprograms(llvm::DIArray(replNode));
#else // LLVM 3.7+
cu.replaceSubprograms(llvm::DIArray(llvm::cast<llvm::MDTuple>(replNode)));
#endif
#endif #endif
} }
} }
@@ -655,7 +700,15 @@ Module::AddGlobalVariable(const std::string &name, const Type *type, Expr *initE
if (diBuilder) { if (diBuilder) {
llvm::DIFile file = pos.GetDIFile(); llvm::DIFile file = pos.GetDIFile();
#if !defined(LLVM_3_2) && !defined(LLVM_3_3) && !defined(LLVM_3_4) && !defined(LLVM_3_5)// LLVM 3.6+ #if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5)
llvm::DIGlobalVariable var = diBuilder->createGlobalVariable(
name,
file,
pos.first_line,
sym->type->GetDIType(file),
(sym->storageClass == SC_STATIC),
sym->storagePtr);
#elif defined(LLVM_3_6)
llvm::Constant *sym_const_storagePtr = llvm::dyn_cast<llvm::Constant>(sym->storagePtr); llvm::Constant *sym_const_storagePtr = llvm::dyn_cast<llvm::Constant>(sym->storagePtr);
Assert(sym_const_storagePtr); Assert(sym_const_storagePtr);
llvm::DIGlobalVariable var = diBuilder->createGlobalVariable( llvm::DIGlobalVariable var = diBuilder->createGlobalVariable(
@@ -667,16 +720,24 @@ Module::AddGlobalVariable(const std::string &name, const Type *type, Expr *initE
sym->type->GetDIType(file), sym->type->GetDIType(file),
(sym->storageClass == SC_STATIC), (sym->storageClass == SC_STATIC),
sym_const_storagePtr); sym_const_storagePtr);
#else #else // LLVM 3.7+
llvm::DIGlobalVariable var = diBuilder->createGlobalVariable( llvm::Constant *sym_const_storagePtr = llvm::dyn_cast<llvm::Constant>(sym->storagePtr);
Assert(sym_const_storagePtr);
diBuilder->createGlobalVariable(
file,
name,
name, name,
file, file,
pos.first_line, pos.first_line,
sym->type->GetDIType(file), sym->type->GetDIType(file),
(sym->storageClass == SC_STATIC), (sym->storageClass == SC_STATIC),
sym->storagePtr); sym_const_storagePtr);
#endif #endif
#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6)
Assert(var.Verify()); Assert(var.Verify());
#else // LLVM 3.7+
//comming soon
#endif
} }
} }