[PATCH] D83423: [MC, NVPTX] Add MCAsmPrinter support for unsigned-only data directives.

Artem Belevich via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 14 10:05:12 PDT 2020


tra updated this revision to Diff 277887.
tra added a comment.

Mask out unwanted bits in the unsigned representation of the Value.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D83423/new/

https://reviews.llvm.org/D83423

Files:
  llvm/include/llvm/MC/MCAsmInfo.h
  llvm/lib/MC/MCExpr.cpp
  llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp
  llvm/test/DebugInfo/NVPTX/packed_bitfields.ll


Index: llvm/test/DebugInfo/NVPTX/packed_bitfields.ll
===================================================================
--- llvm/test/DebugInfo/NVPTX/packed_bitfields.ll
+++ 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 18446744073709551615 // DW_AT_bit_offset
 ; CHECK-NEXT: .b8 2    // DW_AT_data_member_location
 
 %struct.anon = type { i16 }
Index: llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp
===================================================================
--- llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp
+++ llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp
@@ -47,6 +47,7 @@
   AscizDirective = nullptr; // not supported
   SupportsQuotedNames = false;
   SupportsExtendedDwarfLocDirective = false;
+  SupportsSignedData = false;
 
   // @TODO: Can we just disable this?
   WeakDirective = "\t// .weak\t";
Index: llvm/lib/MC/MCExpr.cpp
===================================================================
--- llvm/lib/MC/MCExpr.cpp
+++ llvm/lib/MC/MCExpr.cpp
@@ -65,7 +65,15 @@
         OS << format("0x%016" PRIx64, Value);
         break;
       }
-    else
+    else if (MAI && !MAI->supportsSignedData()) {
+      using unsigned_t = typename std::make_unsigned<decltype(Value)>::type;
+      // We don't want to print the bits that don't fit into SizeInBytes, if
+      // it's specified.
+      unsigned_t ByteMask = SizeInBytes ? std::numeric_limits<unsigned_t>::max()
+                                              << (SizeInBytes * 8)
+                                        : 0;
+      OS << (~ByteMask & static_cast<unsigned_t>(Value));
+    } else
       OS << Value;
     return;
   }
Index: llvm/include/llvm/MC/MCAsmInfo.h
===================================================================
--- llvm/include/llvm/MC/MCAsmInfo.h
+++ llvm/include/llvm/MC/MCAsmInfo.h
@@ -209,6 +209,9 @@
   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 @@
   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; }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D83423.277887.patch
Type: text/x-patch
Size: 2982 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200714/505ca851/attachment.bin>


More information about the llvm-commits mailing list