mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:43:36 +01:00
Modify emitTypeInformation to use MemoryTypeTableBuilder
A baby step toward translating DIType records to CodeView. This does not (yet) combine the record length with the record data. I'm going back and forth trying to determine if that's a good idea. llvm-svn: 270106
This commit is contained in:
parent
84afa7c057
commit
f3a3c62ffb
@ -261,55 +261,30 @@ 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.
|
||||
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);
|
||||
ArrayRef<TypeIndex> NoArgs;
|
||||
ArgListRecord ArgListRec(TypeRecordKind::ArgList, NoArgs);
|
||||
TypeIndex ArgListIndex = TypeTable.writeArgList(ArgListRec);
|
||||
|
||||
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);
|
||||
ProcedureRecord Procedure(TypeIndex::Void(), CallingConvention::NearC,
|
||||
FunctionOptions::None, 0, ArgListIndex);
|
||||
TypeIndex VoidFnTyIdx = TypeTable.writeProcedure(Procedure);
|
||||
|
||||
// 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();
|
||||
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);
|
||||
FuncIdRecord FuncId(ParentScope, VoidFnTyIdx, DisplayName);
|
||||
TypeTable.writeFuncId(FuncId);
|
||||
}
|
||||
|
||||
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() {
|
||||
|
@ -20,6 +20,7 @@
|
||||
#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"
|
||||
@ -34,6 +35,7 @@ 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 {
|
||||
|
Loading…
Reference in New Issue
Block a user