diff options
author | Nilanjana Basu <nilanjana.basu87@gmail.com> | 2019-07-03 00:26:23 +0000 |
---|---|---|
committer | Nilanjana Basu <nilanjana.basu87@gmail.com> | 2019-07-03 00:26:23 +0000 |
commit | 2082bf28ebea76cc187b508f801122866420d9ff (patch) | |
tree | 856ccf456733d3c5de5c4e468200767230af3896 /llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | |
parent | da1dfecd32f405d00b2432acd9fdd24526e5614f (diff) | |
download | bcm5719-llvm-2082bf28ebea76cc187b508f801122866420d9ff.tar.gz bcm5719-llvm-2082bf28ebea76cc187b508f801122866420d9ff.zip |
Changing CodeView debug info type record representation in assembly files to make it more human-readable & editable
llvm-svn: 364982
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 9f8ed86b50e..61fe6984338 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -51,6 +51,7 @@ #include "llvm/DebugInfo/CodeView/TypeIndex.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" #include "llvm/DebugInfo/CodeView/TypeTableCollection.h" +#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/DebugInfoMetadata.h" @@ -94,6 +95,24 @@ using namespace llvm; using namespace llvm::codeview; +namespace { +class CVMCAdapter : public CodeViewRecordStreamer { +public: + CVMCAdapter(MCStreamer &OS) : OS(&OS) {} + + void EmitBytes(StringRef Data) { OS->EmitBytes(Data); } + + void EmitIntValue(uint64_t Value, unsigned Size) { + OS->EmitIntValue(Value, Size); + } + + void EmitBinaryData(StringRef Data) { OS->EmitBinaryData(Data); } + +private: + MCStreamer *OS = nullptr; +}; +} // namespace + static CPUType mapArchToCVCPUType(Triple::ArchType Type) { switch (Type) { case Triple::ArchType::x86: @@ -617,26 +636,40 @@ void CodeViewDebug::emitTypeInformation() { // This will fail if the record data is invalid. CVType Record = Table.getType(*B); + TypeVisitorCallbackPipeline Pipeline; + CVMCAdapter CVMCOS(OS); + TypeRecordMapping typeMapping(CVMCOS); + SmallString<512> CommentBlock; + raw_svector_ostream CommentOS(CommentBlock); + if (OS.isVerboseAsm()) { // Emit a block comment describing the type record for readability. - SmallString<512> CommentBlock; - raw_svector_ostream CommentOS(CommentBlock); ScopedPrinter SP(CommentOS); SP.setPrefix(CommentPrefix); TypeDumpVisitor TDV(Table, &SP, false); + Pipeline.addCallbackToPipeline(TDV); + } + Pipeline.addCallbackToPipeline(typeMapping); - Error E = codeview::visitTypeRecord(Record, *B, TDV); - if (E) { - logAllUnhandledErrors(std::move(E), errs(), "error: "); - llvm_unreachable("produced malformed type record"); - } + auto RecordLen = Record.length(); + auto RecordKind = Record.kind(); + OS.EmitIntValue(RecordLen - 2, 2); + OS.EmitIntValue(RecordKind, sizeof(RecordKind)); + + Error E = codeview::visitTypeRecord(Record, *B, Pipeline); + + if (E) { + logAllUnhandledErrors(std::move(E), errs(), "error: "); + llvm_unreachable("produced malformed type record"); + } + + if (OS.isVerboseAsm()) { // emitRawComment will insert its own tab and comment string before // the first line, so strip off our first one. It also prints its own // newline. OS.emitRawComment( CommentOS.str().drop_front(CommentPrefix.size() - 1).rtrim()); } - OS.EmitBinaryData(Record.str_data()); B = Table.getNext(*B); } } |