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/Reader/BitcodeReader.cpp | |
| parent | 104bd8179fb5f6551c65c94ebcd0a4918b060189 (diff) | |
Notes
Diffstat (limited to 'lib/Bitcode/Reader/BitcodeReader.cpp')
| -rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 44 | 
1 files changed, 42 insertions, 2 deletions
| diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 76d112e045a3f..69adead4ba8ed 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()) { | 
