Skip to content

Commit

Permalink
[MC,NVPTX] Add MCAsmPrinter support for unsigned-only data directives.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Artem-B committed Jul 20, 2020
1 parent a560910 commit bf66003
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 1 deletion.
4 changes: 4 additions & 0 deletions llvm/include/llvm/MC/MCAsmInfo.h
Expand Up @@ -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.
Expand Down Expand Up @@ -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; }
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/MC/MCExpr.cpp
Expand Up @@ -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:
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp
Expand Up @@ -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";
Expand Down
3 changes: 2 additions & 1 deletion llvm/test/DebugInfo/NVPTX/packed_bitfields.ll
Expand Up @@ -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 }
Expand Down

0 comments on commit bf66003

Please sign in to comment.