summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp59
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h2
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 {
OpenPOWER on IntegriCloud