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 46c5a11..0f9d503 100644 --- a/llvm/include/llvm/MC/MCAsmInfo.h +++ b/llvm/include/llvm/MC/MCAsmInfo.h @@ -209,6 +209,9 @@ protected: 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 @@ public: 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 ecf63b1..9b78eca 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 aef0eed..f275011 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 3643306..63516f5 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 } -- 2.7.4