]> granicus.if.org Git - llvm/commitdiff
Changes to display code view debug info type records in hex format
authorNilanjana Basu <nilanjana.basu87@gmail.com>
Wed, 17 Jul 2019 23:43:58 +0000 (23:43 +0000)
committerNilanjana Basu <nilanjana.basu87@gmail.com>
Wed, 17 Jul 2019 23:43:58 +0000 (23:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@366390 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCExpr.h
include/llvm/MC/MCStreamer.h
lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
lib/DebugInfo/CodeView/TypeRecordMapping.cpp
lib/MC/MCAsmStreamer.cpp
lib/MC/MCExpr.cpp
test/DebugInfo/COFF/types-basic.ll

index 7d9b265b9d590d4003413ffbec11db91950ef720..fb23c0114c76eddff34689ddb09756756bb696aa 100644 (file)
@@ -134,15 +134,21 @@ inline raw_ostream &operator<<(raw_ostream &OS, const MCExpr &E) {
 ////  Represent a constant integer expression.
 class MCConstantExpr : public MCExpr {
   int64_t Value;
+  bool PrintInHex = false;
 
-  explicit MCConstantExpr(int64_t Value)
+  MCConstantExpr(int64_t Value)
       : MCExpr(MCExpr::Constant, SMLoc()), Value(Value) {}
 
+  MCConstantExpr(int64_t Value, bool PrintInHex)
+      : MCExpr(MCExpr::Constant, SMLoc()), Value(Value),
+        PrintInHex(PrintInHex) {}
+
 public:
   /// \name Construction
   /// @{
 
-  static const MCConstantExpr *create(int64_t Value, MCContext &Ctx);
+  static const MCConstantExpr *create(int64_t Value, MCContext &Ctx,
+                                      bool PrintInHex = false);
 
   /// @}
   /// \name Accessors
@@ -150,6 +156,8 @@ public:
 
   int64_t getValue() const { return Value; }
 
+  bool useHexFormat() const { return PrintInHex; }
+
   /// @}
 
   static bool classof(const MCExpr *E) {
index 67284fb379f388ea849441369d61da314ef0ef04..731e7515448c01bd73476d034cce648eb87f5ffc 100644 (file)
@@ -626,6 +626,13 @@ public:
   /// to pass in a MCExpr for constant integers.
   virtual void EmitIntValue(uint64_t Value, unsigned Size);
 
+  /// Special case of EmitValue that avoids the client having to pass
+  /// in a MCExpr for constant integers & prints in Hex format for certain
+  /// modes.
+  virtual void EmitIntValueInHex(uint64_t Value, unsigned Size) {
+    EmitIntValue(Value, Size);
+  }
+
   virtual void EmitULEB128Value(const MCExpr *Value);
 
   virtual void EmitSLEB128Value(const MCExpr *Value);
index bd0ace9e1bb09041b2522fce2c65fcdaae2ab1e3..932959c311fa1215dbc880cc5b5c5bd48dada67a 100644 (file)
@@ -103,7 +103,7 @@ public:
   void EmitBytes(StringRef Data) { OS->EmitBytes(Data); }
 
   void EmitIntValue(uint64_t Value, unsigned Size) {
-    OS->EmitIntValue(Value, Size);
+    OS->EmitIntValueInHex(Value, Size);
   }
 
   void EmitBinaryData(StringRef Data) { OS->EmitBinaryData(Data); }
index 8e8eba4d53e7ff7a60cb1ad6f747aae0b5d7dc6c..47928c2eef642c0a0f8e607ba9f90b143f2dcc62 100644 (file)
@@ -306,7 +306,7 @@ Error TypeRecordMapping::visitKnownRecord(CVType &CVR, VFTableRecord &Record) {
     for (auto Name : Record.MethodNames)
       NamesLen += Name.size() + 1;
   }
-  error(IO.mapInteger(NamesLen, ""));
+  error(IO.mapInteger(NamesLen));
   error(IO.mapVectorTail(
       Record.MethodNames,
       [](CodeViewRecordIO &IO, StringRef &S) {
index 7e8f02e3a1aa573bf6de33e5bc1e812202d23625..7a2b0b8a12207ac9fbe430d5c6a21b8e32de9324 100644 (file)
@@ -188,6 +188,7 @@ public:
   void EmitValueImpl(const MCExpr *Value, unsigned Size,
                      SMLoc Loc = SMLoc()) override;
   void EmitIntValue(uint64_t Value, unsigned Size) override;
+  void EmitIntValueInHex(uint64_t Value, unsigned Size) override;
 
   void EmitULEB128Value(const MCExpr *Value) override;
 
@@ -923,6 +924,10 @@ void MCAsmStreamer::EmitIntValue(uint64_t Value, unsigned Size) {
   EmitValue(MCConstantExpr::create(Value, getContext()), Size);
 }
 
+void MCAsmStreamer::EmitIntValueInHex(uint64_t Value, unsigned Size) {
+  EmitValue(MCConstantExpr::create(Value, getContext(), true), Size);
+}
+
 void MCAsmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
                                   SMLoc Loc) {
   assert(Size <= 8 && "Invalid size");
index b3384599635ecee77b7dc75f43ecbf9d5c35d10a..ab53ed42778e362da0b7af6df02e4429606f10d0 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "llvm/MC/MCExpr.h"
 #include "llvm/ADT/Statistic.h"
+#include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/Config/llvm-config.h"
 #include "llvm/MC/MCAsmBackend.h"
@@ -42,10 +43,15 @@ void MCExpr::print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens) const {
   switch (getKind()) {
   case MCExpr::Target:
     return cast<MCTargetExpr>(this)->printImpl(OS, MAI);
-  case MCExpr::Constant:
-    OS << cast<MCConstantExpr>(*this).getValue();
+  case MCExpr::Constant: {
+    auto Value = cast<MCConstantExpr>(*this).getValue();
+    auto PrintInHex = cast<MCConstantExpr>(*this).useHexFormat();
+    if (PrintInHex)
+      OS << "0x" << Twine::utohexstr(Value);
+    else
+      OS << Value;
     return;
-
+  }
   case MCExpr::SymbolRef: {
     const MCSymbolRefExpr &SRE = cast<MCSymbolRefExpr>(*this);
     const MCSymbol &Sym = SRE.getSymbol();
@@ -160,8 +166,9 @@ const MCUnaryExpr *MCUnaryExpr::create(Opcode Opc, const MCExpr *Expr,
   return new (Ctx) MCUnaryExpr(Opc, Expr, Loc);
 }
 
-const MCConstantExpr *MCConstantExpr::create(int64_t Value, MCContext &Ctx) {
-  return new (Ctx) MCConstantExpr(Value);
+const MCConstantExpr *MCConstantExpr::create(int64_t Value, MCContext &Ctx,
+                                             bool PrintInHex) {
+  return new (Ctx) MCConstantExpr(Value, PrintInHex);
 }
 
 /* *** */
index a6131988b1c7db708ff7556c33b73bbaa2b21e1f..3b62a3920f48020ee5c80fb70f9a67d334a37507 100644 (file)
 ; ASM: .section        .debug$T,"dr"
 ; ASM: .p2align        2
 ; ASM: .long   4                       # Debug section magic
-; ASM: .short  18                      # Record length
-; ASM: .short  4609                    # Record kind: LF_ARGLIST
-; ASM: .long   3                       # NumArgs
-; ASM: .long   64                      # Argument
-; ASM: .long   65                      # Argument
-; ASM: .long   19                      # Argument
+; ASM: .short  0x12                    # Record length
+; ASM: .short  0x1201                  # Record kind: LF_ARGLIST
+; ASM: .long   0x3                     # NumArgs
+; ASM: .long   0x40                    # Argument
+; ASM: .long   0x41                    # Argument
+; ASM: .long   0x13                    # Argument
 ; ASM: # ArgList (0x1000) {
 ; ASM: #   TypeLeafKind: LF_ARGLIST (0x1201)
 ; ASM: #   NumArgs: 3
 ; ASM: #     ArgType: __int64 (0x13)
 ; ASM: #   ]
 ; ASM: # }
-; ASM: .short  14                      # Record length
-; ASM: .short  4104                    # Record kind: LF_PROCEDURE
-; ASM: .long   3                       # ReturnType
-; ASM: .byte   0                       # CallingConvention
-; ASM: .byte   0                       # FunctionOptions
-; ASM: .short  3                       # NumParameters
-; ASM: .long   4096                    # ArgListType
+; ASM: .short  0xe                     # Record length
+; ASM: .short  0x1008                  # Record kind: LF_PROCEDURE
+; ASM: .long   0x3                     # ReturnType
+; ASM: .byte   0x0                     # CallingConvention
+; ASM: .byte   0x0                     # FunctionOptions
+; ASM: .short  0x3                     # NumParameters
+; ASM: .long   0x1000                  # ArgListType
 ; ASM: # Procedure (0x1001) {
 ; ASM: #   TypeLeafKind: LF_PROCEDURE (0x1008)
 ; ASM: #   ReturnType: void (0x3)
 ; ASM: #   NumParameters: 3
 ; ASM: #   ArgListType: (float, double, __int64) (0x1000)
 ; ASM: # }
-; ASM: .short  14                      # Record length
-; ASM: .short  5633                    # Record kind: LF_FUNC_ID
-; ASM: .long   0                       # ParentScope
-; ASM: .long   4097                    # FunctionType
+; ASM: .short  0xe                     # Record length
+; ASM: .short  0x1601                  # Record kind: LF_FUNC_ID
+; ASM: .long   0x0                     # ParentScope
+; ASM: .long   0x1001                  # FunctionType
 ; ASM: .asciz  "f"                     # Name
 ; ASM: .byte   242
 ; ASM: .byte   241
 ; ASM: #   FunctionType: void (float, double, __int64) (0x1001)
 ; ASM: #   Name: f
 ; ASM: # }
-; ASM: .short  10                      # Record length
-; ASM: .short  4097                    # Record kind: LF_MODIFIER
-; ASM: .long   116                     # ModifiedType
-; ASM: .short  1                       # Modifiers
+; ASM: .short  0xa                     # Record length
+; ASM: .short  0x1001                  # Record kind: LF_MODIFIER
+; ASM: .long   0x74                    # ModifiedType
+; ASM: .short  0x1                     # Modifiers
 ; ASM: .byte   242
 ; ASM: .byte   241
 ; ASM: # Modifier (0x1003) {
 ; ASM: #     Const (0x1)
 ; ASM: #   ]
 ; ASM: # }
-; ASM: .short  10                      # Record length
-; ASM: .short  4098                    # Record kind: LF_POINTER
-; ASM: .long   4099                    # PointeeType
-; ASM: .long   65548                   # Attributes
+; ASM: .short  0xa                     # Record length
+; ASM: .short  0x1002                  # Record kind: LF_POINTER
+; ASM: .long   0x1003                  # PointeeType
+; ASM: .long   0x1000c                 # Attributes
 ; ASM: # Pointer (0x1004) {
 ; ASM: #   TypeLeafKind: LF_POINTER (0x1002)
 ; ASM: #   PointeeType: const int (0x1003)
 ; ASM: #   IsThisPtr&&: 0
 ; ASM: #   SizeOf: 8
 ; ASM: # }
-; ASM: .short  22                      # Record length
-; ASM: .short  5381                    # Record kind: LF_STRUCTURE
-; ASM: .short  0                       # MemberCount
-; ASM: .short  128                     # Properties
-; ASM: .long   0                       # FieldList
-; ASM: .long   0                       # DerivedFrom
-; ASM: .long   0                       # VShape
-; ASM: .short  0                       # SizeOf
+; ASM: .short  0x16                    # Record length
+; ASM: .short  0x1505                  # Record kind: LF_STRUCTURE
+; ASM: .short  0x0                     # MemberCount
+; ASM: .short  0x80                    # Properties
+; ASM: .long   0x0                     # FieldList
+; ASM: .long   0x0                     # DerivedFrom
+; ASM: .long   0x0                     # VShape
+; ASM: .short  0x0                     # SizeOf
 ; ASM: .asciz  "A"                     # Name
 ; ASM: # Struct (0x1005) {
 ; ASM: #   TypeLeafKind: LF_STRUCTURE (0x1505)
 ; ASM: #   SizeOf: 0
 ; ASM: #   Name: A
 ; ASM: # }
-; ASM: .short  18                      # Record length
-; ASM: .short  4098                    # Record kind: LF_POINTER
-; ASM: .long   116                     # PointeeType
-; ASM: .long   32844                   # Attributes
-; ASM: .long   4101                    # ClassType
-; ASM: .short  4                       # Representation
+; ASM: .short  0x12                    # Record length
+; ASM: .short  0x1002                  # Record kind: LF_POINTER
+; ASM: .long   0x74                    # PointeeType
+; ASM: .long   0x804c                  # Attributes
+; ASM: .long   0x1005                  # ClassType
+; ASM: .short  0x4                     # Representation
 ; ASM: .byte   242
 ; ASM: .byte   241
 ; ASM: # Pointer (0x1006) {
 ; ASM: #   ClassType: A (0x1005)
 ; ASM: #   Representation: GeneralData (0x4)
 ; ASM: # }
-; ASM: .short  10                      # Record length
-; ASM: .short  4098                    # Record kind: LF_POINTER
-; ASM: .long   4101                    # PointeeType
-; ASM: .long   66572                   # Attributes
+; ASM: .short  0xa                     # Record length
+; ASM: .short  0x1002                  # Record kind: LF_POINTER
+; ASM: .long   0x1005                  # PointeeType
+; ASM: .long   0x1040c                 # Attributes
 ; ASM: # Pointer (0x1007) {
 ; ASM: #   TypeLeafKind: LF_POINTER (0x1002)
 ; ASM: #   PointeeType: A (0x1005)
 ; ASM: #   IsThisPtr&&: 0
 ; ASM: #   SizeOf: 8
 ; ASM: # }
-; ASM: .short  6                       # Record length
-; ASM: .short  4609                    # Record kind: LF_ARGLIST
-; ASM: .long   0                       # NumArgs
+; ASM: .short  0x6                     # Record length
+; ASM: .short  0x1201                  # Record kind: LF_ARGLIST
+; ASM: .long   0x0                     # NumArgs
 ; ASM: # ArgList (0x1008) {
 ; ASM: #   TypeLeafKind: LF_ARGLIST (0x1201)
 ; ASM: #   NumArgs: 0
 ; ASM: #   Arguments [
 ; ASM: #   ]
 ; ASM: # }
-; ASM: .short  26                      # Record length
-; ASM: .short  4105                    # Record kind: LF_MFUNCTION
-; ASM: .long   3                       # ReturnType
-; ASM: .long   4101                    # ClassType
-; ASM: .long   4103                    # ThisType
-; ASM: .byte   0                       # CallingConvention
-; ASM: .byte   0                       # FunctionOptions
-; ASM: .short  0                       # NumParameters
-; ASM: .long   4104                    # ArgListType
-; ASM: .long   0                       # ThisAdjustment
+; ASM: .short  0x1a                    # Record length
+; ASM: .short  0x1009                  # Record kind: LF_MFUNCTION
+; ASM: .long   0x3                     # ReturnType
+; ASM: .long   0x1005                  # ClassType
+; ASM: .long   0x1007                  # ThisType
+; ASM: .byte   0x0                     # CallingConvention
+; ASM: .byte   0x0                     # FunctionOptions
+; ASM: .short  0x0                     # NumParameters
+; ASM: .long   0x1008                  # ArgListType
+; ASM: .long   0x0                     # ThisAdjustment
 ; ASM: # MemberFunction (0x1009) {
 ; ASM: #   TypeLeafKind: LF_MFUNCTION (0x1009)
 ; ASM: #   ReturnType: void (0x3)
 ; ASM: #   ArgListType: () (0x1008)
 ; ASM: #   ThisAdjustment: 0
 ; ASM: # }
-; ASM: .short  30                      # Record length
-; ASM: .short  4611                    # Record kind: LF_FIELDLIST
+; ASM: .short  0x1e                    # Record length
+; ASM: .short  0x1203                  # Record kind: LF_FIELDLIST
 ; ASM: .byte   0x0d, 0x15, 0x03, 0x00
 ; ASM: .byte   0x74, 0x00, 0x00, 0x00
 ; ASM: .byte   0x00, 0x00, 0x61, 0x00
 ; ASM: #     Name: A::f
 ; ASM: #   }
 ; ASM: # }
-; ASM: .short  22                      # Record length
-; ASM: .short  5381                    # Record kind: LF_STRUCTURE
-; ASM: .short  2                       # MemberCount
-; ASM: .short  0                       # Properties
-; ASM: .long   4106                    # FieldList
-; ASM: .long   0                       # DerivedFrom
-; ASM: .long   0                       # VShape
-; ASM: .short  4                       # SizeOf
+; ASM: .short  0x16                    # Record length
+; ASM: .short  0x1505                  # Record kind: LF_STRUCTURE
+; ASM: .short  0x2                     # MemberCount
+; ASM: .short  0x0                     # Properties
+; ASM: .long   0x100a                  # FieldList
+; ASM: .long   0x0                     # DerivedFrom
+; ASM: .long   0x0                     # VShape
+; ASM: .short  0x4                     # SizeOf
 ; ASM: .asciz  "A"                     # Name
 ; ASM: # Struct (0x100B) {
 ; ASM: #   TypeLeafKind: LF_STRUCTURE (0x1505)
 ; ASM: #   SizeOf: 4
 ; ASM: #   Name: A
 ; ASM: # }
-; ASM: .short  30                      # Record length
-; ASM: .short  5637                    # Record kind: LF_STRING_ID
-; ASM: .long   0                       # Id
+; ASM: .short  0x1e                    # Record length
+; ASM: .short  0x1605                  # Record kind: LF_STRING_ID
+; ASM: .long   0x0                     # Id
 ; ASM: .asciz  "D:\\src\\llvm\\build\\t.cpp" # StringData
 ; ASM: # StringId (0x100C) {
 ; ASM: #   TypeLeafKind: LF_STRING_ID (0x1605)
 ; ASM: #   Id: 0x0
 ; ASM: #   StringData: D:\src\llvm\build\t.cpp
 ; ASM: # }
-; ASM: .short  14                      # Record length
-; ASM: .short  5638                    # Record kind: LF_UDT_SRC_LINE
-; ASM: .long   4107                    # UDT
-; ASM: .long   4108                    # SourceFile
-; ASM: .long   1                       # LineNumber
+; ASM: .short  0xe                     # Record length
+; ASM: .short  0x1606                  # Record kind: LF_UDT_SRC_LINE
+; ASM: .long   0x100b                  # UDT
+; ASM: .long   0x100c                  # SourceFile
+; ASM: .long   0x1                     # LineNumber
 ; ASM: # UdtSourceLine (0x100D) {
 ; ASM: #   TypeLeafKind: LF_UDT_SRC_LINE (0x1606)
 ; ASM: #   UDT: A (0x100B)
 ; ASM: #   SourceFile: D:\src\llvm\build\t.cpp (0x100C)
 ; ASM: #   LineNumber: 1
 ; ASM: # }
-; ASM: .short  18                      # Record length
-; ASM: .short  4098                    # Record kind: LF_POINTER
-; ASM: .long   4105                    # PointeeType
-; ASM: .long   65644                   # Attributes
-; ASM: .long   4101                    # ClassType
-; ASM: .short  8                       # Representation
+; ASM: .short  0x12                    # Record length
+; ASM: .short  0x1002                  # Record kind: LF_POINTER
+; ASM: .long   0x1009                  # PointeeType
+; ASM: .long   0x1006c                 # Attributes
+; ASM: .long   0x1005                  # ClassType
+; ASM: .short  0x8                     # Representation
 ; ASM: .byte   242
 ; ASM: .byte   241
 ; ASM: # Pointer (0x100E) {
 ; ASM: #   ClassType: A (0x1005)
 ; ASM: #   Representation: GeneralFunction (0x8)
 ; ASM: # }
-; ASM: .short  10                      # Record length
-; ASM: .short  4097                    # Record kind: LF_MODIFIER
-; ASM: .long   3                       # ModifiedType
-; ASM: .short  1                       # Modifiers
+; ASM: .short  0xa                     # Record length
+; ASM: .short  0x1001                  # Record kind: LF_MODIFIER
+; ASM: .long   0x3                     # ModifiedType
+; ASM: .short  0x1                     # Modifiers
 ; ASM: .byte   242
 ; ASM: .byte   241
 ; ASM: # Modifier (0x100F) {
 ; ASM: #     Const (0x1)
 ; ASM: #   ]
 ; ASM: # }
-; ASM: .short  10                      # Record length
-; ASM: .short  4098                    # Record kind: LF_POINTER
-; ASM: .long   4111                    # PointeeType
-; ASM: .long   65548                   # Attributes
+; ASM: .short  0xa                     # Record length
+; ASM: .short  0x1002                  # Record kind: LF_POINTER
+; ASM: .long   0x100f                  # PointeeType
+; ASM: .long   0x1000c                 # Attributes
 ; ASM: # Pointer (0x1010) {
 ; ASM: #   TypeLeafKind: LF_POINTER (0x1002)
 ; ASM: #   PointeeType: const void (0x100F)
 ; ASM: #   IsThisPtr&&: 0
 ; ASM: #   SizeOf: 8
 ; ASM: # }
-; ASM: .short  14                      # Record length
-; ASM: .short  4104                    # Record kind: LF_PROCEDURE
-; ASM: .long   3                       # ReturnType
-; ASM: .byte   0                       # CallingConvention
-; ASM: .byte   0                       # FunctionOptions
-; ASM: .short  0                       # NumParameters
-; ASM: .long   4104                    # ArgListType
+; ASM: .short  0xe                     # Record length
+; ASM: .short  0x1008                  # Record kind: LF_PROCEDURE
+; ASM: .long   0x3                     # ReturnType
+; ASM: .byte   0x0                     # CallingConvention
+; ASM: .byte   0x0                     # FunctionOptions
+; ASM: .short  0x0                     # NumParameters
+; ASM: .long   0x1008                  # ArgListType
 ; ASM: # Procedure (0x1011) {
 ; ASM: #   TypeLeafKind: LF_PROCEDURE (0x1008)
 ; ASM: #   ReturnType: void (0x3)
 ; ASM: #   NumParameters: 0
 ; ASM: #   ArgListType: () (0x1008)
 ; ASM: # }
-; ASM: .short  22                      # Record length
-; ASM: .short  5633                    # Record kind: LF_FUNC_ID
-; ASM: .long   0                       # ParentScope
-; ASM: .long   4113                    # FunctionType
+; ASM: .short  0x16                    # Record length
+; ASM: .short  0x1601                  # Record kind: LF_FUNC_ID
+; ASM: .long   0x0                     # ParentScope
+; ASM: .long   0x1011                  # FunctionType
 ; ASM: .asciz  "CharTypes"             # Name
 ; ASM: .byte   242
 ; ASM: .byte   241
 ; ASM: #   FunctionType: void () (0x1011)
 ; ASM: #   Name: CharTypes
 ; ASM: # }
-; ASM: .short  26                      # Record length
-; ASM: .short  5637                    # Record kind: LF_STRING_ID
-; ASM: .long   0                       # Id
+; ASM: .short  0x1a                    # Record length
+; ASM: .short  0x1605                  # Record kind: LF_STRING_ID
+; ASM: .long   0x0                     # Id
 ; ASM: .asciz  "D:\\src\\llvm\\build"  # StringData
 ; ASM: .byte   242
 ; ASM: .byte   241
 ; ASM: #   Id: 0x0
 ; ASM: #   StringData: D:\src\llvm\build
 ; ASM: # }
-; ASM: .short  14                      # Record length
-; ASM: .short  5637                    # Record kind: LF_STRING_ID
-; ASM: .long   0                       # Id
+; ASM: .short  0xe                     # Record length
+; ASM: .short  0x1605                  # Record kind: LF_STRING_ID
+; ASM: .long   0x0                     # Id
 ; ASM: .asciz  "t.cpp"                 # StringData
 ; ASM: .byte   242
 ; ASM: .byte   241
 ; ASM: #   Id: 0x0
 ; ASM: #   StringData: t.cpp
 ; ASM: # }
-; ASM: .short  26                      # Record length
-; ASM: .short  5635                    # Record kind: LF_BUILDINFO
-; ASM: .short  5                       # NumArgs
-; ASM: .long   4115                    # Argument
-; ASM: .long   0                       # Argument
-; ASM: .long   4116                    # Argument
-; ASM: .long   0                       # Argument
-; ASM: .long   0                       # Argument
+; ASM: .short  0x1a                    # Record length
+; ASM: .short  0x1603                  # Record kind: LF_BUILDINFO
+; ASM: .short  0x5                     # NumArgs
+; ASM: .long   0x1013                  # Argument
+; ASM: .long   0x0                     # Argument
+; ASM: .long   0x1014                  # Argument
+; ASM: .long   0x0                     # Argument
+; ASM: .long   0x0                     # Argument
 ; ASM: .byte   242
 ; ASM: .byte   241
 ; ASM: # BuildInfo (0x1015) {