diff options
Diffstat (limited to 'include/llvm/DebugInfo/CodeView')
-rw-r--r-- | include/llvm/DebugInfo/CodeView/CVDebugRecord.h | 55 | ||||
-rw-r--r-- | include/llvm/DebugInfo/CodeView/CVRecord.h | 24 | ||||
-rw-r--r-- | include/llvm/DebugInfo/CodeView/CVTypeVisitor.h | 2 | ||||
-rw-r--r-- | include/llvm/DebugInfo/CodeView/CodeView.h | 6 | ||||
-rw-r--r-- | include/llvm/DebugInfo/CodeView/CodeViewRegisters.def | 448 | ||||
-rw-r--r-- | include/llvm/DebugInfo/CodeView/CodeViewTypes.def | 4 | ||||
-rw-r--r-- | include/llvm/DebugInfo/CodeView/DebugStringTableSubsection.h | 16 | ||||
-rw-r--r-- | include/llvm/DebugInfo/CodeView/GlobalTypeTableBuilder.h | 17 | ||||
-rw-r--r-- | include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h | 2 | ||||
-rw-r--r-- | include/llvm/DebugInfo/CodeView/TypeHashing.h | 11 | ||||
-rw-r--r-- | include/llvm/DebugInfo/CodeView/TypeRecord.h | 31 | ||||
-rw-r--r-- | include/llvm/DebugInfo/CodeView/TypeStreamMerger.h | 6 |
12 files changed, 323 insertions, 299 deletions
diff --git a/include/llvm/DebugInfo/CodeView/CVDebugRecord.h b/include/llvm/DebugInfo/CodeView/CVDebugRecord.h deleted file mode 100644 index 5a0bb4266ba2..000000000000 --- a/include/llvm/DebugInfo/CodeView/CVDebugRecord.h +++ /dev/null @@ -1,55 +0,0 @@ -//===- CVDebugRecord.h ------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_DEBUGINFO_CODEVIEW_CVDEBUGRECORD_H -#define LLVM_DEBUGINFO_CODEVIEW_CVDEBUGRECORD_H - -#include "llvm/Support/Endian.h" - -namespace llvm { -namespace OMF { -struct Signature { - enum ID : uint32_t { - PDB70 = 0x53445352, // RSDS - PDB20 = 0x3031424e, // NB10 - CV50 = 0x3131424e, // NB11 - CV41 = 0x3930424e, // NB09 - }; - - support::ulittle32_t CVSignature; - support::ulittle32_t Offset; -}; -} - -namespace codeview { -struct PDB70DebugInfo { - support::ulittle32_t CVSignature; - uint8_t Signature[16]; - support::ulittle32_t Age; - // char PDBFileName[]; -}; - -struct PDB20DebugInfo { - support::ulittle32_t CVSignature; - support::ulittle32_t Offset; - support::ulittle32_t Signature; - support::ulittle32_t Age; - // char PDBFileName[]; -}; - -union DebugInfo { - struct OMF::Signature Signature; - struct PDB20DebugInfo PDB20; - struct PDB70DebugInfo PDB70; -}; -} -} - -#endif - diff --git a/include/llvm/DebugInfo/CodeView/CVRecord.h b/include/llvm/DebugInfo/CodeView/CVRecord.h index 9f3a753ad1ae..9dbeb438f4ae 100644 --- a/include/llvm/DebugInfo/CodeView/CVRecord.h +++ b/include/llvm/DebugInfo/CodeView/CVRecord.h @@ -61,6 +61,30 @@ template <typename Kind> struct RemappedRecord { SmallVector<std::pair<uint32_t, TypeIndex>, 8> Mappings; }; +template <typename Record, typename Func> +Error forEachCodeViewRecord(ArrayRef<uint8_t> StreamBuffer, Func F) { + while (!StreamBuffer.empty()) { + if (StreamBuffer.size() < sizeof(RecordPrefix)) + return make_error<CodeViewError>(cv_error_code::corrupt_record); + + const RecordPrefix *Prefix = + reinterpret_cast<const RecordPrefix *>(StreamBuffer.data()); + + size_t RealLen = Prefix->RecordLen + 2; + if (StreamBuffer.size() < RealLen) + return make_error<CodeViewError>(cv_error_code::corrupt_record); + + ArrayRef<uint8_t> Data = StreamBuffer.take_front(RealLen); + StreamBuffer = StreamBuffer.drop_front(RealLen); + + Record R(static_cast<decltype(Record::Type)>((uint16_t)Prefix->RecordKind), + Data); + if (auto EC = F(R)) + return EC; + } + return Error::success(); +} + /// Read a complete record from a stream at a random offset. template <typename Kind> inline Expected<CVRecord<Kind>> readCVRecordFromStream(BinaryStreamRef Stream, diff --git a/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h b/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h index df55e181364c..b765ba1abb4d 100644 --- a/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h +++ b/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h @@ -20,7 +20,7 @@ class TypeCollection; class TypeVisitorCallbacks; enum VisitorDataSource { - VDS_BytesPresent, // The record bytes are passed into the the visitation + VDS_BytesPresent, // The record bytes are passed into the visitation // function. The algorithm should first deserialize them // before passing them on through the pipeline. VDS_BytesExternal // The record bytes are not present, and it is the diff --git a/include/llvm/DebugInfo/CodeView/CodeView.h b/include/llvm/DebugInfo/CodeView/CodeView.h index 1a4f510c24ab..4ce9f68cffd9 100644 --- a/include/llvm/DebugInfo/CodeView/CodeView.h +++ b/include/llvm/DebugInfo/CodeView/CodeView.h @@ -22,8 +22,8 @@ namespace llvm { namespace codeview { -/// Distinguishes individual records in .debug$T section or PDB type stream. The -/// documentation and headers talk about this as the "leaf" type. +/// Distinguishes individual records in .debug$T or .debug$P section or PDB type +/// stream. The documentation and headers talk about this as the "leaf" type. enum class TypeRecordKind : uint16_t { #define TYPE_RECORD(lf_ename, value, name) name = value, #include "CodeViewTypes.def" @@ -531,7 +531,7 @@ enum LineFlags : uint16_t { LF_HaveColumns = 1, // CV_LINES_HAVE_COLUMNS }; -/// Data in the the SUBSEC_FRAMEDATA subection. +/// Data in the SUBSEC_FRAMEDATA subection. struct FrameData { support::ulittle32_t RvaStart; support::ulittle32_t CodeSize; diff --git a/include/llvm/DebugInfo/CodeView/CodeViewRegisters.def b/include/llvm/DebugInfo/CodeView/CodeViewRegisters.def index 3f0660294866..6da8893bd61a 100644 --- a/include/llvm/DebugInfo/CodeView/CodeViewRegisters.def +++ b/include/llvm/DebugInfo/CodeView/CodeViewRegisters.def @@ -15,254 +15,254 @@ #define CV_REGISTER(name, value) #endif -// This currently only contains the "register subset shraed by all processor +// This currently only contains the "register subset shared by all processor // types" (ERR etc.) and the x86 registers. -CV_REGISTER(ERR, 30000) -CV_REGISTER(TEB, 30001) -CV_REGISTER(TIMER, 30002) -CV_REGISTER(EFAD1, 30003) -CV_REGISTER(EFAD2, 30004) -CV_REGISTER(EFAD3, 30005) -CV_REGISTER(VFRAME, 30006) -CV_REGISTER(HANDLE, 30007) -CV_REGISTER(PARAMS, 30008) -CV_REGISTER(LOCALS, 30009) -CV_REGISTER(TID, 30010) -CV_REGISTER(ENV, 30011) -CV_REGISTER(CMDLN, 30012) +CV_REGISTER(CVRegERR, 30000) +CV_REGISTER(CVRegTEB, 30001) +CV_REGISTER(CVRegTIMER, 30002) +CV_REGISTER(CVRegEFAD1, 30003) +CV_REGISTER(CVRegEFAD2, 30004) +CV_REGISTER(CVRegEFAD3, 30005) +CV_REGISTER(CVRegVFRAME, 30006) +CV_REGISTER(CVRegHANDLE, 30007) +CV_REGISTER(CVRegPARAMS, 30008) +CV_REGISTER(CVRegLOCALS, 30009) +CV_REGISTER(CVRegTID, 30010) +CV_REGISTER(CVRegENV, 30011) +CV_REGISTER(CVRegCMDLN, 30012) -CV_REGISTER(NONE, 0) -CV_REGISTER(AL, 1) -CV_REGISTER(CL, 2) -CV_REGISTER(DL, 3) -CV_REGISTER(BL, 4) -CV_REGISTER(AH, 5) -CV_REGISTER(CH, 6) -CV_REGISTER(DH, 7) -CV_REGISTER(BH, 8) -CV_REGISTER(AX, 9) -CV_REGISTER(CX, 10) -CV_REGISTER(DX, 11) -CV_REGISTER(BX, 12) -CV_REGISTER(SP, 13) -CV_REGISTER(BP, 14) -CV_REGISTER(SI, 15) -CV_REGISTER(DI, 16) -CV_REGISTER(EAX, 17) -CV_REGISTER(ECX, 18) -CV_REGISTER(EDX, 19) -CV_REGISTER(EBX, 20) -CV_REGISTER(ESP, 21) -CV_REGISTER(EBP, 22) -CV_REGISTER(ESI, 23) -CV_REGISTER(EDI, 24) -CV_REGISTER(ES, 25) -CV_REGISTER(CS, 26) -CV_REGISTER(SS, 27) -CV_REGISTER(DS, 28) -CV_REGISTER(FS, 29) -CV_REGISTER(GS, 30) -CV_REGISTER(IP, 31) -CV_REGISTER(FLAGS, 32) -CV_REGISTER(EIP, 33) -CV_REGISTER(EFLAGS, 34) -CV_REGISTER(TEMP, 40) -CV_REGISTER(TEMPH, 41) -CV_REGISTER(QUOTE, 42) -CV_REGISTER(PCDR3, 43) -CV_REGISTER(PCDR4, 44) -CV_REGISTER(PCDR5, 45) -CV_REGISTER(PCDR6, 46) -CV_REGISTER(PCDR7, 47) -CV_REGISTER(CR0, 80) -CV_REGISTER(CR1, 81) -CV_REGISTER(CR2, 82) -CV_REGISTER(CR3, 83) -CV_REGISTER(CR4, 84) -CV_REGISTER(DR0, 90) -CV_REGISTER(DR1, 91) -CV_REGISTER(DR2, 92) -CV_REGISTER(DR3, 93) -CV_REGISTER(DR4, 94) -CV_REGISTER(DR5, 95) -CV_REGISTER(DR6, 96) -CV_REGISTER(DR7, 97) -CV_REGISTER(GDTR, 110) -CV_REGISTER(GDTL, 111) -CV_REGISTER(IDTR, 112) -CV_REGISTER(IDTL, 113) -CV_REGISTER(LDTR, 114) -CV_REGISTER(TR, 115) +CV_REGISTER(CVRegNONE, 0) +CV_REGISTER(CVRegAL, 1) +CV_REGISTER(CVRegCL, 2) +CV_REGISTER(CVRegDL, 3) +CV_REGISTER(CVRegBL, 4) +CV_REGISTER(CVRegAH, 5) +CV_REGISTER(CVRegCH, 6) +CV_REGISTER(CVRegDH, 7) +CV_REGISTER(CVRegBH, 8) +CV_REGISTER(CVRegAX, 9) +CV_REGISTER(CVRegCX, 10) +CV_REGISTER(CVRegDX, 11) +CV_REGISTER(CVRegBX, 12) +CV_REGISTER(CVRegSP, 13) +CV_REGISTER(CVRegBP, 14) +CV_REGISTER(CVRegSI, 15) +CV_REGISTER(CVRegDI, 16) +CV_REGISTER(CVRegEAX, 17) +CV_REGISTER(CVRegECX, 18) +CV_REGISTER(CVRegEDX, 19) +CV_REGISTER(CVRegEBX, 20) +CV_REGISTER(CVRegESP, 21) +CV_REGISTER(CVRegEBP, 22) +CV_REGISTER(CVRegESI, 23) +CV_REGISTER(CVRegEDI, 24) +CV_REGISTER(CVRegES, 25) +CV_REGISTER(CVRegCS, 26) +CV_REGISTER(CVRegSS, 27) +CV_REGISTER(CVRegDS, 28) +CV_REGISTER(CVRegFS, 29) +CV_REGISTER(CVRegGS, 30) +CV_REGISTER(CVRegIP, 31) +CV_REGISTER(CVRegFLAGS, 32) +CV_REGISTER(CVRegEIP, 33) +CV_REGISTER(CVRegEFLAGS, 34) +CV_REGISTER(CVRegTEMP, 40) +CV_REGISTER(CVRegTEMPH, 41) +CV_REGISTER(CVRegQUOTE, 42) +CV_REGISTER(CVRegPCDR3, 43) +CV_REGISTER(CVRegPCDR4, 44) +CV_REGISTER(CVRegPCDR5, 45) +CV_REGISTER(CVRegPCDR6, 46) +CV_REGISTER(CVRegPCDR7, 47) +CV_REGISTER(CVRegCR0, 80) +CV_REGISTER(CVRegCR1, 81) +CV_REGISTER(CVRegCR2, 82) +CV_REGISTER(CVRegCR3, 83) +CV_REGISTER(CVRegCR4, 84) +CV_REGISTER(CVRegDR0, 90) +CV_REGISTER(CVRegDR1, 91) +CV_REGISTER(CVRegDR2, 92) +CV_REGISTER(CVRegDR3, 93) +CV_REGISTER(CVRegDR4, 94) +CV_REGISTER(CVRegDR5, 95) +CV_REGISTER(CVRegDR6, 96) +CV_REGISTER(CVRegDR7, 97) +CV_REGISTER(CVRegGDTR, 110) +CV_REGISTER(CVRegGDTL, 111) +CV_REGISTER(CVRegIDTR, 112) +CV_REGISTER(CVRegIDTL, 113) +CV_REGISTER(CVRegLDTR, 114) +CV_REGISTER(CVRegTR, 115) -CV_REGISTER(PSEUDO1, 116) -CV_REGISTER(PSEUDO2, 117) -CV_REGISTER(PSEUDO3, 118) -CV_REGISTER(PSEUDO4, 119) -CV_REGISTER(PSEUDO5, 120) -CV_REGISTER(PSEUDO6, 121) -CV_REGISTER(PSEUDO7, 122) -CV_REGISTER(PSEUDO8, 123) -CV_REGISTER(PSEUDO9, 124) +CV_REGISTER(CVRegPSEUDO1, 116) +CV_REGISTER(CVRegPSEUDO2, 117) +CV_REGISTER(CVRegPSEUDO3, 118) +CV_REGISTER(CVRegPSEUDO4, 119) +CV_REGISTER(CVRegPSEUDO5, 120) +CV_REGISTER(CVRegPSEUDO6, 121) +CV_REGISTER(CVRegPSEUDO7, 122) +CV_REGISTER(CVRegPSEUDO8, 123) +CV_REGISTER(CVRegPSEUDO9, 124) -CV_REGISTER(ST0, 128) -CV_REGISTER(ST1, 129) -CV_REGISTER(ST2, 130) -CV_REGISTER(ST3, 131) -CV_REGISTER(ST4, 132) -CV_REGISTER(ST5, 133) -CV_REGISTER(ST6, 134) -CV_REGISTER(ST7, 135) -CV_REGISTER(CTRL, 136) -CV_REGISTER(STAT, 137) -CV_REGISTER(TAG, 138) -CV_REGISTER(FPIP, 139) -CV_REGISTER(FPCS, 140) -CV_REGISTER(FPDO, 141) -CV_REGISTER(FPDS, 142) -CV_REGISTER(ISEM, 143) -CV_REGISTER(FPEIP, 144) -CV_REGISTER(FPEDO, 145) +CV_REGISTER(CVRegST0, 128) +CV_REGISTER(CVRegST1, 129) +CV_REGISTER(CVRegST2, 130) +CV_REGISTER(CVRegST3, 131) +CV_REGISTER(CVRegST4, 132) +CV_REGISTER(CVRegST5, 133) +CV_REGISTER(CVRegST6, 134) +CV_REGISTER(CVRegST7, 135) +CV_REGISTER(CVRegCTRL, 136) +CV_REGISTER(CVRegSTAT, 137) +CV_REGISTER(CVRegTAG, 138) +CV_REGISTER(CVRegFPIP, 139) +CV_REGISTER(CVRegFPCS, 140) +CV_REGISTER(CVRegFPDO, 141) +CV_REGISTER(CVRegFPDS, 142) +CV_REGISTER(CVRegISEM, 143) +CV_REGISTER(CVRegFPEIP, 144) +CV_REGISTER(CVRegFPEDO, 145) -CV_REGISTER(MM0, 146) -CV_REGISTER(MM1, 147) -CV_REGISTER(MM2, 148) -CV_REGISTER(MM3, 149) -CV_REGISTER(MM4, 150) -CV_REGISTER(MM5, 151) -CV_REGISTER(MM6, 152) -CV_REGISTER(MM7, 153) +CV_REGISTER(CVRegMM0, 146) +CV_REGISTER(CVRegMM1, 147) +CV_REGISTER(CVRegMM2, 148) +CV_REGISTER(CVRegMM3, 149) +CV_REGISTER(CVRegMM4, 150) +CV_REGISTER(CVRegMM5, 151) +CV_REGISTER(CVRegMM6, 152) +CV_REGISTER(CVRegMM7, 153) -CV_REGISTER(XMM0, 154) -CV_REGISTER(XMM1, 155) -CV_REGISTER(XMM2, 156) -CV_REGISTER(XMM3, 157) -CV_REGISTER(XMM4, 158) -CV_REGISTER(XMM5, 159) -CV_REGISTER(XMM6, 160) -CV_REGISTER(XMM7, 161) +CV_REGISTER(CVRegXMM0, 154) +CV_REGISTER(CVRegXMM1, 155) +CV_REGISTER(CVRegXMM2, 156) +CV_REGISTER(CVRegXMM3, 157) +CV_REGISTER(CVRegXMM4, 158) +CV_REGISTER(CVRegXMM5, 159) +CV_REGISTER(CVRegXMM6, 160) +CV_REGISTER(CVRegXMM7, 161) -CV_REGISTER(MXCSR, 211) +CV_REGISTER(CVRegMXCSR, 211) -CV_REGISTER(EDXEAX, 212) +CV_REGISTER(CVRegEDXEAX, 212) -CV_REGISTER(EMM0L, 220) -CV_REGISTER(EMM1L, 221) -CV_REGISTER(EMM2L, 222) -CV_REGISTER(EMM3L, 223) -CV_REGISTER(EMM4L, 224) -CV_REGISTER(EMM5L, 225) -CV_REGISTER(EMM6L, 226) -CV_REGISTER(EMM7L, 227) +CV_REGISTER(CVRegEMM0L, 220) +CV_REGISTER(CVRegEMM1L, 221) +CV_REGISTER(CVRegEMM2L, 222) +CV_REGISTER(CVRegEMM3L, 223) +CV_REGISTER(CVRegEMM4L, 224) +CV_REGISTER(CVRegEMM5L, 225) +CV_REGISTER(CVRegEMM6L, 226) +CV_REGISTER(CVRegEMM7L, 227) -CV_REGISTER(EMM0H, 228) -CV_REGISTER(EMM1H, 229) -CV_REGISTER(EMM2H, 230) -CV_REGISTER(EMM3H, 231) -CV_REGISTER(EMM4H, 232) -CV_REGISTER(EMM5H, 233) -CV_REGISTER(EMM6H, 234) -CV_REGISTER(EMM7H, 235) +CV_REGISTER(CVRegEMM0H, 228) +CV_REGISTER(CVRegEMM1H, 229) +CV_REGISTER(CVRegEMM2H, 230) +CV_REGISTER(CVRegEMM3H, 231) +CV_REGISTER(CVRegEMM4H, 232) +CV_REGISTER(CVRegEMM5H, 233) +CV_REGISTER(CVRegEMM6H, 234) +CV_REGISTER(CVRegEMM7H, 235) -CV_REGISTER(MM00, 236) -CV_REGISTER(MM01, 237) -CV_REGISTER(MM10, 238) -CV_REGISTER(MM11, 239) -CV_REGISTER(MM20, 240) -CV_REGISTER(MM21, 241) -CV_REGISTER(MM30, 242) -CV_REGISTER(MM31, 243) -CV_REGISTER(MM40, 244) -CV_REGISTER(MM41, 245) -CV_REGISTER(MM50, 246) -CV_REGISTER(MM51, 247) -CV_REGISTER(MM60, 248) -CV_REGISTER(MM61, 249) -CV_REGISTER(MM70, 250) -CV_REGISTER(MM71, 251) +CV_REGISTER(CVRegMM00, 236) +CV_REGISTER(CVRegMM01, 237) +CV_REGISTER(CVRegMM10, 238) +CV_REGISTER(CVRegMM11, 239) +CV_REGISTER(CVRegMM20, 240) +CV_REGISTER(CVRegMM21, 241) +CV_REGISTER(CVRegMM30, 242) +CV_REGISTER(CVRegMM31, 243) +CV_REGISTER(CVRegMM40, 244) +CV_REGISTER(CVRegMM41, 245) +CV_REGISTER(CVRegMM50, 246) +CV_REGISTER(CVRegMM51, 247) +CV_REGISTER(CVRegMM60, 248) +CV_REGISTER(CVRegMM61, 249) +CV_REGISTER(CVRegMM70, 250) +CV_REGISTER(CVRegMM71, 251) -CV_REGISTER(BND0, 396) -CV_REGISTER(BND1, 397) -CV_REGISTER(BND2, 398) +CV_REGISTER(CVRegBND0, 396) +CV_REGISTER(CVRegBND1, 397) +CV_REGISTER(CVRegBND2, 398) -CV_REGISTER(XMM8, 252) -CV_REGISTER(XMM9, 253) -CV_REGISTER(XMM10, 254) -CV_REGISTER(XMM11, 255) -CV_REGISTER(XMM12, 256) -CV_REGISTER(XMM13, 257) -CV_REGISTER(XMM14, 258) -CV_REGISTER(XMM15, 259) +CV_REGISTER(CVRegXMM8, 252) +CV_REGISTER(CVRegXMM9, 253) +CV_REGISTER(CVRegXMM10, 254) +CV_REGISTER(CVRegXMM11, 255) +CV_REGISTER(CVRegXMM12, 256) +CV_REGISTER(CVRegXMM13, 257) +CV_REGISTER(CVRegXMM14, 258) +CV_REGISTER(CVRegXMM15, 259) -CV_REGISTER(SIL, 324) -CV_REGISTER(DIL, 325) -CV_REGISTER(BPL, 326) -CV_REGISTER(SPL, 327) +CV_REGISTER(CVRegSIL, 324) +CV_REGISTER(CVRegDIL, 325) +CV_REGISTER(CVRegBPL, 326) +CV_REGISTER(CVRegSPL, 327) -CV_REGISTER(RAX, 328) -CV_REGISTER(RBX, 329) -CV_REGISTER(RCX, 330) -CV_REGISTER(RDX, 331) -CV_REGISTER(RSI, 332) -CV_REGISTER(RDI, 333) -CV_REGISTER(RBP, 334) -CV_REGISTER(RSP, 335) +CV_REGISTER(CVRegRAX, 328) +CV_REGISTER(CVRegRBX, 329) +CV_REGISTER(CVRegRCX, 330) +CV_REGISTER(CVRegRDX, 331) +CV_REGISTER(CVRegRSI, 332) +CV_REGISTER(CVRegRDI, 333) +CV_REGISTER(CVRegRBP, 334) +CV_REGISTER(CVRegRSP, 335) -CV_REGISTER(R8, 336) -CV_REGISTER(R9, 337) -CV_REGISTER(R10, 338) -CV_REGISTER(R11, 339) -CV_REGISTER(R12, 340) -CV_REGISTER(R13, 341) -CV_REGISTER(R14, 342) -CV_REGISTER(R15, 343) +CV_REGISTER(CVRegR8, 336) +CV_REGISTER(CVRegR9, 337) +CV_REGISTER(CVRegR10, 338) +CV_REGISTER(CVRegR11, 339) +CV_REGISTER(CVRegR12, 340) +CV_REGISTER(CVRegR13, 341) +CV_REGISTER(CVRegR14, 342) +CV_REGISTER(CVRegR15, 343) -CV_REGISTER(R8B, 344) -CV_REGISTER(R9B, 345) -CV_REGISTER(R10B, 346) -CV_REGISTER(R11B, 347) -CV_REGISTER(R12B, 348) -CV_REGISTER(R13B, 349) -CV_REGISTER(R14B, 350) -CV_REGISTER(R15B, 351) +CV_REGISTER(CVRegR8B, 344) +CV_REGISTER(CVRegR9B, 345) +CV_REGISTER(CVRegR10B, 346) +CV_REGISTER(CVRegR11B, 347) +CV_REGISTER(CVRegR12B, 348) +CV_REGISTER(CVRegR13B, 349) +CV_REGISTER(CVRegR14B, 350) +CV_REGISTER(CVRegR15B, 351) -CV_REGISTER(R8W, 352) -CV_REGISTER(R9W, 353) -CV_REGISTER(R10W, 354) -CV_REGISTER(R11W, 355) -CV_REGISTER(R12W, 356) -CV_REGISTER(R13W, 357) -CV_REGISTER(R14W, 358) -CV_REGISTER(R15W, 359) +CV_REGISTER(CVRegR8W, 352) +CV_REGISTER(CVRegR9W, 353) +CV_REGISTER(CVRegR10W, 354) +CV_REGISTER(CVRegR11W, 355) +CV_REGISTER(CVRegR12W, 356) +CV_REGISTER(CVRegR13W, 357) +CV_REGISTER(CVRegR14W, 358) +CV_REGISTER(CVRegR15W, 359) -CV_REGISTER(R8D, 360) -CV_REGISTER(R9D, 361) -CV_REGISTER(R10D, 362) -CV_REGISTER(R11D, 363) -CV_REGISTER(R12D, 364) -CV_REGISTER(R13D, 365) -CV_REGISTER(R14D, 366) -CV_REGISTER(R15D, 367) +CV_REGISTER(CVRegR8D, 360) +CV_REGISTER(CVRegR9D, 361) +CV_REGISTER(CVRegR10D, 362) +CV_REGISTER(CVRegR11D, 363) +CV_REGISTER(CVRegR12D, 364) +CV_REGISTER(CVRegR13D, 365) +CV_REGISTER(CVRegR14D, 366) +CV_REGISTER(CVRegR15D, 367) // cvconst.h defines both CV_REG_YMM0 (252) and CV_AMD64_YMM0 (368). Keep the // original prefix to distinguish them. -CV_REGISTER(AMD64_YMM0, 368) -CV_REGISTER(AMD64_YMM1, 369) -CV_REGISTER(AMD64_YMM2, 370) -CV_REGISTER(AMD64_YMM3, 371) -CV_REGISTER(AMD64_YMM4, 372) -CV_REGISTER(AMD64_YMM5, 373) -CV_REGISTER(AMD64_YMM6, 374) -CV_REGISTER(AMD64_YMM7, 375) -CV_REGISTER(AMD64_YMM8, 376) -CV_REGISTER(AMD64_YMM9, 377) -CV_REGISTER(AMD64_YMM10, 378) -CV_REGISTER(AMD64_YMM11, 379) -CV_REGISTER(AMD64_YMM12, 380) -CV_REGISTER(AMD64_YMM13, 381) -CV_REGISTER(AMD64_YMM14, 382) -CV_REGISTER(AMD64_YMM15, 383) +CV_REGISTER(CVRegAMD64_YMM0, 368) +CV_REGISTER(CVRegAMD64_YMM1, 369) +CV_REGISTER(CVRegAMD64_YMM2, 370) +CV_REGISTER(CVRegAMD64_YMM3, 371) +CV_REGISTER(CVRegAMD64_YMM4, 372) +CV_REGISTER(CVRegAMD64_YMM5, 373) +CV_REGISTER(CVRegAMD64_YMM6, 374) +CV_REGISTER(CVRegAMD64_YMM7, 375) +CV_REGISTER(CVRegAMD64_YMM8, 376) +CV_REGISTER(CVRegAMD64_YMM9, 377) +CV_REGISTER(CVRegAMD64_YMM10, 378) +CV_REGISTER(CVRegAMD64_YMM11, 379) +CV_REGISTER(CVRegAMD64_YMM12, 380) +CV_REGISTER(CVRegAMD64_YMM13, 381) +CV_REGISTER(CVRegAMD64_YMM14, 382) +CV_REGISTER(CVRegAMD64_YMM15, 383) diff --git a/include/llvm/DebugInfo/CodeView/CodeViewTypes.def b/include/llvm/DebugInfo/CodeView/CodeViewTypes.def index 69ce9606a670..e9a479dba496 100644 --- a/include/llvm/DebugInfo/CodeView/CodeViewTypes.def +++ b/include/llvm/DebugInfo/CodeView/CodeViewTypes.def @@ -87,6 +87,8 @@ TYPE_RECORD(LF_UDT_MOD_SRC_LINE, 0x1607, UdtModSourceLine) TYPE_RECORD(LF_METHODLIST, 0x1206, MethodOverloadList) +TYPE_RECORD(LF_PRECOMP, 0x1509, Precomp) +TYPE_RECORD(LF_ENDPRECOMP, 0x0014, EndPrecomp) // 16 bit type records. CV_TYPE(LF_MODIFIER_16t, 0x0001) @@ -106,7 +108,6 @@ CV_TYPE(LF_NOTTRAN, 0x0010) CV_TYPE(LF_DIMARRAY_16t, 0x0011) CV_TYPE(LF_VFTPATH_16t, 0x0012) CV_TYPE(LF_PRECOMP_16t, 0x0013) -CV_TYPE(LF_ENDPRECOMP, 0x0014) CV_TYPE(LF_OEM_16t, 0x0015) CV_TYPE(LF_TYPESERVER_ST, 0x0016) @@ -181,7 +182,6 @@ CV_TYPE(LF_MANAGED_ST, 0x140f) CV_TYPE(LF_ST_MAX, 0x1500) CV_TYPE(LF_TYPESERVER, 0x1501) CV_TYPE(LF_DIMARRAY, 0x1508) -CV_TYPE(LF_PRECOMP, 0x1509) CV_TYPE(LF_ALIAS, 0x150a) CV_TYPE(LF_DEFARG, 0x150b) CV_TYPE(LF_FRIENDFCN, 0x150c) diff --git a/include/llvm/DebugInfo/CodeView/DebugStringTableSubsection.h b/include/llvm/DebugInfo/CodeView/DebugStringTableSubsection.h index 7f0f10e4fbfa..bebc960223cc 100644 --- a/include/llvm/DebugInfo/CodeView/DebugStringTableSubsection.h +++ b/include/llvm/DebugInfo/CodeView/DebugStringTableSubsection.h @@ -10,6 +10,7 @@ #ifndef LLVM_DEBUGINFO_CODEVIEW_DEBUGSTRINGTABLESUBSECTION_H #define LLVM_DEBUGINFO_CODEVIEW_DEBUGSTRINGTABLESUBSECTION_H +#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/DebugInfo/CodeView/CodeView.h" @@ -66,19 +67,26 @@ public: uint32_t insert(StringRef S); // Return the ID for string S. Assumes S exists in the table. - uint32_t getStringId(StringRef S) const; + uint32_t getIdForString(StringRef S) const; + + StringRef getStringForId(uint32_t Id) const; uint32_t calculateSerializedSize() const override; Error commit(BinaryStreamWriter &Writer) const override; uint32_t size() const; - StringMap<uint32_t>::const_iterator begin() const { return Strings.begin(); } + StringMap<uint32_t>::const_iterator begin() const { + return StringToId.begin(); + } + + StringMap<uint32_t>::const_iterator end() const { return StringToId.end(); } - StringMap<uint32_t>::const_iterator end() const { return Strings.end(); } + std::vector<uint32_t> sortedIds() const; private: - StringMap<uint32_t> Strings; + DenseMap<uint32_t, StringRef> IdToString; + StringMap<uint32_t> StringToId; uint32_t StringSize = 1; }; diff --git a/include/llvm/DebugInfo/CodeView/GlobalTypeTableBuilder.h b/include/llvm/DebugInfo/CodeView/GlobalTypeTableBuilder.h index d8ac3343c15f..c4704168ed34 100644 --- a/include/llvm/DebugInfo/CodeView/GlobalTypeTableBuilder.h +++ b/include/llvm/DebugInfo/CodeView/GlobalTypeTableBuilder.h @@ -69,9 +69,22 @@ public: ArrayRef<ArrayRef<uint8_t>> records() const; ArrayRef<GloballyHashedType> hashes() const; - using CreateRecord = llvm::function_ref<ArrayRef<uint8_t>()>; + template <typename CreateFunc> + TypeIndex insertRecordAs(GloballyHashedType Hash, size_t RecordSize, + CreateFunc Create) { + auto Result = HashedRecords.try_emplace(Hash, nextTypeIndex()); + + if (LLVM_UNLIKELY(Result.second)) { + uint8_t *Stable = RecordStorage.Allocate<uint8_t>(RecordSize); + MutableArrayRef<uint8_t> Data(Stable, RecordSize); + SeenRecords.push_back(Create(Data)); + SeenHashes.push_back(Hash); + } + + // Update the caller's copy of Record to point a stable copy. + return Result.first->second; + } - TypeIndex insertRecordAs(GloballyHashedType Hash, CreateRecord Create); TypeIndex insertRecordBytes(ArrayRef<uint8_t> Data); TypeIndex insertRecord(ContinuationRecordBuilder &Builder); diff --git a/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h b/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h index 16d78692c839..383f7dd9fb6a 100644 --- a/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h +++ b/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h @@ -26,7 +26,7 @@ namespace llvm { namespace codeview { -/// \brief Provides amortized O(1) random access to a CodeView type stream. +/// Provides amortized O(1) random access to a CodeView type stream. /// Normally to access a type from a type stream, you must know its byte /// offset into the type stream, because type records are variable-lengthed. /// However, this is not the way we prefer to access them. For example, given diff --git a/include/llvm/DebugInfo/CodeView/TypeHashing.h b/include/llvm/DebugInfo/CodeView/TypeHashing.h index 741337533701..1f732d29a538 100644 --- a/include/llvm/DebugInfo/CodeView/TypeHashing.h +++ b/include/llvm/DebugInfo/CodeView/TypeHashing.h @@ -58,7 +58,10 @@ struct LocallyHashedType { } }; -enum class GlobalTypeHashAlg : uint16_t { SHA1 = 0 }; +enum class GlobalTypeHashAlg : uint16_t { + SHA1 = 0, // standard 20-byte SHA1 hash + SHA1_8 // last 8-bytes of standard SHA1 hash +}; /// A globally hashed type represents a hash value that is sufficient to /// uniquely identify a record across multiple type streams or type sequences. @@ -77,10 +80,10 @@ struct GloballyHashedType { GloballyHashedType(StringRef H) : GloballyHashedType(ArrayRef<uint8_t>(H.bytes_begin(), H.bytes_end())) {} GloballyHashedType(ArrayRef<uint8_t> H) { - assert(H.size() == 20); - ::memcpy(Hash.data(), H.data(), 20); + assert(H.size() == 8); + ::memcpy(Hash.data(), H.data(), 8); } - std::array<uint8_t, 20> Hash; + std::array<uint8_t, 8> Hash; /// Given a sequence of bytes representing a record, compute a global hash for /// this record. Due to the nature of global hashes incorporating the hashes diff --git a/include/llvm/DebugInfo/CodeView/TypeRecord.h b/include/llvm/DebugInfo/CodeView/TypeRecord.h index 508bdd395f74..61ebdf878ce7 100644 --- a/include/llvm/DebugInfo/CodeView/TypeRecord.h +++ b/include/llvm/DebugInfo/CodeView/TypeRecord.h @@ -330,6 +330,10 @@ public: return !!(Attrs & uint32_t(PointerOptions::Unaligned)); } + bool isRestrict() const { + return !!(Attrs & uint32_t(PointerOptions::Restrict)); + } + TypeIndex ReferentType; uint32_t Attrs; Optional<MemberPointerInfo> MemberInfo; @@ -892,6 +896,33 @@ public: TypeIndex ContinuationIndex; }; +// LF_PRECOMP +class PrecompRecord : public TypeRecord { +public: + PrecompRecord() = default; + explicit PrecompRecord(TypeRecordKind Kind) : TypeRecord(Kind) {} + + uint32_t getStartTypeIndex() const { return StartTypeIndex; } + uint32_t getTypesCount() const { return TypesCount; } + uint32_t getSignature() const { return Signature; } + StringRef getPrecompFilePath() const { return PrecompFilePath; } + + uint32_t StartTypeIndex; + uint32_t TypesCount; + uint32_t Signature; + StringRef PrecompFilePath; +}; + +// LF_ENDPRECOMP +class EndPrecompRecord : public TypeRecord { +public: + EndPrecompRecord() = default; + explicit EndPrecompRecord(TypeRecordKind Kind) : TypeRecord(Kind) {} + + uint32_t getSignature() const { return Signature; } + + uint32_t Signature; +}; } // end namespace codeview } // end namespace llvm diff --git a/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h b/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h index 59e216abcb11..583740d2eb4b 100644 --- a/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h +++ b/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h @@ -23,7 +23,7 @@ struct GloballyHashedType; class GlobalTypeTableBuilder; class MergingTypeTableBuilder; -/// \brief Merge one set of type records into another. This method assumes +/// Merge one set of type records into another. This method assumes /// that all records are type records, and there are no Id records present. /// /// \param Dest The table to store the re-written type records into. @@ -40,7 +40,7 @@ Error mergeTypeRecords(MergingTypeTableBuilder &Dest, SmallVectorImpl<TypeIndex> &SourceToDest, const CVTypeArray &Types); -/// \brief Merge one set of id records into another. This method assumes +/// Merge one set of id records into another. This method assumes /// that all records are id records, and there are no Type records present. /// However, since Id records can refer back to Type records, this method /// assumes that the referenced type records have also been merged into @@ -65,7 +65,7 @@ Error mergeIdRecords(MergingTypeTableBuilder &Dest, ArrayRef<TypeIndex> Types, SmallVectorImpl<TypeIndex> &SourceToDest, const CVTypeArray &Ids); -/// \brief Merge a unified set of type and id records, splitting them into +/// Merge a unified set of type and id records, splitting them into /// separate output streams. /// /// \param DestIds The table to store the re-written id records into. |