diff options
author | Amy Huang <akhuang@google.com> | 2020-10-26 17:11:45 -0700 |
---|---|---|
committer | Amy Huang <akhuang@google.com> | 2020-10-30 09:28:41 -0700 |
commit | 7156910d85fcafdc78371a852c00a7184f8563cd (patch) | |
tree | 2c7a8220b7aa20580539694376cc4d8bca7c235d /llvm | |
parent | 973317cc5e4612a85e39dc1ffb20423c96bc9db2 (diff) | |
download | llvm-7156910d85fcafdc78371a852c00a7184f8563cd.zip llvm-7156910d85fcafdc78371a852c00a7184f8563cd.tar.gz llvm-7156910d85fcafdc78371a852c00a7184f8563cd.tar.bz2 |
[CodeView] Encode signed int values correctly when emitting S_CONSTANTs
Differential Revision: https://reviews.llvm.org/D90199
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 28 | ||||
-rw-r--r-- | llvm/test/DebugInfo/COFF/global-constants.ll | 7 | ||||
-rw-r--r-- | llvm/test/DebugInfo/COFF/globals.ll | 6 |
3 files changed, 32 insertions, 9 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 125fea7..532d506 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -3156,6 +3156,25 @@ void CodeViewDebug::emitStaticConstMemberList() { } } +static bool isFloatDIType(const DIType *Ty) { + if (auto *CTy = dyn_cast<DICompositeType>(Ty)) + return false; + + if (auto *DTy = dyn_cast<DIDerivedType>(Ty)) { + dwarf::Tag T = (dwarf::Tag)Ty->getTag(); + if (T == dwarf::DW_TAG_pointer_type || + T == dwarf::DW_TAG_ptr_to_member_type || + T == dwarf::DW_TAG_reference_type || + T == dwarf::DW_TAG_rvalue_reference_type) + return false; + assert(DTy->getBaseType() && "Expected valid base type"); + return isFloatDIType(DTy->getBaseType()); + } + + auto *BTy = cast<DIBasicType>(Ty); + return (BTy->getEncoding() == dwarf::DW_ATE_float); +} + void CodeViewDebug::emitDebugInfoForGlobal(const CVGlobalVariable &CVGV) { const DIGlobalVariable *DIGV = CVGV.DIGV; @@ -3191,7 +3210,12 @@ void CodeViewDebug::emitDebugInfoForGlobal(const CVGlobalVariable &CVGV) { const DIExpression *DIE = CVGV.GVInfo.get<const DIExpression *>(); assert(DIE->isConstant() && "Global constant variables must contain a constant expression."); - uint64_t Val = DIE->getElement(1); + + // Use unsigned for floats. + bool isUnsigned = isFloatDIType(DIGV->getType()) + ? true + : DebugHandlerBase::isUnsignedDIType(DIGV->getType()); + APSInt Value(APInt(/*BitWidth=*/64, DIE->getElement(1)), isUnsigned); MCSymbol *SConstantEnd = beginSymbolRecord(SymbolKind::S_CONSTANT); OS.AddComment("Type"); @@ -3202,7 +3226,7 @@ void CodeViewDebug::emitDebugInfoForGlobal(const CVGlobalVariable &CVGV) { uint8_t data[10]; BinaryStreamWriter Writer(data, llvm::support::endianness::little); CodeViewRecordIO IO(Writer); - cantFail(IO.mapEncodedInteger(Val)); + cantFail(IO.mapEncodedInteger(Value)); StringRef SRef((char *)data, Writer.getOffset()); OS.emitBinaryData(SRef); diff --git a/llvm/test/DebugInfo/COFF/global-constants.ll b/llvm/test/DebugInfo/COFF/global-constants.ll index 8276932..c0e6afb 100644 --- a/llvm/test/DebugInfo/COFF/global-constants.ll +++ b/llvm/test/DebugInfo/COFF/global-constants.ll @@ -37,9 +37,8 @@ ; ASM: .short 4359 # Record kind: S_CONSTANT ; ASM-NEXT: .long 4101 # Type -; ASM-NEXT: .byte 0x0a, 0x80, 0x40, 0x61 # Value -; ASM-NEXT: .byte 0x07, 0x80, 0xff, 0xff -; ASM-NEXT: .byte 0xff, 0xff +; ASM-NEXT: .byte 0x03, 0x80, 0x40, 0x61 # Value +; ASM-NEXT: .byte 0x07, 0x80 ; ASM-NEXT: .asciz "ENUM_B" # Name ; ASM-NEXT: .p2align 2 ; ASM-NOT: .asciz "S::SEnum" # Name @@ -64,7 +63,7 @@ ; OBJ-NEXT: ConstantSym { ; OBJ-NEXT: Kind: S_CONSTANT (0x1107) ; OBJ-NEXT: Type: TestEnum (0x1005) -; OBJ-NEXT: Value: 18446744071562551616 +; OBJ-NEXT: Value: -214700000 ; OBJ-NEXT: Name: ENUM_B ; OBJ-NEXT: } ; OBJ-NOT: Name: S::SEnum diff --git a/llvm/test/DebugInfo/COFF/globals.ll b/llvm/test/DebugInfo/COFF/globals.ll index 583f108..7960f63 100644 --- a/llvm/test/DebugInfo/COFF/globals.ll +++ b/llvm/test/DebugInfo/COFF/globals.ll @@ -86,19 +86,19 @@ ; ASM: .short 4359 # Record kind: S_CONSTANT ; ASM-NEXT: .long 4100 # Type -; ASM-NEXT: .byte 0x08, 0x00 # Value +; ASM-NEXT: .byte 0x00, 0x80, 0x08 # Value ; ASM-NEXT: .asciz "foo::constExpr" # Name ; ASM-NEXT: .p2align 2 ; ASM: .short 4359 # Record kind: S_CONSTANT ; ASM-NEXT: .long 4100 # Type -; ASM-NEXT: .byte 0x09, 0x00 # Value +; ASM-NEXT: .byte 0x00, 0x80, 0x09 # Value ; ASM-NEXT: .asciz "foo::constVal" # Name ; ASM-NEXT: .p2align 2 ; ASM: .short 4359 # Record kind: S_CONSTANT ; ASM-NEXT: .long 4100 # Type -; ASM-NEXT: .byte 0x0e, 0x00 # Value +; ASM-NEXT: .byte 0x00, 0x80, 0x0e # Value ; ASM-NEXT: .asciz "foo::Data::DataConstExpr" # Name ; ASM-NEXT: .p2align 2 |