diff options
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 59 | ||||
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h | 2 |
2 files changed, 42 insertions, 19 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 75647e6a64c..b5c796a01bd 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -261,30 +261,55 @@ void CodeViewDebug::emitTypeInformation() { // This type info currently only holds function ids for use with inline call // frame info. All functions are assigned a simple 'void ()' type. Emit that // type here. - ArrayRef<TypeIndex> NoArgs; - ArgListRecord ArgListRec(TypeRecordKind::ArgList, NoArgs); - TypeIndex ArgListIndex = TypeTable.writeArgList(ArgListRec); + unsigned ArgListIndex = getNextTypeIndex(); + OS.AddComment("Type record length"); + OS.EmitIntValue(ArgListRecord::getLayoutSize(), 2); + OS.AddComment("Leaf type: LF_ARGLIST"); + OS.EmitIntValue(LF_ARGLIST, 2); + OS.AddComment("Number of arguments"); + OS.EmitIntValue(0, 4); - ProcedureRecord Procedure(TypeIndex::Void(), CallingConvention::NearC, - FunctionOptions::None, 0, ArgListIndex); - TypeIndex VoidFnTyIdx = TypeTable.writeProcedure(Procedure); + unsigned VoidFnTyIdx = getNextTypeIndex(); + OS.AddComment("Type record length"); + OS.EmitIntValue(ProcedureRecord::getLayoutSize(), 2); + OS.AddComment("Leaf type: LF_PROCEDURE"); + OS.EmitIntValue(LF_PROCEDURE, 2); + OS.AddComment("Return type index"); + OS.EmitIntValue(TypeIndex::Void().getIndex(), 4); + OS.AddComment("Calling convention"); + OS.EmitIntValue(char(CallingConvention::NearC), 1); + OS.AddComment("Function options"); + OS.EmitIntValue(char(FunctionOptions::None), 1); + OS.AddComment("# of parameters"); + OS.EmitIntValue(0, 2); + OS.AddComment("Argument list type index"); + OS.EmitIntValue(ArgListIndex, 4); // Emit LF_FUNC_ID records for all inlined subprograms to the type stream. // Allocate one type index for each func id. + unsigned NextIdx = getNextTypeIndex(InlinedSubprograms.size()); + (void)NextIdx; + assert(NextIdx == FuncIdTypeIndexStart && "func id type indices broken"); for (auto *SP : InlinedSubprograms) { - TypeIndex ParentScope = TypeIndex(0); StringRef DisplayName = SP->getDisplayName(); - FuncIdRecord FuncId(ParentScope, VoidFnTyIdx, DisplayName); - TypeTable.writeFuncId(FuncId); + OS.AddComment("Type record length"); + MCSymbol *FuncBegin = MMI->getContext().createTempSymbol(), + *FuncEnd = MMI->getContext().createTempSymbol(); + OS.emitAbsoluteSymbolDiff(FuncEnd, FuncBegin, 2); + OS.EmitLabel(FuncBegin); + OS.AddComment("Leaf type: LF_FUNC_ID"); + OS.EmitIntValue(LF_FUNC_ID, 2); + + OS.AddComment("Scope type index"); + OS.EmitIntValue(0, 4); + OS.AddComment("Function type"); + OS.EmitIntValue(VoidFnTyIdx, 4); + { + OS.AddComment("Function name"); + emitNullTerminatedSymbolName(OS, DisplayName); + } + OS.EmitLabel(FuncEnd); } - - TypeTable.ForEachRecord( - [&](TypeIndex Index, const MemoryTypeTableBuilder::Record *R) { - OS.AddComment("Type record length"); - OS.EmitIntValue(R->size(), 2); - OS.AddComment("Type record data"); - OS.EmitBytes(StringRef(R->data(), R->size())); - }); } void CodeViewDebug::emitInlineeFuncIdsAndLines() { diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h index 3b1a629cf22..3cc11728504 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h @@ -20,7 +20,6 @@ #include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineModuleInfo.h" -#include "llvm/DebugInfo/CodeView/MemoryTypeTableBuilder.h" #include "llvm/DebugInfo/CodeView/TypeIndex.h" #include "llvm/IR/DebugInfo.h" #include "llvm/IR/DebugLoc.h" @@ -35,7 +34,6 @@ class LexicalScope; /// \brief Collects and handles line tables information in a CodeView format. class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase { MCStreamer &OS; - codeview::MemoryTypeTableBuilder TypeTable; /// Represents the most general definition range. struct LocalVarDefRange { |