From 24e8c335060491291d8ddb60724e5724319f349a Mon Sep 17 00:00:00 2001 From: Vsevolod Livinskiy Date: Thu, 11 Dec 2014 16:24:52 +0300 Subject: [PATCH] Fix for trunk after rev 223802 --- cbackend.cpp | 40 +++++++++++++++++++++++++++++++++++++++- ctx.cpp | 21 ++++++++++++++++++++- module.cpp | 13 ++++++++++++- opt.cpp | 19 +++++++++++++++++++ type.cpp | 43 ++++++++++++++++++++++++++++++++++--------- 5 files changed, 124 insertions(+), 12 deletions(-) diff --git a/cbackend.cpp b/cbackend.cpp index b6d5bd49..e6a22693 100644 --- a/cbackend.cpp +++ b/cbackend.cpp @@ -137,9 +137,17 @@ namespace { TypeFinder(std::vector &t) : ArrayTypes(t) {} +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) void run(const llvm::Module &M) { +#else // LLVN 3.6++ + void run(llvm::Module &M) { +#endif // Get types from global variables. +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) for (llvm::Module::const_global_iterator I = M.global_begin(), +#else // LLVN 3.6++ + for (llvm::Module::global_iterator I = M.global_begin(), +#endif E = M.global_end(); I != E; ++I) { incorporateType(I->getType()); if (I->hasInitializer()) @@ -147,10 +155,18 @@ namespace { } // Get types from aliases. +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) for (llvm::Module::const_alias_iterator I = M.alias_begin(), +#else // LLVN 3.6++ + for (llvm::Module::alias_iterator I = M.alias_begin(), +#endif E = M.alias_end(); I != E; ++I) { incorporateType(I->getType()); +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) if (const llvm::Value *Aliasee = I->getAliasee()) +#else // LLVN 3.6++ + if (llvm::Value *Aliasee = I->getAliasee()) +#endif incorporateValue(Aliasee); } @@ -220,8 +236,13 @@ namespace { /// types hiding in constant expressions and other operands that won't be /// walked in other ways. GlobalValues, basic blocks, instructions, and /// inst operands are all explicitly enumerated. +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) void incorporateValue(const llvm::Value *V) { if (const llvm::MDNode *M = llvm::dyn_cast(V)) +#else // LLVN 3.6++ + void incorporateValue(llvm::Value *V) { + if (const llvm::MDNode *M = llvm::cast(llvm::ValueAsMetadata::get(V))) +#endif return incorporateMDNode(M); if (!llvm::isa(V) || llvm::isa(V)) return; @@ -242,18 +263,31 @@ namespace { void incorporateMDNode(const llvm::MDNode *V) { // Already visited? +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) if (!VisitedConstants.insert(V).second) +#else // LLVN 3.6++ + if (!VisitedConstants.insert(llvm::cast(V)->getValue()).second) +#endif return; // Look in operands for types. for (unsigned i = 0, e = V->getNumOperands(); i != e; ++i) - if (llvm::Value *Op = V->getOperand(i)) + if (llvm::Value *Op = +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) + V->getOperand(i)) +#else // LLVN 3.6++ + llvm::cast((V->getOperand(i)).get())->getValue()) +#endif incorporateValue(Op); } }; } // end anonymous namespace +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) static void findUsedArrayTypes(const llvm::Module *m, std::vector &t) { +#else // LLVN 3.6++ +static void findUsedArrayTypes(llvm::Module *m, std::vector &t) { +#endif TypeFinder(t).run(*m); } @@ -276,7 +310,11 @@ namespace { llvm::IntrinsicLowering *IL; //llvm::Mangler *Mang; llvm::LoopInfo *LI; +#if defined(LLVM_3_2) || defined(LLVM_3_3) || defined(LLVM_3_4) || defined(LLVM_3_5) const llvm::Module *TheModule; +#else // LLVM 3.6++ + llvm::Module *TheModule; +#endif const llvm::MCAsmInfo* TAsm; const llvm::MCRegisterInfo *MRI; const llvm::MCObjectFileInfo *MOFI; diff --git a/ctx.cpp b/ctx.cpp index f09002c1..55aef7a9 100644 --- a/ctx.cpp +++ b/ctx.cpp @@ -2805,24 +2805,43 @@ FunctionEmitContext::addGSMetadata(llvm::Value *v, SourcePos pos) { llvm::Instruction *inst = llvm::dyn_cast(v); if (inst == NULL) return; - +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) llvm::Value *str = llvm::MDString::get(*g->ctx, pos.name); +#else // LLVN 3.6++ + llvm::MDString *str = llvm::MDString::get(*g->ctx, pos.name); +#endif llvm::MDNode *md = llvm::MDNode::get(*g->ctx, str); inst->setMetadata("filename", md); +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) llvm::Value *first_line = LLVMInt32(pos.first_line); +#else // LLVN 3.6++ + llvm::Metadata *first_line = llvm::ConstantAsMetadata::get(LLVMInt32(pos.first_line)); +#endif md = llvm::MDNode::get(*g->ctx, first_line); inst->setMetadata("first_line", md); +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) llvm::Value *first_column = LLVMInt32(pos.first_column); +#else // LLVN 3.6++ + llvm::Metadata *first_column = llvm::ConstantAsMetadata::get(LLVMInt32(pos.first_column)); +#endif md = llvm::MDNode::get(*g->ctx, first_column); inst->setMetadata("first_column", md); +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) llvm::Value *last_line = LLVMInt32(pos.last_line); +#else // LLVN 3.6++ + llvm::Metadata *last_line = llvm::ConstantAsMetadata::get(LLVMInt32(pos.last_line)); +#endif md = llvm::MDNode::get(*g->ctx, last_line); inst->setMetadata("last_line", md); +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) llvm::Value *last_column = LLVMInt32(pos.last_column); +#else // LLVN 3.6++ + llvm::Metadata *last_column = llvm::ConstantAsMetadata::get(LLVMInt32(pos.last_column)); +#endif md = llvm::MDNode::get(*g->ctx, last_column); inst->setMetadata("last_column", md); } diff --git a/module.cpp b/module.cpp index 7ae33da0..059375f5 100644 --- a/module.cpp +++ b/module.cpp @@ -200,7 +200,11 @@ lStripUnusedDebugInfo(llvm::Module *module) { } if (scope.isSubprogram()) { // good, the chain ended with a function; adding +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) SPall.insert(scope); +#else // LLVN 3.6++ + SPall.insert(llvm::cast(scope.get())->getValue()); +#endif } } } @@ -224,7 +228,11 @@ lStripUnusedDebugInfo(llvm::Module *module) { // determine what functions of those extracted belong to the unit for (unsigned j = 0, je = subprograms.getNumElements(); j != je; ++j) +#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+ + SPset.insert(llvm::cast((subprograms->getOperand(j)).get())->getValue()); +#endif std::set_intersection(SPall.begin(), SPall.end(), SPset.begin(), SPset.end(), @@ -293,7 +301,10 @@ lStripUnusedDebugInfo(llvm::Module *module) { // And now we can go and stuff it into the unit with some // confidence... - llvm::MDNode *replNode = llvm::MDNode::get(module->getContext(), usedSubprograms); + std::vector usedSubprograms_tmp; + for (int i = 0; i < usedSubprograms.size(); ++i) + usedSubprograms_tmp.at(i) = llvm::ValueAsMetadata::get(usedSubprograms.at(i)); + llvm::MDNode *replNode = llvm::MDNode::get(module->getContext(), usedSubprograms_tmp); cu.replaceSubprograms(llvm::DIArray(replNode)); #endif } diff --git a/opt.cpp b/opt.cpp index 1c41d3c3..3d6cfc1a 100644 --- a/opt.cpp +++ b/opt.cpp @@ -230,16 +230,35 @@ lGetSourcePosFromMetadata(const llvm::Instruction *inst, SourcePos *pos) { llvm::MDString *str = llvm::dyn_cast(filename->getOperand(0)); Assert(str); llvm::ConstantInt *first_lnum = +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) llvm::dyn_cast(first_line->getOperand(0)); +#else // LLVN 3.6++ + llvm::mdconst::extract(first_line->getOperand(0)); +#endif Assert(first_lnum); + llvm::ConstantInt *first_colnum = +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) llvm::dyn_cast(first_column->getOperand(0)); +#else // LLVN 3.6++ + llvm::mdconst::extract(first_column->getOperand(0)); +#endif Assert(first_column); + llvm::ConstantInt *last_lnum = +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) llvm::dyn_cast(last_line->getOperand(0)); +#else // LLVN 3.6++ + llvm::mdconst::extract(last_line->getOperand(0)); +#endif Assert(last_lnum); + llvm::ConstantInt *last_colnum = +#if defined (LLVM_3_2) || defined (LLVM_3_3)|| defined (LLVM_3_4)|| defined (LLVM_3_5) llvm::dyn_cast(last_column->getOperand(0)); +#else // LLVN 3.6++ + llvm::mdconst::extract(last_column->getOperand(0)); +#endif Assert(last_column); *pos = SourcePos(str->getString().data(), (int)first_lnum->getZExtValue(), diff --git a/type.cpp b/type.cpp index 822f7402..d142d92c 100644 --- a/type.cpp +++ b/type.cpp @@ -91,13 +91,19 @@ lCreateDIArray(llvm::DIType eltType, int count) { } llvm::Value *sub = m->diBuilder->getOrCreateSubrange(lowerBound, upperBound); -#else // LLVM 3.3+ +#elif defined (LLVM_3_3)|| defined (LLVM_3_4) || defined (LLVM_3_5) llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, count); #endif + +#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5) std::vector subs; +#else // LLVM 3.6++ + llvm::Metadata *sub = m->diBuilder->getOrCreateSubrange(0, count); + std::vector subs; +#endif subs.push_back(sub); llvm::DIArray subArray = m->diBuilder->getOrCreateArray(subs); - + uint64_t size = eltType.getSizeInBits() * count; uint64_t align = eltType.getAlignInBits(); @@ -571,8 +577,10 @@ AtomicType::GetDIType(llvm::DIDescriptor scope) const { llvm::DIType unifType = GetAsUniformType()->GetDIType(scope); #ifdef LLVM_3_2 llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth()-1); -#else // LLVM 3.3+ +#elif defined (LLVM_3_3)|| defined (LLVM_3_4) || defined (LLVM_3_5) llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth()); +#else // LLVM 3.6++ + llvm::Metadata *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth()); #endif llvm::DIArray subArray = m->diBuilder->getOrCreateArray(sub); uint64_t size = unifType.getSizeInBits() * g->target->getVectorWidth(); @@ -810,14 +818,21 @@ EnumType::LLVMType(llvm::LLVMContext *ctx) const { llvm::DIType EnumType::GetDIType(llvm::DIDescriptor scope) const { +#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5) std::vector enumeratorDescriptors; +#else // LLVM 3.6++ + std::vector enumeratorDescriptors; +#endif for (unsigned int i = 0; i < enumerators.size(); ++i) { unsigned int enumeratorValue; Assert(enumerators[i]->constValue != NULL); int count = enumerators[i]->constValue->GetValues(&enumeratorValue); Assert(count == 1); - +#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5) llvm::Value *descriptor = +#else // LLVM 3.6++ + llvm::Metadata *descriptor = +#endif m->diBuilder->createEnumerator(enumerators[i]->name, enumeratorValue); enumeratorDescriptors.push_back(descriptor); } @@ -840,8 +855,10 @@ EnumType::GetDIType(llvm::DIDescriptor scope) const { case Variability::Varying: { #ifdef LLVM_3_2 llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth()-1); -#else // LLVM 3.3+ +#elif defined (LLVM_3_3)|| defined (LLVM_3_4) || defined (LLVM_3_5) llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth()); +#else // LLVM 3.6++ + llvm::Metadata *sub = m->diBuilder->getOrCreateSubrange(0, g->target->getVectorWidth()); #endif llvm::DIArray subArray = m->diBuilder->getOrCreateArray(sub); uint64_t size = diType.getSizeInBits() * g->target->getVectorWidth(); @@ -1733,8 +1750,10 @@ VectorType::GetDIType(llvm::DIDescriptor scope) const { llvm::DIType eltType = base->GetDIType(scope); #ifdef LLVM_3_2 llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, numElements-1); -#else // LLVM 3.3+ +#elif defined (LLVM_3_3)|| defined (LLVM_3_4) || defined (LLVM_3_5) llvm::Value *sub = m->diBuilder->getOrCreateSubrange(0, numElements); +#else // LLVM 3.6++ + llvm::Metadata *sub = m->diBuilder->getOrCreateSubrange(0, numElements); #endif llvm::DIArray subArray = m->diBuilder->getOrCreateArray(sub); @@ -2156,8 +2175,11 @@ StructType::LLVMType(llvm::LLVMContext *ctx) const { llvm::DIType StructType::GetDIType(llvm::DIDescriptor scope) const { uint64_t currentSize = 0, align = 0; - +#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5) std::vector elementLLVMTypes; +#else // LLVM 3.6++ + std::vector elementLLVMTypes; +#endif // Walk through the elements of the struct; for each one figure out its // alignment and size, using that to figure out its offset w.r.t. the // start of the structure. @@ -2975,8 +2997,11 @@ FunctionType::LLVMType(llvm::LLVMContext *ctx) const { llvm::DIType FunctionType::GetDIType(llvm::DIDescriptor scope) const { +#if defined (LLVM_3_2) || defined (LLVM_3_3) || defined (LLVM_3_4) || defined (LLVM_3_5) std::vector retArgTypes; - +#else // LLVM 3.6++ + std::vector retArgTypes; +#endif retArgTypes.push_back(returnType->GetDIType(scope)); for (int i = 0; i < GetNumParameters(); ++i) { const Type *t = GetParameterType(i); @@ -2992,7 +3017,7 @@ FunctionType::GetDIType(llvm::DIDescriptor scope) const { #if !defined(LLVM_3_2) && !defined(LLVM_3_3) && !defined(LLVM_3_4) && !defined(LLVM_3_5) // LLVM 3.6+ llvm::DITypeArray retArgTypesArray = - m->diBuilder->getOrCreateTypeArray(llvm::ArrayRef(retArgTypes)); + m->diBuilder->getOrCreateTypeArray(retArgTypes); #else llvm::DIArray retArgTypesArray = m->diBuilder->getOrCreateArray(llvm::ArrayRef(retArgTypes));