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/Writer/BitcodeWriter.cpp | |
| parent | 6144c1de6a7674dad94290650e4e14f24d42e421 (diff) | |
Notes
Diffstat (limited to 'lib/Bitcode/Writer/BitcodeWriter.cpp')
| -rw-r--r-- | lib/Bitcode/Writer/BitcodeWriter.cpp | 136 | 
1 files changed, 54 insertions, 82 deletions
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)  | 
