2014-12-30 2 views
2

Я пытаюсь построить Kint. Я получаю сообщение об ошибке, которое я не мог понять. Это исходный файл:Ошибка компоновщика с llvm

#pragma once 

#include <llvm/Support/Debug.h> 
#include <llvm/Support/ConstantRange.h> 

// llvm::ConstantRange fixup. 
class CRange : public llvm::ConstantRange { 
    typedef llvm::APInt APInt; 
    typedef llvm::ConstantRange super; 
public: 
    CRange(uint32_t BitWidth, bool isFullSet) : super(BitWidth, isFullSet) {} 
    // Constructors. 
    CRange(const super &CR) : super(CR) {} 
    CRange(const APInt &Value) 
     : super(Value) {} 
    CRange(const APInt &Lower, const APInt &Upper) 
     : super(Lower, Upper) {} 
    static CRange makeFullSet(uint32_t BitWidth) { 
     return CRange(BitWidth, true); 
    } 
    static CRange makeEmptySet(uint32_t BitWidth) { 
     return CRange(BitWidth, false); 
    } 
    static CRange makeICmpRegion(unsigned Pred, const CRange &other) { 
     return super::makeICmpRegion(Pred, other); 
    } 

    void match(const CRange &R) { 
     if (this->getBitWidth() != R.getBitWidth()) { 
      llvm::dbgs() << "warning: range " << *this << " " 
       << this->getBitWidth() << " and " << R << " " 
       << R.getBitWidth() << " unmatch\n"; 
      *this = this->zextOrTrunc(R.getBitWidth()); 
     } 
    } 

    bool safeUnion(const CRange &R) { 
     CRange V = R, Old = *this; 
     V.match(*this); 
     *this = this->unionWith(V); 
     return Old != *this; 
    } 


    CRange sdiv(const CRange &RHS) const { 
     if (isEmptySet() || RHS.isEmptySet()) 
      return makeEmptySet(getBitWidth()); 
     // FIXME: too conservative. 
     return makeFullSet(getBitWidth()); 
    } 

}; 

Это сообщение об ошибке:

/home/riyad/src/kint-updated/kint/build/src/../../src/CRange.h:32: undefined reference to `llvm::ConstantRange::ConstantRange(llvm::APInt const&)' 
/home/riyad/src/kint-updated/kint/build/src/../../src/CRange.h:32: undefined reference to `llvm::ConstantRange::ConstantRange(llvm::APInt const&)' 
/home/riyad/src/kint-updated/kint/build/src/../../src/CRange.h:32: undefined reference to `llvm::ConstantRange::ConstantRange(llvm::APInt const&)' 
/home/riyad/src/kint-updated/kint/build/src/../../src/CRange.h:32: undefined reference to `llvm::ConstantRange::ConstantRange(llvm::APInt const&)' 
/home/riyad/src/kint-updated/kint/build/src/../../src/CRange.h:32: undefined reference to `llvm::ConstantRange::ConstantRange(llvm::APInt const&)' 

Но llvm::ConstantRange::ConstantRange(llvm::APInt const&) уже определен в LLVM. Это исходный код для ConstantRange.h в llvm.

#if LLVM_HAS_RVALUE_REFERENCES 
    // If we have move semantics, pass APInts by value and move them into place. 
    typedef APInt APIntMoveTy; 
#else 
    // Otherwise pass by const ref to save one copy. 
    typedef const APInt &APIntMoveTy; 
#endif 

public: 
    /// Initialize a full (the default) or empty set for the specified bit width. 
    /// 
    explicit ConstantRange(uint32_t BitWidth, bool isFullSet = true); 

    /// Initialize a range to hold the single specified value. 
    /// 
    ConstantRange(APIntMoveTy Value); 

    /// @brief Initialize a range of values explicitly. This will assert out if 
    /// Lower==Upper and Lower != Min or Max value for its type. It will also 
    /// assert out if the two APInt's are not the same bit width. 
    ConstantRange(APIntMoveTy Lower, APIntMoveTy Upper); 

Я пробовал использовать как llvm 3.4, так и llvm 3.5. Я использую gcc 4.8.2. Я не мог найти причин, почему это не будет создано?

ответ

0

Я думаю, ваш код и код LLVM скомпилирован с неопределенным/определенным значением LLVM_HAS_RVALUE_REFERENCES

Try определить LLVM_HAS_RVALUE_REFERENCES в коде

В принципе, вы просите (T const&), но LLVM имеют метод с (T)

Смежные вопросы