diff --git a/llvm/include/llvm/Bitcode/LLVMBitCodes.h b/llvm/include/llvm/Bitcode/LLVMBitCodes.h index a980df811040..de9b64d4a46c 100644 --- a/llvm/include/llvm/Bitcode/LLVMBitCodes.h +++ b/llvm/include/llvm/Bitcode/LLVMBitCodes.h @@ -240,7 +240,10 @@ namespace bitc { // new select on i1 or [N x i1] FUNC_CODE_INST_VSELECT = 29, // VSELECT: [ty,opval,opval,predty,pred] FUNC_CODE_INST_INBOUNDS_GEP= 30, // INBOUNDS_GEP: [n x operands] - FUNC_CODE_INST_INDIRECTBR = 31 // INDIRECTBR: [opty, op0, op1, ...] + FUNC_CODE_INST_INDIRECTBR = 31, // INDIRECTBR: [opty, op0, op1, ...] + + FUNC_CODE_DEBUG_LOC = 32, // DEBUG_LOC: [Line,Col,ScopeVal, IAVal] + FUNC_CODE_DEBUG_LOC_AGAIN = 33 // DEBUG_LOC_AGAIN }; } // End bitc namespace } // End llvm namespace diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 76d112e045a3..69adead4ba8e 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/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 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(MDValueList.getValueFwdRef(ScopeID-1)); + if (IAID) IA = cast(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 >::iterator BAFRI = BlockAddrFwdRefs.find(F); if (BAFRI != BlockAddrFwdRefs.end()) { diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 1f69e1685166..9bda6dca3d5e 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/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 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/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp b/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp index aa4c3afab40e..d2baec770503 100644 --- a/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/llvm/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); + } } } diff --git a/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp b/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp index d012455fd8c0..732ff11fe46d 100644 --- a/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp +++ b/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp @@ -237,6 +237,8 @@ static const char *GetCodeName(unsigned CodeID, unsigned BlockID, case bitc::FUNC_CODE_INST_INSERTVAL: return "INST_INSERTVAL"; case bitc::FUNC_CODE_INST_CMP2: return "INST_CMP2"; case bitc::FUNC_CODE_INST_VSELECT: return "INST_VSELECT"; + case bitc::FUNC_CODE_DEBUG_LOC: return "DEBUG_LOC"; + case bitc::FUNC_CODE_DEBUG_LOC_AGAIN: return "DEBUG_LOC_AGAIN"; } case bitc::TYPE_SYMTAB_BLOCK_ID: switch (CodeID) {