From bf66003a4f9115beb4a8a240b5327b3cc41be9cc Mon Sep 17 00:00:00 2001 From: Artem Belevich Date: Wed, 8 Jul 2020 13:23:18 -0700 Subject: [PATCH] [MC,NVPTX] Add MCAsmPrinter support for unsigned-only data directives. PTX does not support negative values in .bNN data directives and we must typecast such values to unsigned before printing them. MCAsmInfo can now specify whether such casting is necessary for particular target. Differential Revision: https://reviews.llvm.org/D83423 --- llvm/include/llvm/MC/MCAsmInfo.h | 4 ++++ llvm/lib/MC/MCExpr.cpp | 2 ++ llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp | 1 + llvm/test/DebugInfo/NVPTX/packed_bitfields.ll | 3 ++- 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/MC/MCAsmInfo.h b/llvm/include/llvm/MC/MCAsmInfo.h index 46c5a111c891e..0f9d503045d88 100644 --- a/llvm/include/llvm/MC/MCAsmInfo.h +++ b/llvm/include/llvm/MC/MCAsmInfo.h @@ -209,6 +209,9 @@ class MCAsmInfo { const char *Data32bitsDirective; const char *Data64bitsDirective; + /// True if data directives support signed values + bool SupportsSignedData = true; + /// If non-null, a directive that is used to emit a word which should be /// relocated as a 64-bit GP-relative offset, e.g. .gpdword on Mips. Defaults /// to nullptr. @@ -436,6 +439,7 @@ class MCAsmInfo { const char *getData16bitsDirective() const { return Data16bitsDirective; } const char *getData32bitsDirective() const { return Data32bitsDirective; } const char *getData64bitsDirective() const { return Data64bitsDirective; } + bool supportsSignedData() const { return SupportsSignedData; } const char *getGPRel64Directive() const { return GPRel64Directive; } const char *getGPRel32Directive() const { return GPRel32Directive; } const char *getDTPRel64Directive() const { return DTPRel64Directive; } diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp index ecf63b10f73fc..9b78eca35caad 100644 --- a/llvm/lib/MC/MCExpr.cpp +++ b/llvm/lib/MC/MCExpr.cpp @@ -47,6 +47,8 @@ void MCExpr::print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens) const { auto Value = cast(*this).getValue(); auto PrintInHex = cast(*this).useHexFormat(); auto SizeInBytes = cast(*this).getSizeInBytes(); + if (Value < 0 && MAI && !MAI->supportsSignedData()) + PrintInHex = true; if (PrintInHex) switch (SizeInBytes) { default: diff --git a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp index aef0eed6ab9a4..f275011018a32 100644 --- a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp +++ b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp @@ -47,6 +47,7 @@ NVPTXMCAsmInfo::NVPTXMCAsmInfo(const Triple &TheTriple, AscizDirective = nullptr; // not supported SupportsQuotedNames = false; SupportsExtendedDwarfLocDirective = false; + SupportsSignedData = false; // @TODO: Can we just disable this? WeakDirective = "\t// .weak\t"; diff --git a/llvm/test/DebugInfo/NVPTX/packed_bitfields.ll b/llvm/test/DebugInfo/NVPTX/packed_bitfields.ll index 36433064fa924..63516f5972720 100644 --- a/llvm/test/DebugInfo/NVPTX/packed_bitfields.ll +++ b/llvm/test/DebugInfo/NVPTX/packed_bitfields.ll @@ -14,7 +14,8 @@ ; CHECK: .b8 3 // DW_AT_decl_line ; CHECK-NEXT: .b8 1 // DW_AT_byte_size ; CHECK-NEXT: .b8 6 // DW_AT_bit_size -; CHECK-NEXT: .b64 -1 // DW_AT_bit_offset +; Negative offset must be encoded as an unsigned integer. +; CHECK-NEXT: .b64 0xffffffffffffffff // DW_AT_bit_offset ; CHECK-NEXT: .b8 2 // DW_AT_data_member_location %struct.anon = type { i16 }