diff --git a/builtins.cpp b/builtins.cpp index 97b07fa9..972bedc5 100644 --- a/builtins.cpp +++ b/builtins.cpp @@ -919,12 +919,24 @@ lDefineConstantInt(const char *name, int val, llvm::Module *module, if (m->diBuilder != NULL) { llvm::DIFile file; llvm::DIType diType = sym->type->GetDIType(file); +#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) Assert(diType.Verify()); +#else // LLVM 3.7+ + //comming soon +#endif // FIXME? DWARF says that this (and programIndex below) should // have the DW_AT_artifical attribute. It's not clear if this // matters for anything though. -#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 = 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(sym->storagePtr); Assert(sym_const_storagePtr); llvm::DIGlobalVariable var = m->diBuilder->createGlobalVariable( @@ -936,16 +948,24 @@ lDefineConstantInt(const char *name, int val, llvm::Module *module, diType, true /* static */, sym_const_storagePtr); -#else - llvm::DIGlobalVariable var = m->diBuilder->createGlobalVariable( - name, - file, - 0 /* line */, - diType, - true /* static */, - sym->storagePtr); +#else // LLVM 3.7+ + llvm::Constant *sym_const_storagePtr = llvm::dyn_cast(sym->storagePtr); + Assert(sym_const_storagePtr); + m->diBuilder->createGlobalVariable( + file, + name, + name, + file, + 0 /* line */, + diType, + true /* static */, + sym_const_storagePtr); #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()); +#else // LLVM 3.7+ + //comming soon +#endif } } @@ -997,8 +1017,12 @@ lDefineProgramIndex(llvm::Module *module, SymbolTable *symbolTable) { if (m->diBuilder != NULL) { llvm::DIFile file; llvm::DIType diType = sym->type->GetDIType(file); +#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) Assert(diType.Verify()); -#if !defined(LLVM_3_2) && !defined(LLVM_3_3) && !defined(LLVM_3_4) && !defined(LLVM_3_5)// LLVM 3.6+ +#else // LLVM 3.7+ + //comming soon +#endif +#if defined(LLVM_3_6)// LLVM 3.6+ llvm::Constant *sym_const_storagePtr = llvm::dyn_cast(sym->storagePtr); Assert(sym_const_storagePtr); llvm::DIGlobalVariable var = m->diBuilder->createGlobalVariable( @@ -1010,7 +1034,7 @@ lDefineProgramIndex(llvm::Module *module, SymbolTable *symbolTable) { diType, false /* static */, sym_const_storagePtr); -#else +#elif defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) llvm::DIGlobalVariable var = m->diBuilder->createGlobalVariable( sym->name.c_str(), file, @@ -1018,8 +1042,24 @@ lDefineProgramIndex(llvm::Module *module, SymbolTable *symbolTable) { diType, false /* static */, sym->storagePtr); +#else + llvm::Constant *sym_const_storagePtr = llvm::dyn_cast(sym->storagePtr); + Assert(sym_const_storagePtr); + m->diBuilder->createGlobalVariable( + file, + sym->name.c_str(), + sym->name.c_str(), + file, + 0 /* line */, + diType, + false /* static */, + sym_const_storagePtr); #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()); +#else // LLVM 3.7+ + //comming soon +#endif } } diff --git a/ctx.cpp b/ctx.cpp index bb7be50e..f73f6cf1 100644 --- a/ctx.cpp +++ b/ctx.cpp @@ -338,14 +338,23 @@ FunctionEmitContext::FunctionEmitContext(Function *func, Symbol *funSym, /* If debugging is enabled, tell the debug information emission code about this new function */ diFile = funcStartPos.GetDIFile(); + +#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()); +#else // LLVM 3.7+ + //comming soon +#endif #if defined(LLVM_3_2) || defined(LLVM_3_3) llvm::DIScope scope = llvm::DIScope(m->diBuilder->getCU()); #else // LLVM_3_4+ llvm::DIScope scope = llvm::DIScope(m->diCompileUnit); #endif +#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()); +#else // LLVM 3.7+ + //comming soon +#endif const FunctionType *functionType = function->GetType(); llvm::DIType diSubprogramType; @@ -353,15 +362,23 @@ FunctionEmitContext::FunctionEmitContext(Function *func, Symbol *funSym, AssertPos(currentPos, m->errorCount > 0); else { 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) AssertPos(currentPos, diSubprogramType.Verify()); +#else // LLVM 3.7+ + //comming soon +#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()); llvm::DICompositeType diSubprogramType_n = static_cast(diSubprogramType); -#else - llvm::DIType diSubprogramType_n = diSubprogramType; +#else // LLVM 3.7+ + Assert(llvm::isa(diSubprogramType)); + llvm::DICompositeType diSubprogramType_n = + llvm::cast(diSubprogramType); #endif std::string mangledName = llvmFunction->getName(); @@ -381,7 +398,11 @@ FunctionEmitContext::FunctionEmitContext(Function *func, Symbol *funSym, firstLine, flags, isOptimized, llvmFunction); +#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()); +#else // LLVM 3.7+ + //comming soon +#endif /* And start a scope representing the initial function scope */ StartScope(); @@ -1662,7 +1683,11 @@ FunctionEmitContext::StartScope() { // as the last argument currentPos.first_column); #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) AssertPos(currentPos, lexicalBlock.Verify()); +#else // LLVM 3.7+ + //comming soon +#endif debugScopes.push_back(lexicalBlock); } } @@ -1691,7 +1716,11 @@ FunctionEmitContext::EmitVariableDebugInfo(Symbol *sym) { llvm::DIScope scope = GetDIScope(); 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) AssertPos(currentPos, diType.Verify()); +#else // LLVM 3.7+ + //comming soon +#endif llvm::DIVariable var = m->diBuilder->createLocalVariable(llvm::dwarf::DW_TAG_auto_variable, scope, @@ -1700,7 +1729,11 @@ FunctionEmitContext::EmitVariableDebugInfo(Symbol *sym) { sym->pos.first_line, diType, 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) AssertPos(currentPos, var.Verify()); +#else // LLVM 3.7+ + //comming soon +#endif #if !defined(LLVM_3_2) && !defined(LLVM_3_3) && !defined(LLVM_3_4) && !defined(LLVM_3_5)// LLVM 3.6+ llvm::DIExpression E = m->diBuilder->createExpression(); llvm::Instruction *declareInst = @@ -1720,7 +1753,11 @@ FunctionEmitContext::EmitFunctionParameterDebugInfo(Symbol *sym, int argNum) { llvm::DIScope scope = diSubprogram; 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) AssertPos(currentPos, diType.Verify()); +#else // LLVM 3.7+ + //comming soon +#endif int flags = 0; llvm::DIVariable var = @@ -1733,7 +1770,11 @@ FunctionEmitContext::EmitFunctionParameterDebugInfo(Symbol *sym, int argNum) { true /* preserve through opts */, flags, argNum+1); +#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()); +#else // LLVM 3.7+ + //comming soon +#endif #if !defined(LLVM_3_2) && !defined(LLVM_3_3) && !defined(LLVM_3_4) && !defined(LLVM_3_5)// LLVM 3.6+ llvm::DIExpression E = m->diBuilder->createExpression(); llvm::Instruction *declareInst = diff --git a/ispc.cpp b/ispc.cpp index 393f639d..6fe3579e 100644 --- a/ispc.cpp +++ b/ispc.cpp @@ -1352,7 +1352,11 @@ SourcePos::GetDIFile() const { std::string directory, filename; GetDirectoryAndFileName(g->currentDirectory, name, &directory, &filename); llvm::DIFile ret = m->diBuilder->createFile(filename, directory); +#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) || defined(LLVM_3_6) Assert(ret.Verify()); +#else // LLVM 3.7+ + //comming soon +#endif return ret; } diff --git a/module.cpp b/module.cpp index 177605f3..41e2480a 100644 --- a/module.cpp +++ b/module.cpp @@ -189,22 +189,39 @@ lStripUnusedDebugInfo(llvm::Module *module) { // get the instruction`s debugging metadata llvm::MDNode *node = inst->getMetadata(llvm::LLVMContext::MD_dbg); 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); +#else // LLVM 3.7+ + llvm::DILocation dloc(llvm::cast(node)); +#endif // get the scope of the current instruction`s location llvm::DIScope scope = dloc.getScope(); // node becomes NULL if this was the original location node = dloc.getOrigLocation(); // now following a chain of nested scopes 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()) scope = llvm::DILexicalBlockFile(scope).getScope(); else if (scope.isLexicalBlock()) scope = llvm::DILexicalBlock(scope).getContext(); else if (scope.isNameSpace()) scope = llvm::DINameSpace(scope).getContext(); +#else // LLVM 3.7+ + if (llvm::isa(scope)) + scope = llvm::DILexicalBlockFile(llvm::cast(scope)).getContext(); + else if (llvm::isa(scope)) + scope = llvm::DILexicalBlock(llvm::cast(scope)).getContext(); + else if (llvm::isa(scope)) + scope = llvm::DINameSpace(llvm::cast(scope)).getContext(); +#endif 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()) { +#else // LLVM 3.7+ + if (llvm::isa(scope)) { +#endif // good, the chain ended with a function; adding SPall.insert(scope); } @@ -215,10 +232,18 @@ lStripUnusedDebugInfo(llvm::Module *module) { if (llvm::NamedMDNode *cuNodes = module->getNamedMetadata("llvm.dbg.cu")) { for (unsigned i = 0, ie = cuNodes->getNumOperands(); i != ie; ++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); +#else // LLVM 3.7+ + llvm::DICompileUnit cu(llvm::cast(cuNode)); +#endif 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) +#else // LLVM 3.7+ + if (subprograms.size() == 0) +#endif continue; #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 // 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) +#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) SPset.insert(subprograms->getOperand(j)); -#else // LLVM 3.6+ +#elif defined(LLVM_3_6) SPset.insert(subprograms.getElement(j)); +#else // LLVM 3.7+ + SPset.insert(subprograms [j]); #endif 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 " "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()); +#else // LLVM 3.7+ + (int)subprograms.size()); +#endif // We'd now like to replace the array of subprograms in the // compile unit with only the ones that actually have function @@ -298,15 +333,25 @@ lStripUnusedDebugInfo(llvm::Module *module) { cuNode->replaceOperandWith(9, replNode); #else // LLVM 3.6+ llvm::DIArray nodeSPs = cu.getSubprograms(); +#if defined(LLVM_3_6) Assert(nodeSPs.getNumElements() == subprograms.getNumElements()); 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 // confidence... llvm::MDNode *replNode = llvm::MDNode::get(module->getContext(), llvm::ArrayRef(usedSubprograms)); +#if defined(LLVM_3_6) cu.replaceSubprograms(llvm::DIArray(replNode)); +#else // LLVM 3.7+ + cu.replaceSubprograms(llvm::DIArray(llvm::cast(replNode))); + +#endif #endif } } @@ -655,7 +700,15 @@ Module::AddGlobalVariable(const std::string &name, const Type *type, Expr *initE if (diBuilder) { 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(sym->storagePtr); Assert(sym_const_storagePtr); 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->storageClass == SC_STATIC), sym_const_storagePtr); -#else - llvm::DIGlobalVariable var = diBuilder->createGlobalVariable( +#else // LLVM 3.7+ + llvm::Constant *sym_const_storagePtr = llvm::dyn_cast(sym->storagePtr); + Assert(sym_const_storagePtr); + diBuilder->createGlobalVariable( + file, + name, name, file, pos.first_line, sym->type->GetDIType(file), (sym->storageClass == SC_STATIC), - sym->storagePtr); + sym_const_storagePtr); #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()); +#else // LLVM 3.7+ + //comming soon +#endif } }