diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2010-09-17 15:48:55 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2010-09-17 15:48:55 +0000 | 
| commit | d39c594d39df7f283c2fb8a704a3f31c501180d9 (patch) | |
| tree | 36453626c792cccd91f783a38a169d610a6b9db9 /lib/Bitcode | |
| parent | 6144c1de6a7674dad94290650e4e14f24d42e421 (diff) | |
Notes
Diffstat (limited to 'lib/Bitcode')
| -rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 119 | ||||
| -rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.h | 12 | ||||
| -rw-r--r-- | lib/Bitcode/Writer/BitcodeWriter.cpp | 136 | ||||
| -rw-r--r-- | lib/Bitcode/Writer/BitcodeWriterPass.cpp | 2 | ||||
| -rw-r--r-- | lib/Bitcode/Writer/ValueEnumerator.cpp | 139 | ||||
| -rw-r--r-- | lib/Bitcode/Writer/ValueEnumerator.h | 9 | 
6 files changed, 242 insertions, 175 deletions
| diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index b3f0776d29d5..830c79aa3b54 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -39,6 +39,7 @@ void BitcodeReader::FreeState() {    std::vector<BasicBlock*>().swap(FunctionBBs);    std::vector<Function*>().swap(FunctionsWithBodies);    DeferredFunctionInfo.clear(); +  MDKindMap.clear();  }  //===----------------------------------------------------------------------===// @@ -76,6 +77,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;    }  } @@ -295,8 +297,6 @@ void BitcodeReaderValueList::ResolveConstantForwardRefs() {        } else if (ConstantStruct *UserCS = dyn_cast<ConstantStruct>(UserC)) {          NewC = ConstantStruct::get(Context, &NewOps[0], NewOps.size(),                                           UserCS->getType()->isPacked()); -      } else if (ConstantUnion *UserCU = dyn_cast<ConstantUnion>(UserC)) { -        NewC = ConstantUnion::get(UserCU->getType(), NewOps[0]);        } else if (isa<ConstantVector>(UserC)) {          NewC = ConstantVector::get(&NewOps[0], NewOps.size());        } else { @@ -332,9 +332,9 @@ void BitcodeReaderMDValueList::AssignValue(Value *V, unsigned Idx) {    }    // If there was a forward reference to this value, replace it. -  Value *PrevVal = OldV; +  MDNode *PrevVal = cast<MDNode>(OldV);    OldV->replaceAllUsesWith(V); -  delete PrevVal; +  MDNode::deleteTemporary(PrevVal);    // Deleting PrevVal sets Idx value in MDValuePtrs to null. Set new    // value for Idx.    MDValuePtrs[Idx] = V; @@ -350,7 +350,7 @@ Value *BitcodeReaderMDValueList::getValueFwdRef(unsigned Idx) {    }    // Create and return a placeholder, which will later be RAUW'd. -  Value *V = new Argument(Type::getMetadataTy(Context)); +  Value *V = MDNode::getTemporary(Context, 0, 0);    MDValuePtrs[Idx] = V;    return V;  } @@ -589,13 +589,6 @@ bool BitcodeReader::ParseTypeTable() {        ResultTy = StructType::get(Context, EltTys, Record[0]);        break;      } -    case bitc::TYPE_CODE_UNION: {  // UNION: [eltty x N] -      SmallVector<const Type*, 8> EltTys; -      for (unsigned i = 0, e = Record.size(); i != e; ++i) -        EltTys.push_back(getTypeByID(Record[i], true)); -      ResultTy = UnionType::get(&EltTys[0], EltTys.size()); -      break; -    }      case bitc::TYPE_CODE_ARRAY:     // ARRAY: [numelts, eltty]        if (Record.size() < 2)          return Error("Invalid ARRAY type record"); @@ -781,7 +774,8 @@ bool BitcodeReader::ParseMetadata() {      bool IsFunctionLocal = false;      // Read a record.      Record.clear(); -    switch (Stream.ReadRecord(Code, Record)) { +    Code = Stream.ReadRecord(Code, Record); +    switch (Code) {      default:  // Default behavior: ignore.        break;      case bitc::METADATA_NAME: { @@ -794,34 +788,46 @@ bool BitcodeReader::ParseMetadata() {        Record.clear();        Code = Stream.ReadCode(); -      // METADATA_NAME is always followed by METADATA_NAMED_NODE. -      if (Stream.ReadRecord(Code, Record) != bitc::METADATA_NAMED_NODE) +      // METADATA_NAME is always followed by METADATA_NAMED_NODE2. +      // Or METADATA_NAMED_NODE in LLVM 2.7. FIXME: Remove this in LLVM 3.0. +      unsigned NextBitCode = Stream.ReadRecord(Code, Record); +      if (NextBitCode == bitc::METADATA_NAMED_NODE) { +        LLVM2_7MetadataDetected = true; +      } else if (NextBitCode != bitc::METADATA_NAMED_NODE2)          assert ( 0 && "Inavlid Named Metadata record");        // Read named metadata elements.        unsigned Size = Record.size(); -      SmallVector<MDNode *, 8> Elts; +      NamedMDNode *NMD = TheModule->getOrInsertNamedMetadata(Name);        for (unsigned i = 0; i != Size; ++i) { -        if (Record[i] == ~0U) { -          Elts.push_back(NULL); -          continue; -        }          MDNode *MD = dyn_cast<MDNode>(MDValueList.getValueFwdRef(Record[i]));          if (MD == 0)            return Error("Malformed metadata record"); -        Elts.push_back(MD); +        NMD->addOperand(MD);        } -      Value *V = NamedMDNode::Create(Context, Name.str(), Elts.data(), -                                     Elts.size(), TheModule); -      MDValueList.AssignValue(V, NextMDValueNo++); +      // Backwards compatibility hack: NamedMDValues used to be Values, +      // and they got their own slots in the value numbering. They are no +      // longer Values, however we still need to account for them in the +      // numbering in order to be able to read old bitcode files. +      // FIXME: Remove this in LLVM 3.0. +      if (LLVM2_7MetadataDetected) +        MDValueList.AssignValue(0, NextMDValueNo++);        break;      } -    case bitc::METADATA_FN_NODE: +    case bitc::METADATA_FN_NODE: // FIXME: Remove in LLVM 3.0. +    case bitc::METADATA_FN_NODE2:        IsFunctionLocal = true;        // fall-through -    case bitc::METADATA_NODE: { +    case bitc::METADATA_NODE:    // FIXME: Remove in LLVM 3.0. +    case bitc::METADATA_NODE2: { + +      // Detect 2.7-era metadata. +      // FIXME: Remove in LLVM 3.0. +      if (Code == bitc::METADATA_FN_NODE || Code == bitc::METADATA_NODE) +        LLVM2_7MetadataDetected = true; +        if (Record.size() % 2 == 1) -        return Error("Invalid METADATA_NODE record"); +        return Error("Invalid METADATA_NODE2 record");        unsigned Size = Record.size();        SmallVector<Value*, 8> Elts; @@ -859,13 +865,12 @@ bool BitcodeReader::ParseMetadata() {        SmallString<8> Name;        Name.resize(RecordLength-1);        unsigned Kind = Record[0]; -      (void) Kind;        for (unsigned i = 1; i != RecordLength; ++i)          Name[i-1] = Record[i];        unsigned NewKind = TheModule->getMDKindID(Name.str()); -      assert(Kind == NewKind && -             "FIXME: Unable to handle custom metadata mismatch!");(void)NewKind; +      if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second) +        return Error("Conflicting METADATA_KIND records");        break;      }      } @@ -1020,11 +1025,6 @@ bool BitcodeReader::ParseConstants() {            Elts.push_back(ValueList.getConstantFwdRef(Record[i],                                                       STy->getElementType(i)));          V = ConstantStruct::get(STy, Elts); -      } else if (const UnionType *UnTy = dyn_cast<UnionType>(CurTy)) { -        uint64_t Index = Record[0]; -        Constant *Val = ValueList.getConstantFwdRef(Record[1], -                                        UnTy->getElementType(Index)); -        V = ConstantUnion::get(UnTy, Val);        } else if (const ArrayType *ATy = dyn_cast<ArrayType>(CurTy)) {          const Type *EltTy = ATy->getElementType();          for (unsigned i = 0; i != Size; ++i) @@ -1297,6 +1297,12 @@ bool BitcodeReader::ParseModule() {            UpgradedIntrinsics.push_back(std::make_pair(FI, NewFn));        } +      // Look for global variables which need to be renamed. +      for (Module::global_iterator +             GI = TheModule->global_begin(), GE = TheModule->global_end(); +           GI != GE; ++GI) +        UpgradeGlobalVariable(GI); +        // Force deallocation of memory for these vectors to favor the client that        // want lazy deserialization.        std::vector<std::pair<GlobalVariable*, unsigned> >().swap(GlobalInits); @@ -1614,15 +1620,22 @@ bool BitcodeReader::ParseMetadataAttachment() {      switch (Stream.ReadRecord(Code, Record)) {      default:  // Default behavior: ignore.        break; -    case bitc::METADATA_ATTACHMENT: { +    // FIXME: Remove in LLVM 3.0. +    case bitc::METADATA_ATTACHMENT: +      LLVM2_7MetadataDetected = true; +    case bitc::METADATA_ATTACHMENT2: {        unsigned RecordLength = Record.size();        if (Record.empty() || (RecordLength - 1) % 2 == 1)          return Error ("Invalid METADATA_ATTACHMENT reader!");        Instruction *Inst = InstructionList[Record[0]];        for (unsigned i = 1; i != RecordLength; i = i+2) {          unsigned Kind = Record[i]; +        DenseMap<unsigned, unsigned>::iterator I = +          MDKindMap.find(Kind); +        if (I == MDKindMap.end()) +          return Error("Invalid metadata kind ID");          Value *Node = MDValueList.getValueFwdRef(Record[i+1]); -        Inst->setMetadata(Kind, cast<MDNode>(Node)); +        Inst->setMetadata(I->second, cast<MDNode>(Node));        }        break;      } @@ -1638,6 +1651,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {    InstructionList.clear();    unsigned ModuleValueListSize = ValueList.size(); +  unsigned ModuleMDValueListSize = MDValueList.size();    // Add all the function arguments to the value table.    for(Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) @@ -1722,7 +1736,10 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        I = 0;        continue; -    case bitc::FUNC_CODE_DEBUG_LOC: {      // DEBUG_LOC: [line, col, scope, ia] +    // FIXME: Remove this in LLVM 3.0. +    case bitc::FUNC_CODE_DEBUG_LOC: +      LLVM2_7MetadataDetected = true; +    case bitc::FUNC_CODE_DEBUG_LOC2: {      // DEBUG_LOC: [line, col, scope, ia]        I = 0;     // Get the last instruction emitted.        if (CurBB && !CurBB->empty())          I = &CurBB->back(); @@ -1988,6 +2005,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {          } while(OpNum != Record.size());          const Type *ReturnType = F->getReturnType(); +        // Handle multiple return values. FIXME: Remove in LLVM 3.0.          if (Vs.size() > 1 ||              (ReturnType->isStructTy() &&               (Vs.empty() || Vs[0]->getType() != ReturnType))) { @@ -2183,7 +2201,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {      }      case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align]        // For backward compatibility, tolerate a lack of an opty, and use i32. -      // LLVM 3.0: Remove this. +      // Remove this in LLVM 3.0.        if (Record.size() < 3 || Record.size() > 4)          return Error("Invalid ALLOCA record");        unsigned OpNum = 0; @@ -2236,7 +2254,10 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        InstructionList.push_back(I);        break;      } -    case bitc::FUNC_CODE_INST_CALL: { +    // FIXME: Remove this in LLVM 3.0. +    case bitc::FUNC_CODE_INST_CALL: +      LLVM2_7MetadataDetected = true; +    case bitc::FUNC_CODE_INST_CALL2: {        // CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...]        if (Record.size() < 3)          return Error("Invalid CALL record"); @@ -2324,7 +2345,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {      if (A->getParent() == 0) {        // We found at least one unresolved value.  Nuke them all to avoid leaks.        for (unsigned i = ModuleValueListSize, e = ValueList.size(); i != e; ++i){ -        if ((A = dyn_cast<Argument>(ValueList.back())) && A->getParent() == 0) { +        if ((A = dyn_cast<Argument>(ValueList[i])) && A->getParent() == 0) {            A->replaceAllUsesWith(UndefValue::get(A->getType()));            delete A;          } @@ -2333,6 +2354,9 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {      }    } +  // FIXME: Check for unresolved forward-declared metadata references +  // and clean up leaks. +    // See if anything took the address of blocks in this function.  If so,    // resolve them now.    DenseMap<Function*, std::vector<BlockAddrRefTy> >::iterator BAFRI = @@ -2352,8 +2376,21 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {      BlockAddrFwdRefs.erase(BAFRI);    } +  // FIXME: Remove this in LLVM 3.0. +  unsigned NewMDValueListSize = MDValueList.size(); +    // Trim the value list down to the size it was before we parsed this function.    ValueList.shrinkTo(ModuleValueListSize); +  MDValueList.shrinkTo(ModuleMDValueListSize); + +  // Backwards compatibility hack: Function-local metadata numbers +  // were previously not reset between functions. This is now fixed, +  // however we still need to understand the old numbering in order +  // to be able to read old bitcode files. +  // FIXME: Remove this in LLVM 3.0. +  if (LLVM2_7MetadataDetected) +    MDValueList.resize(NewMDValueListSize); +    std::vector<BasicBlock*>().swap(FunctionBBs);    return false; diff --git a/lib/Bitcode/Reader/BitcodeReader.h b/lib/Bitcode/Reader/BitcodeReader.h index 55c71f7c886f..053121bdad6e 100644 --- a/lib/Bitcode/Reader/BitcodeReader.h +++ b/lib/Bitcode/Reader/BitcodeReader.h @@ -156,6 +156,9 @@ class BitcodeReader : public GVMaterializer {    // stored here with their replacement function.    typedef std::vector<std::pair<Function*, Function*> > UpgradedIntrinsicMap;    UpgradedIntrinsicMap UpgradedIntrinsics; + +  // Map the bitcode's custom MDKind ID to the Module's MDKind ID. +  DenseMap<unsigned, unsigned> MDKindMap;    // After the module header has been read, the FunctionsWithBodies list is     // reversed.  This keeps track of whether we've done this yet. @@ -170,11 +173,18 @@ class BitcodeReader : public GVMaterializer {    /// are resolved lazily when functions are loaded.    typedef std::pair<unsigned, GlobalVariable*> BlockAddrRefTy;    DenseMap<Function*, std::vector<BlockAddrRefTy> > BlockAddrFwdRefs; + +  /// LLVM2_7MetadataDetected - True if metadata produced by LLVM 2.7 or +  /// earlier was detected, in which case we behave slightly differently, +  /// for compatibility. +  /// FIXME: Remove in LLVM 3.0. +  bool LLVM2_7MetadataDetected;  public:    explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C)      : Context(C), TheModule(0), Buffer(buffer), BufferOwned(false), -      ErrorString(0), ValueList(C), MDValueList(C) { +      ErrorString(0), ValueList(C), MDValueList(C), +      LLVM2_7MetadataDetected(false) {      HasReversedFunctionsWithBodies = false;    }    ~BitcodeReader() { diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index fa1b2c4bee2b..7b6fc6cd928d 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -181,14 +181,6 @@ static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {                              Log2_32_Ceil(VE.getTypes().size()+1)));    unsigned StructAbbrev = Stream.EmitAbbrev(Abbv); -  // Abbrev for TYPE_CODE_UNION. -  Abbv = new BitCodeAbbrev(); -  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_UNION)); -  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); -  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, -                            Log2_32_Ceil(VE.getTypes().size()+1))); -  unsigned UnionAbbrev = Stream.EmitAbbrev(Abbv); -    // Abbrev for TYPE_CODE_ARRAY.    Abbv = new BitCodeAbbrev();    Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY)); @@ -258,17 +250,6 @@ static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {        AbbrevToUse = StructAbbrev;        break;      } -    case Type::UnionTyID: { -      const UnionType *UT = cast<UnionType>(T); -      // UNION: [eltty x N] -      Code = bitc::TYPE_CODE_UNION; -      // Output all of the element types. -      for (UnionType::element_iterator I = UT->element_begin(), -           E = UT->element_end(); I != E; ++I) -        TypeVals.push_back(VE.getTypeID(*I)); -      AbbrevToUse = UnionAbbrev; -      break; -    }      case Type::ArrayTyID: {        const ArrayType *AT = cast<ArrayType>(T);        // ARRAY: [numelts, eltty] @@ -299,21 +280,22 @@ static void WriteTypeTable(const ValueEnumerator &VE, BitstreamWriter &Stream) {  static unsigned getEncodedLinkage(const GlobalValue *GV) {    switch (GV->getLinkage()) {    default: llvm_unreachable("Invalid linkage!"); -  case GlobalValue::ExternalLinkage:            return 0; -  case GlobalValue::WeakAnyLinkage:             return 1; -  case GlobalValue::AppendingLinkage:           return 2; -  case GlobalValue::InternalLinkage:            return 3; -  case GlobalValue::LinkOnceAnyLinkage:         return 4; -  case GlobalValue::DLLImportLinkage:           return 5; -  case GlobalValue::DLLExportLinkage:           return 6; -  case GlobalValue::ExternalWeakLinkage:        return 7; -  case GlobalValue::CommonLinkage:              return 8; -  case GlobalValue::PrivateLinkage:             return 9; -  case GlobalValue::WeakODRLinkage:             return 10; -  case GlobalValue::LinkOnceODRLinkage:         return 11; -  case GlobalValue::AvailableExternallyLinkage: return 12; -  case GlobalValue::LinkerPrivateLinkage:       return 13; -  case GlobalValue::LinkerPrivateWeakLinkage:   return 14; +  case GlobalValue::ExternalLinkage:                 return 0; +  case GlobalValue::WeakAnyLinkage:                  return 1; +  case GlobalValue::AppendingLinkage:                return 2; +  case GlobalValue::InternalLinkage:                 return 3; +  case GlobalValue::LinkOnceAnyLinkage:              return 4; +  case GlobalValue::DLLImportLinkage:                return 5; +  case GlobalValue::DLLExportLinkage:                return 6; +  case GlobalValue::ExternalWeakLinkage:             return 7; +  case GlobalValue::CommonLinkage:                   return 8; +  case GlobalValue::PrivateLinkage:                  return 9; +  case GlobalValue::WeakODRLinkage:                  return 10; +  case GlobalValue::LinkOnceODRLinkage:              return 11; +  case GlobalValue::AvailableExternallyLinkage:      return 12; +  case GlobalValue::LinkerPrivateLinkage:            return 13; +  case GlobalValue::LinkerPrivateWeakLinkage:        return 14; +  case GlobalValue::LinkerPrivateWeakDefAutoLinkage: return 15;    }  } @@ -503,13 +485,14 @@ static void WriteMDNode(const MDNode *N,        Record.push_back(0);      }    } -  unsigned MDCode = N->isFunctionLocal() ? bitc::METADATA_FN_NODE : -                                           bitc::METADATA_NODE; +  unsigned MDCode = N->isFunctionLocal() ? bitc::METADATA_FN_NODE2 : +                                           bitc::METADATA_NODE2;    Stream.EmitRecord(MDCode, Record, 0);    Record.clear();  } -static void WriteModuleMetadata(const ValueEnumerator &VE, +static void WriteModuleMetadata(const Module *M, +                                const ValueEnumerator &VE,                                  BitstreamWriter &Stream) {    const ValueEnumerator::ValueList &Vals = VE.getMDValues();    bool StartedMetadataBlock = false; @@ -544,29 +527,30 @@ static void WriteModuleMetadata(const ValueEnumerator &VE,        // Emit the finished record.        Stream.EmitRecord(bitc::METADATA_STRING, Record, MDSAbbrev);        Record.clear(); -    } else if (const NamedMDNode *NMD = dyn_cast<NamedMDNode>(Vals[i].first)) { -      if (!StartedMetadataBlock)  { -        Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); -        StartedMetadataBlock = true; -      } - -      // Write name. -      StringRef Str = NMD->getName(); -      for (unsigned i = 0, e = Str.size(); i != e; ++i) -        Record.push_back(Str[i]); -      Stream.EmitRecord(bitc::METADATA_NAME, Record, 0/*TODO*/); -      Record.clear(); +    } +  } -      // Write named metadata operands. -      for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { -        if (NMD->getOperand(i)) -          Record.push_back(VE.getValueID(NMD->getOperand(i))); -        else -          Record.push_back(~0U); -      } -      Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0); -      Record.clear(); +  // Write named metadata. +  for (Module::const_named_metadata_iterator I = M->named_metadata_begin(), +       E = M->named_metadata_end(); I != E; ++I) { +    const NamedMDNode *NMD = I; +    if (!StartedMetadataBlock)  { +      Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); +      StartedMetadataBlock = true;      } + +    // Write name. +    StringRef Str = NMD->getName(); +    for (unsigned i = 0, e = Str.size(); i != e; ++i) +      Record.push_back(Str[i]); +    Stream.EmitRecord(bitc::METADATA_NAME, Record, 0/*TODO*/); +    Record.clear(); + +    // Write named metadata operands. +    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) +      Record.push_back(VE.getValueID(NMD->getOperand(i))); +    Stream.EmitRecord(bitc::METADATA_NAMED_NODE2, Record, 0); +    Record.clear();    }    if (StartedMetadataBlock) @@ -601,7 +585,7 @@ static void WriteMetadataAttachment(const Function &F,    SmallVector<uint64_t, 64> Record;    // Write metadata attachments -  // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]] +  // METADATA_ATTACHMENT2 - [m x [value, [n x [id, mdnode]]]    SmallVector<std::pair<unsigned, MDNode*>, 4> MDs;    for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) @@ -619,7 +603,7 @@ static void WriteMetadataAttachment(const Function &F,          Record.push_back(MDs[i].first);          Record.push_back(VE.getValueID(MDs[i].second));        } -      Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0); +      Stream.EmitRecord(bitc::METADATA_ATTACHMENT2, Record, 0);        Record.clear();      } @@ -634,12 +618,11 @@ static void WriteModuleMetadataStore(const Module *M, BitstreamWriter &Stream) {    SmallVector<StringRef, 4> Names;    M->getMDKindNames(Names); -  assert(Names[0] == "" && "MDKind #0 is invalid"); -  if (Names.size() == 1) return; +  if (Names.empty()) return;    Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); -  for (unsigned MDKindID = 1, e = Names.size(); MDKindID != e; ++MDKindID) { +  for (unsigned MDKindID = 0, e = Names.size(); MDKindID != e; ++MDKindID) {      Record.push_back(MDKindID);      StringRef KName = Names[MDKindID];      Record.append(KName.begin(), KName.end()); @@ -734,8 +717,8 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal,        Code = bitc::CST_CODE_UNDEF;      } else if (const ConstantInt *IV = dyn_cast<ConstantInt>(C)) {        if (IV->getBitWidth() <= 64) { -        int64_t V = IV->getSExtValue(); -        if (V >= 0) +        uint64_t V = IV->getSExtValue(); +        if ((int64_t)V >= 0)            Record.push_back(V << 1);          else            Record.push_back((-V << 1) | 1); @@ -809,20 +792,6 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal,        for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i)          Record.push_back(VE.getValueID(C->getOperand(i)));        AbbrevToUse = AggregateAbbrev; -    } else if (isa<ConstantUnion>(C)) { -      Code = bitc::CST_CODE_AGGREGATE; - -      // Unions only have one entry but we must send type along with it. -      const Type *EntryKind = C->getOperand(0)->getType(); - -      const UnionType *UnTy = cast<UnionType>(C->getType()); -      int UnionIndex = UnTy->getElementTypeIndex(EntryKind); -      assert(UnionIndex != -1 && "Constant union contains invalid entry"); - -      Record.push_back(UnionIndex); -      Record.push_back(VE.getValueID(C->getOperand(0))); - -      AbbrevToUse = AggregateAbbrev;      } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {        switch (CE->getOpcode()) {        default: @@ -902,6 +871,9 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal,        Record.push_back(VE.getValueID(BA->getFunction()));        Record.push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock()));      } else { +#ifndef NDEBUG +      C->dump(); +#endif        llvm_unreachable("Unknown constant!");      }      Stream.EmitRecord(Code, Record, AbbrevToUse); @@ -1139,7 +1111,7 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,      const PointerType *PTy = cast<PointerType>(CI.getCalledValue()->getType());      const FunctionType *FTy = cast<FunctionType>(PTy->getElementType()); -    Code = bitc::FUNC_CODE_INST_CALL; +    Code = bitc::FUNC_CODE_INST_CALL2;      Vals.push_back(VE.getAttributeID(CI.getAttributes()));      Vals.push_back((CI.getCallingConv() << 1) | unsigned(CI.isTailCall())); @@ -1283,7 +1255,7 @@ static void WriteFunction(const Function &F, ValueEnumerator &VE,          Vals.push_back(DL.getCol());          Vals.push_back(Scope ? VE.getValueID(Scope)+1 : 0);          Vals.push_back(IA ? VE.getValueID(IA)+1 : 0); -        Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals); +        Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC2, Vals);          Vals.clear();          LastDL = DL; @@ -1532,7 +1504,7 @@ static void WriteModule(const Module *M, BitstreamWriter &Stream) {    WriteModuleConstants(VE, Stream);    // Emit metadata. -  WriteModuleMetadata(VE, Stream); +  WriteModuleMetadata(M, VE, Stream);    // Emit function bodies.    for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) diff --git a/lib/Bitcode/Writer/BitcodeWriterPass.cpp b/lib/Bitcode/Writer/BitcodeWriterPass.cpp index 3a0d3ce0be99..91e115cba6cc 100644 --- a/lib/Bitcode/Writer/BitcodeWriterPass.cpp +++ b/lib/Bitcode/Writer/BitcodeWriterPass.cpp @@ -21,7 +21,7 @@ namespace {    public:      static char ID; // Pass identification, replacement for typeid      explicit WriteBitcodePass(raw_ostream &o) -      : ModulePass(&ID), OS(o) {} +      : ModulePass(ID), OS(o) {}      const char *getPassName() const { return "Bitcode Writer"; } diff --git a/lib/Bitcode/Writer/ValueEnumerator.cpp b/lib/Bitcode/Writer/ValueEnumerator.cpp index 7fa425a7d871..2f02262c36af 100644 --- a/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -75,7 +75,7 @@ ValueEnumerator::ValueEnumerator(const Module *M) {    // Insert constants and metadata that are named at module level into the slot     // pool so that the module symbol table can refer to them...    EnumerateValueSymbolTable(M->getValueSymbolTable()); -  EnumerateMDSymbolTable(M->getMDSymbolTable()); +  EnumerateNamedMetadata(M);    SmallVector<std::pair<unsigned, MDNode*>, 8> MDs; @@ -137,7 +137,7 @@ ValueEnumerator::ValueEnumerator(const Module *M) {  unsigned ValueEnumerator::getInstructionID(const Instruction *Inst) const {    InstructionMapType::const_iterator I = InstructionMap.find(Inst);    assert (I != InstructionMap.end() && "Instruction is not mapped!"); -    return I->second; +  return I->second;  }  void ValueEnumerator::setInstructionID(const Instruction *I) { @@ -207,35 +207,48 @@ void ValueEnumerator::EnumerateValueSymbolTable(const ValueSymbolTable &VST) {      EnumerateValue(VI->getValue());  } -/// EnumerateMDSymbolTable - Insert all of the values in the specified metadata -/// table. -void ValueEnumerator::EnumerateMDSymbolTable(const MDSymbolTable &MST) { -  for (MDSymbolTable::const_iterator MI = MST.begin(), ME = MST.end(); -       MI != ME; ++MI) -    EnumerateValue(MI->getValue()); +/// EnumerateNamedMetadata - Insert all of the values referenced by +/// named metadata in the specified module. +void ValueEnumerator::EnumerateNamedMetadata(const Module *M) { +  for (Module::const_named_metadata_iterator I = M->named_metadata_begin(), +       E = M->named_metadata_end(); I != E; ++I) +    EnumerateNamedMDNode(I);  }  void ValueEnumerator::EnumerateNamedMDNode(const NamedMDNode *MD) { -  // Check to see if it's already in! -  unsigned &MDValueID = MDValueMap[MD]; -  if (MDValueID) { -    // Increment use count. -    MDValues[MDValueID-1].second++; -    return; +  for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i) +    EnumerateMetadata(MD->getOperand(i)); +} + +/// EnumerateMDNodeOperands - Enumerate all non-function-local values +/// and types referenced by the given MDNode. +void ValueEnumerator::EnumerateMDNodeOperands(const MDNode *N) { +  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { +    if (Value *V = N->getOperand(i)) { +      if (isa<MDNode>(V) || isa<MDString>(V)) +        EnumerateMetadata(V); +      else if (!isa<Instruction>(V) && !isa<Argument>(V)) +        EnumerateValue(V); +    } else +      EnumerateType(Type::getVoidTy(N->getContext()));    } +} + +void ValueEnumerator::EnumerateMetadata(const Value *MD) { +  assert((isa<MDNode>(MD) || isa<MDString>(MD)) && "Invalid metadata kind");    // Enumerate the type of this value.    EnumerateType(MD->getType()); -  for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i) -    if (MDNode *E = MD->getOperand(i)) -      EnumerateValue(E); -  MDValues.push_back(std::make_pair(MD, 1U)); -  MDValueMap[MD] = Values.size(); -} +  const MDNode *N = dyn_cast<MDNode>(MD); + +  // In the module-level pass, skip function-local nodes themselves, but +  // do walk their operands. +  if (N && N->isFunctionLocal() && N->getFunction()) { +    EnumerateMDNodeOperands(N); +    return; +  } -void ValueEnumerator::EnumerateMetadata(const Value *MD) { -  assert((isa<MDNode>(MD) || isa<MDString>(MD)) && "Invalid metadata kind");    // Check to see if it's already in!    unsigned &MDValueID = MDValueMap[MD];    if (MDValueID) { @@ -243,37 +256,52 @@ void ValueEnumerator::EnumerateMetadata(const Value *MD) {      MDValues[MDValueID-1].second++;      return;    } +  MDValues.push_back(std::make_pair(MD, 1U)); +  MDValueID = MDValues.size(); + +  // Enumerate all non-function-local operands. +  if (N) +    EnumerateMDNodeOperands(N); +} + +/// EnumerateFunctionLocalMetadataa - Incorporate function-local metadata +/// information reachable from the given MDNode. +void ValueEnumerator::EnumerateFunctionLocalMetadata(const MDNode *N) { +  assert(N->isFunctionLocal() && N->getFunction() && +         "EnumerateFunctionLocalMetadata called on non-function-local mdnode!");    // Enumerate the type of this value. -  EnumerateType(MD->getType()); +  EnumerateType(N->getType()); -  if (const MDNode *N = dyn_cast<MDNode>(MD)) { -    MDValues.push_back(std::make_pair(MD, 1U)); -    MDValueMap[MD] = MDValues.size(); -    MDValueID = MDValues.size(); -    for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { -      if (Value *V = N->getOperand(i)) -        EnumerateValue(V); -      else -        EnumerateType(Type::getVoidTy(MD->getContext())); -    } -    if (N->isFunctionLocal() && N->getFunction()) -      FunctionLocalMDs.push_back(N); +  // Check to see if it's already in! +  unsigned &MDValueID = MDValueMap[N]; +  if (MDValueID) { +    // Increment use count. +    MDValues[MDValueID-1].second++;      return;    } -   -  // Add the value. -  assert(isa<MDString>(MD) && "Unknown metadata kind"); -  MDValues.push_back(std::make_pair(MD, 1U)); +  MDValues.push_back(std::make_pair(N, 1U));    MDValueID = MDValues.size(); + +  // To incoroporate function-local information visit all function-local +  // MDNodes and all function-local values they reference. +  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) +    if (Value *V = N->getOperand(i)) { +      if (MDNode *O = dyn_cast<MDNode>(V)) { +        if (O->isFunctionLocal() && O->getFunction()) +          EnumerateFunctionLocalMetadata(O); +      } else if (isa<Instruction>(V) || isa<Argument>(V)) +        EnumerateValue(V); +    } + +  // Also, collect all function-local MDNodes for easy access. +  FunctionLocalMDs.push_back(N);  }  void ValueEnumerator::EnumerateValue(const Value *V) {    assert(!V->getType()->isVoidTy() && "Can't insert void values!"); -  if (isa<MDNode>(V) || isa<MDString>(V)) -    return EnumerateMetadata(V); -  else if (const NamedMDNode *NMD = dyn_cast<NamedMDNode>(V)) -    return EnumerateNamedMDNode(NMD); +  assert(!isa<MDNode>(V) && !isa<MDString>(V) && +         "EnumerateValue doesn't handle Metadata!");    // Check to see if it's already in!    unsigned &ValueID = ValueMap[V]; @@ -359,7 +387,7 @@ void ValueEnumerator::EnumerateOperandType(const Value *V) {        // blockaddress.        if (isa<BasicBlock>(Op)) continue; -      EnumerateOperandType(cast<Constant>(Op)); +      EnumerateOperandType(Op);      }      if (const MDNode *N = dyn_cast<MDNode>(V)) { @@ -368,7 +396,7 @@ void ValueEnumerator::EnumerateOperandType(const Value *V) {            EnumerateOperandType(Elem);      }    } else if (isa<MDString>(V) || isa<MDNode>(V)) -    EnumerateValue(V); +    EnumerateMetadata(V);  }  void ValueEnumerator::EnumerateAttributes(const AttrListPtr &PAL) { @@ -386,10 +414,11 @@ void ValueEnumerator::EnumerateAttributes(const AttrListPtr &PAL) {  void ValueEnumerator::incorporateFunction(const Function &F) {    InstructionCount = 0;    NumModuleValues = Values.size(); +  NumModuleMDValues = MDValues.size();    // Adding function arguments to the value table. -  for(Function::const_arg_iterator I = F.arg_begin(), E = F.arg_end(); -      I != E; ++I) +  for (Function::const_arg_iterator I = F.arg_begin(), E = F.arg_end(); +       I != E; ++I)      EnumerateValue(I);    FirstFuncConstantID = Values.size(); @@ -416,7 +445,6 @@ void ValueEnumerator::incorporateFunction(const Function &F) {    FirstInstID = Values.size(); -  FunctionLocalMDs.clear();    SmallVector<MDNode *, 8> FnLocalMDVector;    // Add all of the instructions.    for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { @@ -428,6 +456,15 @@ void ValueEnumerator::incorporateFunction(const Function &F) {              // Enumerate metadata after the instructions they might refer to.              FnLocalMDVector.push_back(MD);        } + +      SmallVector<std::pair<unsigned, MDNode*>, 8> MDs; +      I->getAllMetadataOtherThanDebugLoc(MDs); +      for (unsigned i = 0, e = MDs.size(); i != e; ++i) { +        MDNode *N = MDs[i].second; +        if (N->isFunctionLocal() && N->getFunction()) +          FnLocalMDVector.push_back(N); +      } +                if (!I->getType()->isVoidTy())          EnumerateValue(I);      } @@ -435,18 +472,22 @@ void ValueEnumerator::incorporateFunction(const Function &F) {    // Add all of the function-local metadata.    for (unsigned i = 0, e = FnLocalMDVector.size(); i != e; ++i) -    EnumerateOperandType(FnLocalMDVector[i]); +    EnumerateFunctionLocalMetadata(FnLocalMDVector[i]);  }  void ValueEnumerator::purgeFunction() {    /// Remove purged values from the ValueMap.    for (unsigned i = NumModuleValues, e = Values.size(); i != e; ++i)      ValueMap.erase(Values[i].first); +  for (unsigned i = NumModuleMDValues, e = MDValues.size(); i != e; ++i) +    MDValueMap.erase(MDValues[i].first);    for (unsigned i = 0, e = BasicBlocks.size(); i != e; ++i)      ValueMap.erase(BasicBlocks[i]);    Values.resize(NumModuleValues); +  MDValues.resize(NumModuleMDValues);    BasicBlocks.clear(); +  FunctionLocalMDs.clear();  }  static void IncorporateFunctionInfoGlobalBBIDs(const Function *F, diff --git a/lib/Bitcode/Writer/ValueEnumerator.h b/lib/Bitcode/Writer/ValueEnumerator.h index 2b9b15fa5a77..cd1d2371b701 100644 --- a/lib/Bitcode/Writer/ValueEnumerator.h +++ b/lib/Bitcode/Writer/ValueEnumerator.h @@ -72,6 +72,11 @@ private:    /// When a function is incorporated, this is the size of the Values list    /// before incorporation.    unsigned NumModuleValues; + +  /// When a function is incorporated, this is the size of the MDValues list +  /// before incorporation. +  unsigned NumModuleMDValues; +    unsigned FirstFuncConstantID;    unsigned FirstInstID; @@ -132,7 +137,9 @@ public:  private:    void OptimizeConstants(unsigned CstStart, unsigned CstEnd); +  void EnumerateMDNodeOperands(const MDNode *N);    void EnumerateMetadata(const Value *MD); +  void EnumerateFunctionLocalMetadata(const MDNode *N);    void EnumerateNamedMDNode(const NamedMDNode *NMD);    void EnumerateValue(const Value *V);    void EnumerateType(const Type *T); @@ -141,7 +148,7 @@ private:    void EnumerateTypeSymbolTable(const TypeSymbolTable &ST);    void EnumerateValueSymbolTable(const ValueSymbolTable &ST); -  void EnumerateMDSymbolTable(const MDSymbolTable &ST); +  void EnumerateNamedMetadata(const Module *M);  };  } // End llvm namespace | 
