diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2012-12-02 13:10:19 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2012-12-02 13:10:19 +0000 | 
| commit | 522600a229b950314b5f4af84eba4f3e8a0ffea1 (patch) | |
| tree | 32b4679ab4b8f28e5228daafc65e9dc436935353 /lib/Bitcode/Reader/BitcodeReader.cpp | |
| parent | 902a7b529820e6a0aa85f98f21afaeb1805a22f8 (diff) | |
Notes
Diffstat (limited to 'lib/Bitcode/Reader/BitcodeReader.cpp')
| -rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 159 | 
1 files changed, 107 insertions, 52 deletions
| diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 4ffee38c8eb8d..4ec9da12ddcff 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -52,6 +52,8 @@ void BitcodeReader::FreeState() {    std::vector<Function*>().swap(FunctionsWithBodies);    DeferredFunctionInfo.clear();    MDKindMap.clear(); + +  assert(BlockAddrFwdRefs.empty() && "Unresolved blockaddress fwd references");  }  //===----------------------------------------------------------------------===// @@ -89,7 +91,7 @@ static GlobalValue::LinkageTypes GetDecodedLinkage(unsigned Val) {    case 12: return GlobalValue::AvailableExternallyLinkage;    case 13: return GlobalValue::LinkerPrivateLinkage;    case 14: return GlobalValue::LinkerPrivateWeakLinkage; -  case 15: return GlobalValue::LinkerPrivateWeakDefAutoLinkage; +  case 15: return GlobalValue::LinkOnceODRAutoHideLinkage;    }  } @@ -197,7 +199,7 @@ namespace {    /// @brief A class for maintaining the slot number definition    /// as a placeholder for the actual definition for forward constants defs.    class ConstantPlaceHolder : public ConstantExpr { -    void operator=(const ConstantPlaceHolder &); // DO NOT IMPLEMENT +    void operator=(const ConstantPlaceHolder &) LLVM_DELETED_FUNCTION;    public:      // allocate space for exactly one operand      void *operator new(size_t s) { @@ -209,7 +211,6 @@ namespace {      }      /// @brief Methods to support type inquiry through isa, cast, and dyn_cast. -    //static inline bool classof(const ConstantPlaceHolder *) { return true; }      static bool classof(const Value *V) {        return isa<ConstantExpr>(V) &&               cast<ConstantExpr>(V)->getOpcode() == Instruction::UserOp1; @@ -475,17 +476,18 @@ bool BitcodeReader::ParseAttributeBlock() {        for (unsigned i = 0, e = Record.size(); i != e; i += 2) {          Attributes ReconstitutedAttr = -          Attribute::decodeLLVMAttributesForBitcode(Record[i+1]); +          Attributes::decodeLLVMAttributesForBitcode(Context, Record[i+1]);          Record[i+1] = ReconstitutedAttr.Raw();        }        for (unsigned i = 0, e = Record.size(); i != e; i += 2) { -        if (Attributes(Record[i+1]) != Attribute::None) +        AttrBuilder B(Record[i+1]); +        if (B.hasAttributes())            Attrs.push_back(AttributeWithIndex::get(Record[i], -                                                  Attributes(Record[i+1]))); +                                                  Attributes::get(Context, B)));        } -      MAttributes.push_back(AttrListPtr::get(Attrs)); +      MAttributes.push_back(AttrListPtr::get(Context, Attrs));        Attrs.clear();        break;      } @@ -889,9 +891,9 @@ bool BitcodeReader::ParseMetadata() {    }  } -/// DecodeSignRotatedValue - Decode a signed value stored with the sign bit in +/// decodeSignRotatedValue - Decode a signed value stored with the sign bit in  /// the LSB for dense VBR encoding. -static uint64_t DecodeSignRotatedValue(uint64_t V) { +uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) {    if ((V & 1) == 0)      return V >> 1;    if (V != 1) @@ -941,7 +943,7 @@ bool BitcodeReader::ResolveGlobalAndAliasInits() {  static APInt ReadWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits) {    SmallVector<uint64_t, 8> Words(Vals.size());    std::transform(Vals.begin(), Vals.end(), Words.begin(), -                 DecodeSignRotatedValue); +                 BitcodeReader::decodeSignRotatedValue);    return APInt(TypeBits, Words);  } @@ -995,7 +997,7 @@ bool BitcodeReader::ParseConstants() {      case bitc::CST_CODE_INTEGER:   // INTEGER: [intval]        if (!CurTy->isIntegerTy() || Record.empty())          return Error("Invalid CST_INTEGER record"); -      V = ConstantInt::get(CurTy, DecodeSignRotatedValue(Record[0])); +      V = ConstantInt::get(CurTy, decodeSignRotatedValue(Record[0]));        break;      case bitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n x intval]        if (!CurTy->isIntegerTy() || Record.empty()) @@ -1245,7 +1247,9 @@ bool BitcodeReader::ParseConstants() {          V = ConstantExpr::getICmp(Record[3], Op0, Op1);        break;      } -    case bitc::CST_CODE_INLINEASM: { +    // This maintains backward compatibility, pre-asm dialect keywords. +    // FIXME: Remove with the 4.0 release. +    case bitc::CST_CODE_INLINEASM_OLD: {        if (Record.size() < 2) return Error("Invalid INLINEASM record");        std::string AsmStr, ConstrStr;        bool HasSideEffects = Record[0] & 1; @@ -1266,6 +1270,31 @@ bool BitcodeReader::ParseConstants() {                           AsmStr, ConstrStr, HasSideEffects, IsAlignStack);        break;      } +    // This version adds support for the asm dialect keywords (e.g., +    // inteldialect). +    case bitc::CST_CODE_INLINEASM: { +      if (Record.size() < 2) return Error("Invalid INLINEASM record"); +      std::string AsmStr, ConstrStr; +      bool HasSideEffects = Record[0] & 1; +      bool IsAlignStack = (Record[0] >> 1) & 1; +      unsigned AsmDialect = Record[0] >> 2; +      unsigned AsmStrSize = Record[1]; +      if (2+AsmStrSize >= Record.size()) +        return Error("Invalid INLINEASM record"); +      unsigned ConstStrSize = Record[2+AsmStrSize]; +      if (3+AsmStrSize+ConstStrSize > Record.size()) +        return Error("Invalid INLINEASM record"); + +      for (unsigned i = 0; i != AsmStrSize; ++i) +        AsmStr += (char)Record[2+i]; +      for (unsigned i = 0; i != ConstStrSize; ++i) +        ConstrStr += (char)Record[3+AsmStrSize+i]; +      PointerType *PTy = cast<PointerType>(CurTy); +      V = InlineAsm::get(cast<FunctionType>(PTy->getElementType()), +                         AsmStr, ConstrStr, HasSideEffects, IsAlignStack, +                         InlineAsm::AsmDialect(AsmDialect)); +      break; +    }      case bitc::CST_CODE_BLOCKADDRESS:{        if (Record.size() < 3) return Error("Invalid CE_BLOCKADDRESS record");        Type *FnTy = getTypeByID(Record[0]); @@ -1273,13 +1302,27 @@ bool BitcodeReader::ParseConstants() {        Function *Fn =          dyn_cast_or_null<Function>(ValueList.getConstantFwdRef(Record[1],FnTy));        if (Fn == 0) return Error("Invalid CE_BLOCKADDRESS record"); -       -      GlobalVariable *FwdRef = new GlobalVariable(*Fn->getParent(), -                                                  Type::getInt8Ty(Context), + +      // If the function is already parsed we can insert the block address right +      // away. +      if (!Fn->empty()) { +        Function::iterator BBI = Fn->begin(), BBE = Fn->end(); +        for (size_t I = 0, E = Record[2]; I != E; ++I) { +          if (BBI == BBE) +            return Error("Invalid blockaddress block #"); +          ++BBI; +        } +        V = BlockAddress::get(Fn, BBI); +      } else { +        // Otherwise insert a placeholder and remember it so it can be inserted +        // when the function is parsed. +        GlobalVariable *FwdRef = new GlobalVariable(*Fn->getParent(), +                                                    Type::getInt8Ty(Context),                                              false, GlobalValue::InternalLinkage, -                                                  0, ""); -      BlockAddrFwdRefs[Fn].push_back(std::make_pair(Record[2], FwdRef)); -      V = FwdRef; +                                                    0, ""); +        BlockAddrFwdRefs[Fn].push_back(std::make_pair(Record[2], FwdRef)); +        V = FwdRef; +      }        break;      }        } @@ -1481,13 +1524,22 @@ bool BitcodeReader::ParseModule(bool Resume) {      // Read a record.      switch (Stream.ReadRecord(Code, Record)) {      default: break;  // Default behavior, ignore unknown content. -    case bitc::MODULE_CODE_VERSION:  // VERSION: [version#] +    case bitc::MODULE_CODE_VERSION: {  // VERSION: [version#]        if (Record.size() < 1)          return Error("Malformed MODULE_CODE_VERSION"); -      // Only version #0 is supported so far. -      if (Record[0] != 0) -        return Error("Unknown bitstream version!"); +      // Only version #0 and #1 are supported so far. +      unsigned module_version = Record[0]; +      switch (module_version) { +        default: return Error("Unknown bitstream version!"); +        case 0: +          UseRelativeIDs = false; +          break; +        case 1: +          UseRelativeIDs = true; +          break; +      }        break; +    }      case bitc::MODULE_CODE_TRIPLE: {  // TRIPLE: [strchr x N]        std::string S;        if (ConvertToString(Record, 0, S)) @@ -1754,13 +1806,6 @@ bool BitcodeReader::ParseModuleTriple(std::string &Triple) {      // Read a record.      switch (Stream.ReadRecord(Code, Record)) {      default: break;  // Default behavior, ignore unknown content. -    case bitc::MODULE_CODE_VERSION:  // VERSION: [version#] -      if (Record.size() < 1) -        return Error("Malformed MODULE_CODE_VERSION"); -      // Only version #0 is supported so far. -      if (Record[0] != 0) -        return Error("Unknown bitstream version!"); -      break;      case bitc::MODULE_CODE_TRIPLE: {  // TRIPLE: [strchr x N]        std::string S;        if (ConvertToString(Record, 0, S)) @@ -1973,7 +2018,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *LHS, *RHS;        if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || -          getValue(Record, OpNum, LHS->getType(), RHS) || +          popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) ||            OpNum+1 > Record.size())          return Error("Invalid BINOP record"); @@ -2088,8 +2133,8 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *TrueVal, *FalseVal, *Cond;        if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || -          getValue(Record, OpNum, TrueVal->getType(), FalseVal) || -          getValue(Record, OpNum, Type::getInt1Ty(Context), Cond)) +          popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) || +          popValue(Record, OpNum, NextValueNo, Type::getInt1Ty(Context), Cond))          return Error("Invalid SELECT record");        I = SelectInst::Create(Cond, TrueVal, FalseVal); @@ -2103,7 +2148,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *TrueVal, *FalseVal, *Cond;        if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) || -          getValue(Record, OpNum, TrueVal->getType(), FalseVal) || +          popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) ||            getValueTypePair(Record, OpNum, NextValueNo, Cond))          return Error("Invalid SELECT record"); @@ -2128,7 +2173,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *Vec, *Idx;        if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || -          getValue(Record, OpNum, Type::getInt32Ty(Context), Idx)) +          popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx))          return Error("Invalid EXTRACTELT record");        I = ExtractElementInst::Create(Vec, Idx);        InstructionList.push_back(I); @@ -2139,9 +2184,9 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *Vec, *Elt, *Idx;        if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || -          getValue(Record, OpNum, +          popValue(Record, OpNum, NextValueNo,                     cast<VectorType>(Vec->getType())->getElementType(), Elt) || -          getValue(Record, OpNum, Type::getInt32Ty(Context), Idx)) +          popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx))          return Error("Invalid INSERTELT record");        I = InsertElementInst::Create(Vec, Elt, Idx);        InstructionList.push_back(I); @@ -2152,7 +2197,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *Vec1, *Vec2, *Mask;        if (getValueTypePair(Record, OpNum, NextValueNo, Vec1) || -          getValue(Record, OpNum, Vec1->getType(), Vec2)) +          popValue(Record, OpNum, NextValueNo, Vec1->getType(), Vec2))          return Error("Invalid SHUFFLEVEC record");        if (getValueTypePair(Record, OpNum, NextValueNo, Mask)) @@ -2172,7 +2217,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *LHS, *RHS;        if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || -          getValue(Record, OpNum, LHS->getType(), RHS) || +          popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) ||            OpNum+1 != Record.size())          return Error("Invalid CMP record"); @@ -2217,7 +2262,8 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        }        else {          BasicBlock *FalseDest = getBasicBlock(Record[1]); -        Value *Cond = getFnValueByID(Record[2], Type::getInt1Ty(Context)); +        Value *Cond = getValue(Record, 2, NextValueNo, +                               Type::getInt1Ty(Context));          if (FalseDest == 0 || Cond == 0)            return Error("Invalid BR record");          I = BranchInst::Create(TrueDest, FalseDest, Cond); @@ -2233,7 +2279,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {          Type *OpTy = getTypeByID(Record[1]);          unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth(); -        Value *Cond = getFnValueByID(Record[2], OpTy); +        Value *Cond = getValue(Record, 2, NextValueNo, OpTy);          BasicBlock *Default = getBasicBlock(Record[3]);          if (OpTy == 0 || Cond == 0 || Default == 0)            return Error("Invalid SWITCH record"); @@ -2288,7 +2334,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        if (Record.size() < 3 || (Record.size() & 1) == 0)          return Error("Invalid SWITCH record");        Type *OpTy = getTypeByID(Record[0]); -      Value *Cond = getFnValueByID(Record[1], OpTy); +      Value *Cond = getValue(Record, 1, NextValueNo, OpTy);        BasicBlock *Default = getBasicBlock(Record[2]);        if (OpTy == 0 || Cond == 0 || Default == 0)          return Error("Invalid SWITCH record"); @@ -2312,7 +2358,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        if (Record.size() < 2)          return Error("Invalid INDIRECTBR record");        Type *OpTy = getTypeByID(Record[0]); -      Value *Address = getFnValueByID(Record[1], OpTy); +      Value *Address = getValue(Record, 1, NextValueNo, OpTy);        if (OpTy == 0 || Address == 0)          return Error("Invalid INDIRECTBR record");        unsigned NumDests = Record.size()-2; @@ -2354,7 +2400,8 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        SmallVector<Value*, 16> Ops;        for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { -        Ops.push_back(getFnValueByID(Record[OpNum], FTy->getParamType(i))); +        Ops.push_back(getValue(Record, OpNum, NextValueNo, +                               FTy->getParamType(i)));          if (Ops.back() == 0) return Error("Invalid INVOKE record");        } @@ -2401,7 +2448,14 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        InstructionList.push_back(PN);        for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) { -        Value *V = getFnValueByID(Record[1+i], Ty); +        Value *V; +        // With the new function encoding, it is possible that operands have +        // negative IDs (for forward references).  Use a signed VBR +        // representation to keep the encoding small. +        if (UseRelativeIDs) +          V = getValueSigned(Record, 1+i, NextValueNo, Ty); +        else +          V = getValue(Record, 1+i, NextValueNo, Ty);          BasicBlock *BB = getBasicBlock(Record[2+i]);          if (!V || !BB) return Error("Invalid PHI record");          PN->addIncoming(V, BB); @@ -2499,7 +2553,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *Val, *Ptr;        if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || -          getValue(Record, OpNum, +          popValue(Record, OpNum, NextValueNo,                      cast<PointerType>(Ptr->getType())->getElementType(), Val) ||            OpNum+2 != Record.size())          return Error("Invalid STORE record"); @@ -2513,7 +2567,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *Val, *Ptr;        if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || -          getValue(Record, OpNum, +          popValue(Record, OpNum, NextValueNo,                      cast<PointerType>(Ptr->getType())->getElementType(), Val) ||            OpNum+4 != Record.size())          return Error("Invalid STOREATOMIC record"); @@ -2536,9 +2590,9 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *Ptr, *Cmp, *New;        if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || -          getValue(Record, OpNum, +          popValue(Record, OpNum, NextValueNo,                      cast<PointerType>(Ptr->getType())->getElementType(), Cmp) || -          getValue(Record, OpNum, +          popValue(Record, OpNum, NextValueNo,                      cast<PointerType>(Ptr->getType())->getElementType(), New) ||            OpNum+3 != Record.size())          return Error("Invalid CMPXCHG record"); @@ -2556,7 +2610,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *Ptr, *Val;        if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) || -          getValue(Record, OpNum, +          popValue(Record, OpNum, NextValueNo,                      cast<PointerType>(Ptr->getType())->getElementType(), Val) ||            OpNum+4 != Record.size())          return Error("Invalid ATOMICRMW record"); @@ -2610,7 +2664,8 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {          if (FTy->getParamType(i)->isLabelTy())            Args.push_back(getBasicBlock(Record[OpNum]));          else -          Args.push_back(getFnValueByID(Record[OpNum], FTy->getParamType(i))); +          Args.push_back(getValue(Record, OpNum, NextValueNo, +                                  FTy->getParamType(i)));          if (Args.back() == 0) return Error("Invalid CALL record");        } @@ -2639,7 +2694,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        if (Record.size() < 3)          return Error("Invalid VAARG record");        Type *OpTy = getTypeByID(Record[0]); -      Value *Op = getFnValueByID(Record[1], OpTy); +      Value *Op = getValue(Record, 1, NextValueNo, OpTy);        Type *ResTy = getTypeByID(Record[2]);        if (!OpTy || !Op || !ResTy)          return Error("Invalid VAARG record"); @@ -2837,7 +2892,7 @@ bool BitcodeReader::InitStream() {  }  bool BitcodeReader::InitStreamFromBuffer() { -  const unsigned char *BufPtr = (unsigned char *)Buffer->getBufferStart(); +  const unsigned char *BufPtr = (const unsigned char*)Buffer->getBufferStart();    const unsigned char *BufEnd = BufPtr+Buffer->getBufferSize();    if (Buffer->getBufferSize() & 3) { | 
