diff options
| author | Roman Divacky <rdivacky@FreeBSD.org> | 2010-04-03 07:51:10 +0000 | 
|---|---|---|
| committer | Roman Divacky <rdivacky@FreeBSD.org> | 2010-04-03 07:51:10 +0000 | 
| commit | b5efedaf2ab20d844d5a21cdef76b55acbf4f01c (patch) | |
| tree | ba3309de92b14839b2ca6ca0c6d3b39714f95d4c /lib/Bitcode | |
| parent | 104bd8179fb5f6551c65c94ebcd0a4918b060189 (diff) | |
Notes
Diffstat (limited to 'lib/Bitcode')
| -rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 44 | ||||
| -rw-r--r-- | lib/Bitcode/Writer/BitcodeWriter.cpp | 44 | ||||
| -rw-r--r-- | lib/Bitcode/Writer/ValueEnumerator.cpp | 9 | 
3 files changed, 85 insertions, 12 deletions
| diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 76d112e045a3..69adead4ba8e 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1644,6 +1644,8 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {    BasicBlock *CurBB = 0;    unsigned CurBBNo = 0; +  DebugLoc LastLoc; +      // Read all the records.    SmallVector<uint64_t, 64> Record;    while (1) { @@ -1699,6 +1701,46 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {        CurBB = FunctionBBs[0];        continue; +         +    case bitc::FUNC_CODE_DEBUG_LOC_AGAIN:  // DEBUG_LOC_AGAIN +      // This record indicates that the last instruction is at the same +      // location as the previous instruction with a location. +      I = 0; +         +      // Get the last instruction emitted. +      if (CurBB && !CurBB->empty()) +        I = &CurBB->back(); +      else if (CurBBNo && FunctionBBs[CurBBNo-1] && +               !FunctionBBs[CurBBNo-1]->empty()) +        I = &FunctionBBs[CurBBNo-1]->back(); +         +      if (I == 0) return Error("Invalid DEBUG_LOC_AGAIN record"); +      I->setDebugLoc(LastLoc); +      I = 0; +      continue; +         +    case bitc::FUNC_CODE_DEBUG_LOC: {      // DEBUG_LOC: [line, col, scope, ia] +      I = 0;     // Get the last instruction emitted. +      if (CurBB && !CurBB->empty()) +        I = &CurBB->back(); +      else if (CurBBNo && FunctionBBs[CurBBNo-1] && +               !FunctionBBs[CurBBNo-1]->empty()) +        I = &FunctionBBs[CurBBNo-1]->back(); +      if (I == 0 || Record.size() < 4) +        return Error("Invalid FUNC_CODE_DEBUG_LOC record"); +       +      unsigned Line = Record[0], Col = Record[1]; +      unsigned ScopeID = Record[2], IAID = Record[3]; +       +      MDNode *Scope = 0, *IA = 0; +      if (ScopeID) Scope = cast<MDNode>(MDValueList.getValueFwdRef(ScopeID-1)); +      if (IAID)    IA = cast<MDNode>(MDValueList.getValueFwdRef(IAID-1)); +      LastLoc = DebugLoc::get(Line, Col, Scope, IA); +      I->setDebugLoc(LastLoc); +      I = 0; +      continue; +    } +      case bitc::FUNC_CODE_INST_BINOP: {    // BINOP: [opval, ty, opval, opcode]        unsigned OpNum = 0;        Value *LHS, *RHS; @@ -2285,8 +2327,6 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {    // See if anything took the address of blocks in this function.  If so,    // resolve them now. -  /// BlockAddrFwdRefs - These are blockaddr references to basic blocks.  These -  /// are resolved lazily when functions are loaded.    DenseMap<Function*, std::vector<BlockAddrRefTy> >::iterator BAFRI =      BlockAddrFwdRefs.find(F);    if (BAFRI != BlockAddrFwdRefs.end()) { diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index 1f69e1685166..9bda6dca3d5e 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -596,7 +596,8 @@ static void WriteFunctionLocalMetadata(const Function &F,  static void WriteMetadataAttachment(const Function &F,                                      const ValueEnumerator &VE,                                      BitstreamWriter &Stream) { -  bool StartedMetadataBlock = false; +  Stream.EnterSubblock(bitc::METADATA_ATTACHMENT_ID, 3); +    SmallVector<uint64_t, 64> Record;    // Write metadata attachments @@ -607,7 +608,7 @@ static void WriteMetadataAttachment(const Function &F,      for (BasicBlock::const_iterator I = BB->begin(), E = BB->end();           I != E; ++I) {        MDs.clear(); -      I->getAllMetadata(MDs); +      I->getAllMetadataOtherThanDebugLoc(MDs);        // If no metadata, ignore instruction.        if (MDs.empty()) continue; @@ -618,16 +619,11 @@ static void WriteMetadataAttachment(const Function &F,          Record.push_back(MDs[i].first);          Record.push_back(VE.getValueID(MDs[i].second));        } -      if (!StartedMetadataBlock)  { -        Stream.EnterSubblock(bitc::METADATA_ATTACHMENT_ID, 3); -        StartedMetadataBlock = true; -      }        Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);        Record.clear();      } -  if (StartedMetadataBlock) -    Stream.ExitBlock(); +  Stream.ExitBlock();  }  static void WriteModuleMetadataStore(const Module *M, BitstreamWriter &Stream) { @@ -1256,19 +1252,49 @@ static void WriteFunction(const Function &F, ValueEnumerator &VE,    // Keep a running idea of what the instruction ID is.    unsigned InstID = CstEnd; +  bool NeedsMetadataAttachment = false; +   +  DebugLoc LastDL; +      // Finally, emit all the instructions, in order.    for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB)      for (BasicBlock::const_iterator I = BB->begin(), E = BB->end();           I != E; ++I) {        WriteInstruction(*I, InstID, VE, Stream, Vals); +              if (!I->getType()->isVoidTy())          ++InstID; +       +      // If the instruction has metadata, write a metadata attachment later. +      NeedsMetadataAttachment |= I->hasMetadataOtherThanDebugLoc(); +       +      // If the instruction has a debug location, emit it. +      DebugLoc DL = I->getDebugLoc(); +      if (DL.isUnknown()) { +        // nothing todo. +      } else if (DL == LastDL) { +        // Just repeat the same debug loc as last time. +        Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC_AGAIN, Vals); +      } else { +        MDNode *Scope, *IA; +        DL.getScopeAndInlinedAt(Scope, IA, I->getContext()); +         +        Vals.push_back(DL.getLine()); +        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); +        Vals.clear(); +         +        LastDL = DL; +      }      }    // Emit names for all the instructions etc.    WriteValueSymbolTable(F.getValueSymbolTable(), VE, Stream); -  WriteMetadataAttachment(F, VE, Stream); +  if (NeedsMetadataAttachment) +    WriteMetadataAttachment(F, VE, Stream);    VE.purgeFunction();    Stream.ExitBlock();  } diff --git a/lib/Bitcode/Writer/ValueEnumerator.cpp b/lib/Bitcode/Writer/ValueEnumerator.cpp index aa4c3afab40e..d2baec770503 100644 --- a/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -104,9 +104,16 @@ ValueEnumerator::ValueEnumerator(const Module *M) {          // Enumerate metadata attached with this instruction.          MDs.clear(); -        I->getAllMetadata(MDs); +        I->getAllMetadataOtherThanDebugLoc(MDs);          for (unsigned i = 0, e = MDs.size(); i != e; ++i)            EnumerateMetadata(MDs[i].second); +         +        if (!I->getDebugLoc().isUnknown()) { +          MDNode *Scope, *IA; +          I->getDebugLoc().getScopeAndInlinedAt(Scope, IA, I->getContext()); +          if (Scope) EnumerateMetadata(Scope); +          if (IA) EnumerateMetadata(IA); +        }        }    } | 
