1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

[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
This commit is contained in:
Artem Belevich 2020-07-08 13:23:18 -07:00
parent abf1154870
commit 9d0375c353
4 changed files with 9 additions and 1 deletions

View File

@ -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; }

View File

@ -47,6 +47,8 @@ void MCExpr::print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens) const {
auto Value = cast<MCConstantExpr>(*this).getValue();
auto PrintInHex = cast<MCConstantExpr>(*this).useHexFormat();
auto SizeInBytes = cast<MCConstantExpr>(*this).getSizeInBytes();
if (Value < 0 && MAI && !MAI->supportsSignedData())
PrintInHex = true;
if (PrintInHex)
switch (SizeInBytes) {
default:

View File

@ -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";

View File

@ -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 }