mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[codeview] Add support for label type records
MASM can produce these type records. llvm-svn: 299388
This commit is contained in:
parent
3d76c6d2c8
commit
b92def0094
@ -275,6 +275,12 @@ enum class MethodOptions : uint16_t {
|
||||
};
|
||||
CV_DEFINE_ENUM_CLASS_FLAGS_OPERATORS(MethodOptions)
|
||||
|
||||
/// Equivalent to CV_LABEL_TYPE_e.
|
||||
enum class LabelType : uint16_t {
|
||||
Near = 0x0,
|
||||
Far = 0x4,
|
||||
};
|
||||
|
||||
/// Equivalent to CV_modifier_t.
|
||||
/// TODO: Add flag for _Atomic modifier
|
||||
enum class ModifierOptions : uint16_t {
|
||||
|
@ -199,6 +199,16 @@ public:
|
||||
int32_t ThisPointerAdjustment;
|
||||
};
|
||||
|
||||
// LF_LABEL
|
||||
class LabelRecord : public TypeRecord {
|
||||
public:
|
||||
explicit LabelRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
|
||||
|
||||
LabelRecord(LabelType Mode) : TypeRecord(TypeRecordKind::Label), Mode(Mode) {}
|
||||
|
||||
LabelType Mode;
|
||||
};
|
||||
|
||||
// LF_MFUNC_ID
|
||||
class MemberFuncIdRecord : public TypeRecord {
|
||||
public:
|
||||
|
@ -41,6 +41,7 @@ TYPE_RECORD(LF_POINTER, 0x1002, Pointer)
|
||||
TYPE_RECORD(LF_MODIFIER, 0x1001, Modifier)
|
||||
TYPE_RECORD(LF_PROCEDURE, 0x1008, Procedure)
|
||||
TYPE_RECORD(LF_MFUNCTION, 0x1009, MemberFunction)
|
||||
TYPE_RECORD(LF_LABEL, 0x000e, Label)
|
||||
TYPE_RECORD(LF_ARGLIST, 0x1201, ArgList)
|
||||
|
||||
TYPE_RECORD(LF_FIELDLIST, 0x1203, FieldList)
|
||||
@ -101,7 +102,6 @@ CV_TYPE(LF_MFUNCTION_16t, 0x0009)
|
||||
CV_TYPE(LF_COBOL0_16t, 0x000b)
|
||||
CV_TYPE(LF_COBOL1, 0x000c)
|
||||
CV_TYPE(LF_BARRAY_16t, 0x000d)
|
||||
CV_TYPE(LF_LABEL, 0x000e)
|
||||
CV_TYPE(LF_NULLLEAF, 0x000f) // LF_NULL
|
||||
CV_TYPE(LF_NOTTRAN, 0x0010)
|
||||
CV_TYPE(LF_DIMARRAY_16t, 0x0011)
|
||||
|
@ -299,6 +299,10 @@ Error TypeDatabaseVisitor::visitKnownRecord(CVType &CVR, BuildInfoRecord &BI) {
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
Error TypeDatabaseVisitor::visitKnownRecord(CVType &CVR, LabelRecord &R) {
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
Error TypeDatabaseVisitor::visitKnownMember(CVMemberRecord &CVR,
|
||||
VFPtrRecord &VFP) {
|
||||
return Error::success();
|
||||
|
@ -146,6 +146,10 @@ static const EnumEntry<uint8_t> FunctionOptionEnum[] = {
|
||||
ENUM_ENTRY(FunctionOptions, ConstructorWithVirtualBases),
|
||||
};
|
||||
|
||||
static const EnumEntry<uint16_t> LabelTypeEnum[] = {
|
||||
ENUM_ENTRY(LabelType, Near), ENUM_ENTRY(LabelType, Far),
|
||||
};
|
||||
|
||||
#undef ENUM_ENTRY
|
||||
|
||||
static StringRef getLeafTypeName(TypeLeafKind LT) {
|
||||
@ -547,3 +551,8 @@ Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
|
||||
printTypeIndex("ContinuationIndex", Cont.getContinuationIndex());
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, LabelRecord &LR) {
|
||||
W->printEnum("Mode", uint16_t(LR.Mode), makeArrayRef(LabelTypeEnum));
|
||||
return Error::success();
|
||||
}
|
||||
|
@ -380,6 +380,11 @@ Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
Error TypeRecordMapping::visitKnownRecord(CVType &CVR, LabelRecord &Record) {
|
||||
error(IO.mapEnum(Record.Mode));
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
|
||||
BaseClassRecord &Record) {
|
||||
error(IO.mapInteger(Record.Attrs.Attrs));
|
||||
|
@ -301,6 +301,10 @@ Error TypeStreamMerger::visitKnownRecord(CVType &, TypeServer2Record &R) {
|
||||
return writeRecord(R, true);
|
||||
}
|
||||
|
||||
Error TypeStreamMerger::visitKnownRecord(CVType &, LabelRecord &R) {
|
||||
return writeRecord(R, true);
|
||||
}
|
||||
|
||||
Error TypeStreamMerger::visitKnownRecord(CVType &, VFTableRecord &R) {
|
||||
bool Success = true;
|
||||
Success &= remapIndex(R.CompleteClass);
|
||||
|
BIN
test/tools/llvm-readobj/Inputs/codeview-label.obj
Normal file
BIN
test/tools/llvm-readobj/Inputs/codeview-label.obj
Normal file
Binary file not shown.
16
test/tools/llvm-readobj/codeview-label.test
Normal file
16
test/tools/llvm-readobj/codeview-label.test
Normal file
@ -0,0 +1,16 @@
|
||||
; RUN: llvm-readobj -codeview %S/Inputs/codeview-label.obj | FileCheck %s
|
||||
|
||||
; CHECK-LABEL: Label (0x1000) {
|
||||
; CHECK-NEXT: TypeLeafKind: LF_LABEL (0xE)
|
||||
; CHECK-NEXT: Mode: Near (0x0)
|
||||
; CHECK-NEXT: }
|
||||
|
||||
; To reproduce codeview-label.obj:
|
||||
; $ cat codeview-label.asm
|
||||
; .model flat, C
|
||||
; .code
|
||||
; public foo
|
||||
; foo:
|
||||
; ret
|
||||
; end
|
||||
; $ ml -c -Zi codeview-label.asm
|
@ -194,6 +194,13 @@ template <> struct ScalarEnumerationTraits<WindowsRTClassKind> {
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct ScalarEnumerationTraits<LabelType> {
|
||||
static void enumeration(IO &IO, LabelType &Value) {
|
||||
IO.enumCase(Value, "Near", LabelType::Near);
|
||||
IO.enumCase(Value, "Far", LabelType::Far);
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct ScalarBitSetTraits<PointerOptions> {
|
||||
static void bitset(IO &IO, PointerOptions &Options) {
|
||||
IO.bitSetCase(Options, "None", PointerOptions::None);
|
||||
@ -431,6 +438,10 @@ void MappingTraits<BuildInfoRecord>::mapping(IO &IO, BuildInfoRecord &Args) {
|
||||
IO.mapRequired("ArgIndices", Args.ArgIndices);
|
||||
}
|
||||
|
||||
void MappingTraits<LabelRecord>::mapping(IO &IO, LabelRecord &R) {
|
||||
IO.mapRequired("Mode", R.Mode);
|
||||
}
|
||||
|
||||
void MappingTraits<NestedTypeRecord>::mapping(IO &IO,
|
||||
NestedTypeRecord &Nested) {
|
||||
IO.mapRequired("Type", Nested.Type);
|
||||
|
Loading…
Reference in New Issue
Block a user