[llvm] r323641 - Refactor dwarfdump -apple-names output

Pavel Labath via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 29 03:33:17 PST 2018


Author: labath
Date: Mon Jan 29 03:33:17 2018
New Revision: 323641

URL: http://llvm.org/viewvc/llvm-project?rev=323641&view=rev
Log:
Refactor dwarfdump -apple-names output

Summary:
This modifies the dwarfdump output to align it with the new .debug_names
dump. It also renames two header fields to match similar fields in the
dwarf5 header.

A couple of tests needed to be updated to match new output. The changes
were fairly straight-forward, although not really automatable.

Reviewers: JDevlieghere, aprantl

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D42415

Modified:
    llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h
    llvm/trunk/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
    llvm/trunk/test/DebugInfo/Generic/accel-table-hash-collisions.ll
    llvm/trunk/test/DebugInfo/Generic/cross-cu-inlining.ll
    llvm/trunk/test/DebugInfo/dwarfdump-accel.test

Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h?rev=323641&r1=323640&r2=323641&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h Mon Jan 29 03:33:17 2018
@@ -54,9 +54,11 @@ class AppleAcceleratorTable : public DWA
     uint32_t Magic;
     uint16_t Version;
     uint16_t HashFunction;
-    uint32_t NumBuckets;
-    uint32_t NumHashes;
+    uint32_t BucketCount;
+    uint32_t HashCount;
     uint32_t HeaderDataLength;
+
+    void dump(ScopedPrinter &W) const;
   };
 
   struct HeaderData {
@@ -71,6 +73,11 @@ class AppleAcceleratorTable : public DWA
   struct HeaderData HdrData;
   bool IsValid = false;
 
+  /// Returns true if we should continue scanning for entries or false if we've
+  /// reached the last (sentinel) entry of encountered a parsing error.
+  bool dumpName(ScopedPrinter &W, SmallVectorImpl<DWARFFormValue> &AtomForms,
+                uint32_t *DataOffset) const;
+
 public:
   /// An iterator for the entries associated with one key. Each entry can have
   /// multiple DWARFFormValues.

Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp?rev=323641&r1=323640&r2=323641&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp Mon Jan 29 03:33:17 2018
@@ -67,8 +67,8 @@ llvm::Error AppleAcceleratorTable::extra
   Hdr.Magic = AccelSection.getU32(&Offset);
   Hdr.Version = AccelSection.getU16(&Offset);
   Hdr.HashFunction = AccelSection.getU16(&Offset);
-  Hdr.NumBuckets = AccelSection.getU32(&Offset);
-  Hdr.NumHashes = AccelSection.getU32(&Offset);
+  Hdr.BucketCount = AccelSection.getU32(&Offset);
+  Hdr.HashCount = AccelSection.getU32(&Offset);
   Hdr.HeaderDataLength = AccelSection.getU32(&Offset);
 
   // Check that we can read all the hashes and offsets from the
@@ -76,7 +76,7 @@ llvm::Error AppleAcceleratorTable::extra
   // We need to substract one because we're checking for an *offset* which is
   // equal to the size for an empty table and hence pointer after the section.
   if (!AccelSection.isValidOffset(sizeof(Hdr) + Hdr.HeaderDataLength +
-                                  Hdr.NumBuckets * 4 + Hdr.NumHashes * 8 - 1))
+                                  Hdr.BucketCount * 4 + Hdr.HashCount * 8 - 1))
     return make_error<StringError>(
         "Section too small: cannot read buckets and hashes.",
         inconvertibleErrorCode());
@@ -94,8 +94,8 @@ llvm::Error AppleAcceleratorTable::extra
   return Error::success();
 }
 
-uint32_t AppleAcceleratorTable::getNumBuckets() { return Hdr.NumBuckets; }
-uint32_t AppleAcceleratorTable::getNumHashes() { return Hdr.NumHashes; }
+uint32_t AppleAcceleratorTable::getNumBuckets() { return Hdr.BucketCount; }
+uint32_t AppleAcceleratorTable::getNumHashes() { return Hdr.HashCount; }
 uint32_t AppleAcceleratorTable::getSizeHdr() { return sizeof(Hdr); }
 uint32_t AppleAcceleratorTable::getHeaderDataLength() {
   return Hdr.HeaderDataLength;
@@ -149,78 +149,101 @@ AppleAcceleratorTable::readAtoms(uint32_
   return {DieOffset, DieTag};
 }
 
+void AppleAcceleratorTable::Header::dump(ScopedPrinter &W) const {
+  DictScope HeaderScope(W, "Header");
+  W.printHex("Magic", Magic);
+  W.printHex("Version", Version);
+  W.printHex("Hash function", HashFunction);
+  W.printNumber("Bucket count", BucketCount);
+  W.printNumber("Hashes count", HashCount);
+  W.printNumber("HeaderData length", HeaderDataLength);
+}
+
+bool AppleAcceleratorTable::dumpName(ScopedPrinter &W,
+                                     SmallVectorImpl<DWARFFormValue> &AtomForms,
+                                     uint32_t *DataOffset) const {
+  DWARFFormParams FormParams = {Hdr.Version, 0, dwarf::DwarfFormat::DWARF32};
+  uint32_t NameOffset = *DataOffset;
+  if (!AccelSection.isValidOffsetForDataOfSize(*DataOffset, 4)) {
+    W.printString("Incorrectly terminated list.");
+    return false;
+  }
+  unsigned StringOffset = AccelSection.getRelocatedValue(4, DataOffset);
+  if (!StringOffset)
+    return false; // End of list
+
+  DictScope NameScope(W, ("Name at 0x" + Twine::utohexstr(NameOffset)).str());
+  W.startLine() << format("String: 0x%08x", StringOffset);
+  W.getOStream() << " \"" << StringSection.getCStr(&StringOffset) << "\"\n";
+
+  unsigned NumData = AccelSection.getU32(DataOffset);
+  for (unsigned Data = 0; Data < NumData; ++Data) {
+    ListScope DataScope(W, ("Data " + Twine(Data)).str());
+    unsigned i = 0;
+    for (auto &Atom : AtomForms) {
+      W.startLine() << format("Atom[%d]: ", i++);
+      if (Atom.extractValue(AccelSection, DataOffset, FormParams))
+        Atom.dump(W.getOStream());
+      else
+        W.getOStream() << "Error extracting the value";
+      W.getOStream() << "\n";
+    }
+  }
+  return true; // more entries follow
+}
+
 LLVM_DUMP_METHOD void AppleAcceleratorTable::dump(raw_ostream &OS) const {
   if (!IsValid)
     return;
 
-  // Dump the header.
-  OS << "Magic = " << format("0x%08x", Hdr.Magic) << '\n'
-     << "Version = " << format("0x%04x", Hdr.Version) << '\n'
-     << "Hash function = " << format("0x%08x", Hdr.HashFunction) << '\n'
-     << "Bucket count = " << Hdr.NumBuckets << '\n'
-     << "Hashes count = " << Hdr.NumHashes << '\n'
-     << "HeaderData length = " << Hdr.HeaderDataLength << '\n'
-     << "DIE offset base = " << HdrData.DIEOffsetBase << '\n'
-     << "Number of atoms = " << HdrData.Atoms.size() << '\n';
+  ScopedPrinter W(OS);
+
+  Hdr.dump(W);
 
-  unsigned i = 0;
+  W.printNumber("DIE offset base", HdrData.DIEOffsetBase);
+  W.printNumber("Number of atoms", HdrData.Atoms.size());
   SmallVector<DWARFFormValue, 3> AtomForms;
-  for (const auto &Atom: HdrData.Atoms) {
-    OS << format("Atom[%d] Type: ", i++) << formatAtom(Atom.first)
-       << " Form: " << formatForm(Atom.second) << '\n';
-    AtomForms.push_back(DWARFFormValue(Atom.second));
+  {
+    ListScope AtomsScope(W, "Atoms");
+    unsigned i = 0;
+    for (const auto &Atom : HdrData.Atoms) {
+      DictScope AtomScope(W, ("Atom " + Twine(i++)).str());
+      W.startLine() << "Type: " << formatAtom(Atom.first) << '\n';
+      W.startLine() << "Form: " << formatForm(Atom.second) << '\n';
+      AtomForms.push_back(DWARFFormValue(Atom.second));
+    }
   }
 
   // Now go through the actual tables and dump them.
   uint32_t Offset = sizeof(Hdr) + Hdr.HeaderDataLength;
-  unsigned HashesBase = Offset + Hdr.NumBuckets * 4;
-  unsigned OffsetsBase = HashesBase + Hdr.NumHashes * 4;
-  DWARFFormParams FormParams = {Hdr.Version, 0, dwarf::DwarfFormat::DWARF32};
+  unsigned HashesBase = Offset + Hdr.BucketCount * 4;
+  unsigned OffsetsBase = HashesBase + Hdr.HashCount * 4;
 
-  for (unsigned Bucket = 0; Bucket < Hdr.NumBuckets; ++Bucket) {
+  for (unsigned Bucket = 0; Bucket < Hdr.BucketCount; ++Bucket) {
     unsigned Index = AccelSection.getU32(&Offset);
 
-    OS << format("Bucket[%d]\n", Bucket);
+    ListScope BucketScope(W, ("Bucket " + Twine(Bucket)).str());
     if (Index == UINT32_MAX) {
-      OS << "  EMPTY\n";
+      W.printString("EMPTY");
       continue;
     }
 
-    for (unsigned HashIdx = Index; HashIdx < Hdr.NumHashes; ++HashIdx) {
+    for (unsigned HashIdx = Index; HashIdx < Hdr.HashCount; ++HashIdx) {
       unsigned HashOffset = HashesBase + HashIdx*4;
       unsigned OffsetsOffset = OffsetsBase + HashIdx*4;
       uint32_t Hash = AccelSection.getU32(&HashOffset);
 
-      if (Hash % Hdr.NumBuckets != Bucket)
+      if (Hash % Hdr.BucketCount != Bucket)
         break;
 
       unsigned DataOffset = AccelSection.getU32(&OffsetsOffset);
-      OS << format("  Hash = 0x%08x Offset = 0x%08x\n", Hash, DataOffset);
+      ListScope HashScope(W, ("Hash 0x" + Twine::utohexstr(Hash)).str());
       if (!AccelSection.isValidOffset(DataOffset)) {
-        OS << "    Invalid section offset\n";
+        W.printString("Invalid section offset");
         continue;
       }
-      while (AccelSection.isValidOffsetForDataOfSize(DataOffset, 4)) {
-        unsigned StringOffset = AccelSection.getRelocatedValue(4, &DataOffset);
-        if (!StringOffset)
-          break;
-        OS << format("    Name: %08x \"%s\"\n", StringOffset,
-                     StringSection.getCStr(&StringOffset));
-        unsigned NumData = AccelSection.getU32(&DataOffset);
-        for (unsigned Data = 0; Data < NumData; ++Data) {
-          OS << format("    Data[%d] => ", Data);
-          unsigned i = 0;
-          for (auto &Atom : AtomForms) {
-            OS << format("{Atom[%d]: ", i++);
-            if (Atom.extractValue(AccelSection, &DataOffset, FormParams))
-              Atom.dump(OS);
-            else
-              OS << "Error extracting the value";
-            OS << "} ";
-          }
-          OS << '\n';
-        }
-      }
+      while (dumpName(W, AtomForms, &DataOffset))
+        /*empty*/;
     }
   }
 }
@@ -261,21 +284,21 @@ AppleAcceleratorTable::equal_range(Strin
 
   // Find the bucket.
   unsigned HashValue = djbHash(Key);
-  unsigned Bucket = HashValue % Hdr.NumBuckets;
+  unsigned Bucket = HashValue % Hdr.BucketCount;
   unsigned BucketBase = sizeof(Hdr) + Hdr.HeaderDataLength;
-  unsigned HashesBase = BucketBase + Hdr.NumBuckets * 4;
-  unsigned OffsetsBase = HashesBase + Hdr.NumHashes * 4;
+  unsigned HashesBase = BucketBase + Hdr.BucketCount * 4;
+  unsigned OffsetsBase = HashesBase + Hdr.HashCount * 4;
 
   unsigned BucketOffset = BucketBase + Bucket * 4;
   unsigned Index = AccelSection.getU32(&BucketOffset);
 
   // Search through all hashes in the bucket.
-  for (unsigned HashIdx = Index; HashIdx < Hdr.NumHashes; ++HashIdx) {
+  for (unsigned HashIdx = Index; HashIdx < Hdr.HashCount; ++HashIdx) {
     unsigned HashOffset = HashesBase + HashIdx * 4;
     unsigned OffsetsOffset = OffsetsBase + HashIdx * 4;
     uint32_t Hash = AccelSection.getU32(&HashOffset);
 
-    if (Hash % Hdr.NumBuckets != Bucket)
+    if (Hash % Hdr.BucketCount != Bucket)
       // We are already in the next bucket.
       break;
 

Modified: llvm/trunk/test/DebugInfo/Generic/accel-table-hash-collisions.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Generic/accel-table-hash-collisions.ll?rev=323641&r1=323640&r2=323641&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/Generic/accel-table-hash-collisions.ll (original)
+++ llvm/trunk/test/DebugInfo/Generic/accel-table-hash-collisions.ll Mon Jan 29 03:33:17 2018
@@ -23,33 +23,33 @@
 ; int _ZN4llvm22MachineModuleInfoMachOD2Ev;
 
 ; Check that we have the right amount of hashes.
-; CHECK: Bucket count = 6
-; CHECK: Hashes count = 6
+; CHECK: Bucket count: 6
+; CHECK: Hashes count: 6
 
 ; Check that all the names are present in the output
-; CHECK:  Hash = 0x00597841
-; CHECK:    Name: {{[0-9a-f]*}} "is"
-; CHECK:    Name: {{[0-9a-f]*}} "k1"
-
-; CHECK: Hash = 0xa4b42a1e
-; CHECK:    Name: {{[0-9a-f]*}} "_ZN5clang23DataRecursiveASTVisitorIN12_GLOBAL__N_124UnusedBackingIvarCheckerEE26TraverseCUDAKernelCallExprEPNS_18CUDAKernelCallExprE"
-; CHECK:    Name: {{[0-9a-f]*}} "_ZN4llvm16DenseMapIteratorIPNS_10MDLocationENS_6detail13DenseSetEmptyENS_10MDNodeInfoIS1_EENS3_12DenseSetPairIS2_EELb0EE23AdvancePastEmptyBucketsEv"
-
-; CHECK: Hash = 0xeee7c0b2
-; CHECK:    Name: {{[0-9a-f]*}} "_ZNK4llvm12LivePhysRegs5printERNS_11raw_ostreamE"
-; CHECK:    Name: {{[0-9a-f]*}} "_ZN4llvm15ScalarEvolution14getSignedRangeEPKNS_4SCEVE"
-
-; CHECK: Hash = 0xea48ac5f
-; CHECK:    Name: {{[0-9a-f]*}} "ForceTopDown"
-; CHECK:    Name: {{[0-9a-f]*}} "_ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeIPN4llvm10BasicBlockEPNS4_10RegionNodeEEEPvEEEEE11__constructIS9_JNS_4pairIS6_S8_EEEEEvNS_17integral_constantIbLb1EEERSC_PT_DpOT0_"
-
-; CHECK:  Hash = 0x6b22f71f
-; CHECK:    Name: {{[0-9a-f]*}} "_ZNK5clang12OverrideAttr5cloneERNS_10ASTContextE"
-; CHECK:    Name: {{[0-9a-f]*}} "_ZN4llvm22MachineModuleInfoMachOD2Ev"
-
-; CHECK:  Hash = 0x8c248979
-; CHECK:    Name: {{[0-9a-f]*}} "setStmt"
-; CHECK:    Name: {{[0-9a-f]*}} "_ZN4llvm5TwineC1Ei"
+; CHECK:  Hash 0x597841
+; CHECK:    String: 0x{{[0-9a-f]*}} "is"
+; CHECK:    String: 0x{{[0-9a-f]*}} "k1"
+
+; CHECK: Hash 0xa4b42a1e
+; CHECK:    String: 0x{{[0-9a-f]*}} "_ZN5clang23DataRecursiveASTVisitorIN12_GLOBAL__N_124UnusedBackingIvarCheckerEE26TraverseCUDAKernelCallExprEPNS_18CUDAKernelCallExprE"
+; CHECK:    String: 0x{{[0-9a-f]*}} "_ZN4llvm16DenseMapIteratorIPNS_10MDLocationENS_6detail13DenseSetEmptyENS_10MDNodeInfoIS1_EENS3_12DenseSetPairIS2_EELb0EE23AdvancePastEmptyBucketsEv"
+
+; CHECK: Hash 0xeee7c0b2
+; CHECK:    String: 0x{{[0-9a-f]*}} "_ZNK4llvm12LivePhysRegs5printERNS_11raw_ostreamE"
+; CHECK:    String: 0x{{[0-9a-f]*}} "_ZN4llvm15ScalarEvolution14getSignedRangeEPKNS_4SCEVE"
+
+; CHECK: Hash 0xea48ac5f
+; CHECK:    String: 0x{{[0-9a-f]*}} "ForceTopDown"
+; CHECK:    String: 0x{{[0-9a-f]*}} "_ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeIPN4llvm10BasicBlockEPNS4_10RegionNodeEEEPvEEEEE11__constructIS9_JNS_4pairIS6_S8_EEEEEvNS_17integral_constantIbLb1EEERSC_PT_DpOT0_"
+
+; CHECK:  Hash 0x6b22f71f
+; CHECK:    String: 0x{{[0-9a-f]*}} "_ZNK5clang12OverrideAttr5cloneERNS_10ASTContextE"
+; CHECK:    String: 0x{{[0-9a-f]*}} "_ZN4llvm22MachineModuleInfoMachOD2Ev"
+
+; CHECK:  Hash 0x8c248979
+; CHECK:    String: 0x{{[0-9a-f]*}} "setStmt"
+; CHECK:    String: 0x{{[0-9a-f]*}} "_ZN4llvm5TwineC1Ei"
 
 source_filename = "test/DebugInfo/Generic/accel-table-hash-collisions.ll"
 

Modified: llvm/trunk/test/DebugInfo/Generic/cross-cu-inlining.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Generic/cross-cu-inlining.ll?rev=323641&r1=323640&r2=323641&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/Generic/cross-cu-inlining.ll (original)
+++ llvm/trunk/test/DebugInfo/Generic/cross-cu-inlining.ll Mon Jan 29 03:33:17 2018
@@ -57,10 +57,10 @@
 ; correctly referenced in the accelerator table. Before r221837, the one
 ; in the second compilation unit had a wrong offset
 ; CHECK-ACCEL: .apple_names contents:
-; CHECK-ACCEL: Name{{.*}}"func"
-; CHECK-ACCEL-NOT: Name
+; CHECK-ACCEL: String{{.*}}"func"
+; CHECK-ACCEL-NOT: String
 ; CHECK-ACCEL: Atom[0]{{.*}}[[INLINED]]
-; CHECK-ACCEL-NOT: Name
+; CHECK-ACCEL-NOT: String
 ; CHECK-ACCEL: Atom[0]{{.*}}[[FUNC]]
 
 @i = external global i32

Modified: llvm/trunk/test/DebugInfo/dwarfdump-accel.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/dwarfdump-accel.test?rev=323641&r1=323640&r2=323641&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/dwarfdump-accel.test (original)
+++ llvm/trunk/test/DebugInfo/dwarfdump-accel.test Mon Jan 29 03:33:17 2018
@@ -19,39 +19,42 @@ CHECK:     DW_AT_name{{.*}}"-[TestInterf
 
 Check that the section header is printed correclty.
 CHECK: .apple_names contents:
-CHECK: Magic = 0x48415348
-CHECK: Version = 0x0001
-CHECK: Hash function = 0x00000000
-CHECK: Bucket count = 21
-CHECK: Hashes count = 42
-CHECK: HeaderData length = 12
-CHECK: DIE offset base = 0
-CHECK: Number of atoms = 1
-CHECK: Atom[0]  Type: DW_ATOM_die_offset Form: DW_FORM_data4
+CHECK: Magic: 0x48415348
+CHECK: Version: 0x1
+CHECK: Hash function: 0x0
+CHECK: Bucket count: 21
+CHECK: Hashes count: 42
+CHECK: HeaderData length: 12
+CHECK: DIE offset base: 0
+CHECK: Number of atoms: 1
+
+CHECK: Atom 0 {
+CHECK-NEXT: Type: DW_ATOM_die_offset
+CHECK-NEXT: Form: DW_FORM_data4
 
 Check that the accelerators point to the right DIEs.
-CHECK:     Name:{{.*}}"-[TestInterface ReadOnly]"
-CHECK-NOT: Name
-CHECK:     {Atom[0]: [[READONLY]]}
+CHECK:     String:{{.*}}"-[TestInterface ReadOnly]"
+CHECK-NOT: String
+CHECK:     Atom[0]: [[READONLY]]
 
 Check that empty buckets are handled correctly.
-CHECK: Bucket[3]
+CHECK: Bucket 3
 CHECK:   EMPTY
-CHECK: Bucket[4]
+CHECK: Bucket 4
 
 Check that the accelerators point to the right DIEs.
-CHECK:     Name:{{.*}}"-[TestInterface Assign]"
-CHECK-NOT: Name
-CHECK:     {Atom[0]: [[ASSIGN]]}
-CHECK:     Name:{{.*}}"-[TestInterface setAssign:]"
-CHECK-NOT: Name
-CHECK:     {Atom[0]: [[SETASSIGN]]}
+CHECK:     String:{{.*}}"-[TestInterface Assign]"
+CHECK-NOT: String
+CHECK:     Atom[0]: [[ASSIGN]]
+CHECK:     String:{{.*}}"-[TestInterface setAssign:]"
+CHECK-NOT: String
+CHECK:     Atom[0]: [[SETASSIGN]]
 
 Check that types are referenced correctly.
 CHECK: .apple_types contents:
-CHECK:     Name{{.*}}"TestInterface"
-CHECK-NOT: Name
-CHECK:     {Atom[0]: [[TESTINTERFACE]]}
+CHECK:     String:{{.*}}"TestInterface"
+CHECK-NOT: String
+CHECK:     Atom[0]: [[TESTINTERFACE]]
 
 Check that an empty accelerator section is handled correctly.
 CHECK: .apple_namespaces contents:
@@ -59,11 +62,11 @@ CHECK-NOT: Magic
 
 Check ObjC specific accelerators.
 CHECK: .apple_objc contents:
-CHECK:     Name{{.*}}"TestInterface"
-CHECK-NOT: Name
-CHECK:     {Atom[0]: [[READONLY]]}
-CHECK:     {Atom[0]: [[ASSIGN]]}
-CHECK:     {Atom[0]: [[SETASSIGN]]}
+CHECK:     String{{.*}}"TestInterface"
+CHECK-NOT: String
+CHECK:     Atom[0]: [[READONLY]]
+CHECK:     Atom[0]: [[ASSIGN]]
+CHECK:     Atom[0]: [[SETASSIGN]]
 
 Verify the debug info in the apple_names accelerator table.
 VERIFY: Verifying .apple_names...




More information about the llvm-commits mailing list