[llvm] r358325 - [StackMaps] Update llvm-readobj to parse V3 Stackmaps

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 12 20:55:13 PDT 2019


Author: reames
Date: Fri Apr 12 20:55:13 2019
New Revision: 358325

URL: http://llvm.org/viewvc/llvm-project?rev=358325&view=rev
Log:
[StackMaps] Update llvm-readobj to parse V3 Stackmaps

This updates the StackMap parser in the llvm-readobj tool to parse version 3 StackMaps, which were bumped in https://reviews.llvm.org/D32629.

Version 3 StackMaps differ in that they have a uint16 sized "location size" field which was added to the Location block in a StackMap record. The record has additional padding for alignment. This was a backwards incompatible change resulting in a StackMap version bump.

Patch By: jacob.hughes at kcl.ac.uk (with a rewrite of tests by me)
Differential Revision: https://reviews.llvm.org/D59020


Modified:
    llvm/trunk/include/llvm/Object/StackMapParser.h
    llvm/trunk/test/Object/Inputs/stackmap-test.macho-x86-64
    llvm/trunk/test/Object/stackmap-dump.test

Modified: llvm/trunk/include/llvm/Object/StackMapParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/StackMapParser.h?rev=358325&r1=358324&r2=358325&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/StackMapParser.h (original)
+++ llvm/trunk/include/llvm/Object/StackMapParser.h Fri Apr 12 20:55:13 2019
@@ -117,7 +117,7 @@ public:
 
     /// Get the Size for this location.
     unsigned getSizeInBytes() const {
-        return read<uint8_t>(P + SizeOffset);
+        return read<uint16_t>(P + SizeOffset);
 
     }
 
@@ -155,10 +155,10 @@ public:
     }
 
     static const int KindOffset = 0;
-    static const int SizeOffset = KindOffset + sizeof(uint8_t);
-    static const int DwarfRegNumOffset = SizeOffset + sizeof(uint8_t);
-    static const int SmallConstantOffset = DwarfRegNumOffset + sizeof(uint16_t);
-    static const int LocationAccessorSize = sizeof(uint64_t);
+    static const int SizeOffset = KindOffset + sizeof(uint16_t);
+    static const int DwarfRegNumOffset = SizeOffset + sizeof(uint16_t);
+    static const int SmallConstantOffset = DwarfRegNumOffset + sizeof(uint32_t);
+    static const int LocationAccessorSize = sizeof(uint64_t) + sizeof(uint32_t);
 
     const uint8_t *P;
   };
@@ -271,8 +271,9 @@ public:
     RecordAccessor(const uint8_t *P) : P(P) {}
 
     unsigned getNumLiveOutsOffset() const {
-      return LocationListOffset + LocationSize * getNumLocations() +
-             sizeof(uint16_t);
+      unsigned LocOffset = 
+          ((LocationListOffset + LocationSize * getNumLocations()) + 7) & ~0x7; 
+      return LocOffset + sizeof(uint16_t);
     }
 
     unsigned getSizeInBytes() const {
@@ -292,7 +293,7 @@ public:
       InstructionOffsetOffset + sizeof(uint32_t) + sizeof(uint16_t);
     static const unsigned LocationListOffset =
       NumLocationsOffset + sizeof(uint16_t);
-    static const unsigned LocationSize = sizeof(uint64_t);
+    static const unsigned LocationSize = sizeof(uint64_t) + sizeof(uint32_t);
     static const unsigned LiveOutSize = sizeof(uint32_t);
 
     const uint8_t *P;
@@ -304,8 +305,8 @@ public:
       : StackMapSection(StackMapSection) {
     ConstantsListOffset = FunctionListOffset + getNumFunctions() * FunctionSize;
 
-    assert(StackMapSection[0] == 2 &&
-           "StackMapParser can only parse version 2 stackmaps");
+    assert(StackMapSection[0] == 3 &&
+           "StackMapParser can only parse version 3 stackmaps");
 
     unsigned CurrentRecordOffset =
       ConstantsListOffset + getNumConstants() * ConstantSize;
@@ -321,8 +322,8 @@ public:
   using constant_iterator = AccessorIterator<ConstantAccessor>;
   using record_iterator = AccessorIterator<RecordAccessor>;
 
-  /// Get the version number of this stackmap. (Always returns 2).
-  unsigned getVersion() const { return 2; }
+  /// Get the version number of this stackmap. (Always returns 3).
+  unsigned getVersion() const { return 3; }
 
   /// Get the number of functions in the stack map.
   uint32_t getNumFunctions() const {

Modified: llvm/trunk/test/Object/Inputs/stackmap-test.macho-x86-64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/stackmap-test.macho-x86-64?rev=358325&r1=358324&r2=358325&view=diff
==============================================================================
Binary files - no diff available.

Modified: llvm/trunk/test/Object/stackmap-dump.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/stackmap-dump.test?rev=358325&r1=358324&r2=358325&view=diff
==============================================================================
--- llvm/trunk/test/Object/stackmap-dump.test (original)
+++ llvm/trunk/test/Object/stackmap-dump.test Fri Apr 12 20:55:13 2019
@@ -1,10 +1,9 @@
 RUN: llvm-readobj -stackmap %p/Inputs/stackmap-test.macho-x86-64 | FileCheck %s
 
 ; Note: the macho object file in this test was generated in the following way:
-; llc -mtriple=x86_64-apple-darwin %p/test/CodeGen/X86/stackmap.ll -o stackmap.s
-; clang -c stackmap.s -o %p/test/Object/Inputs/stackmap-test.macho-x86-64
+; llc -mtriple=x86_64-apple-darwin test/CodeGen/X86/stackmap.ll -o test/Object/Inputs/stackmap-test.macho-x86-64 -filetype=obj
 
-CHECK: LLVM StackMap Version: 2
+CHECK: LLVM StackMap Version: 3
 CHECK-NEXT: Num Functions: 16
 CHECK-NEXT:   Function address: 0, stack size: 8, callsite record count: 1
 CHECK-NEXT:   Function address: 0, stack size: 24, callsite record count: 1
@@ -13,8 +12,8 @@ CHECK-NEXT:   Function address: 0, stack
 CHECK-NEXT:   Function address: 0, stack size: 8, callsite record count: 1
 CHECK-NEXT:   Function address: 0, stack size: 8, callsite record count: 1
 CHECK-NEXT:   Function address: 0, stack size: 8, callsite record count: 1
-CHECK-NEXT:   Function address: 0, stack size: 56, callsite record count: 1
-CHECK-NEXT:   Function address: 0, stack size: 56, callsite record count: 1
+CHECK-NEXT:   Function address: 0, stack size: 8, callsite record count: 1
+CHECK-NEXT:   Function address: 0, stack size: 8, callsite record count: 1
 CHECK-NEXT:   Function address: 0, stack size: 56, callsite record count: 1
 CHECK-NEXT:   Function address: 0, stack size: 56, callsite record count: 1
 CHECK-NEXT:   Function address: 0, stack size: 8, callsite record count: 1
@@ -79,16 +78,16 @@ CHECK-NEXT:       #1: Register R#2, size
 CHECK-NEXT:       #2: Register R#8, size: 8
 CHECK-NEXT:     2 live-outs: [ R#0 (8-bytes) R#7 (8-bytes) ]
 
-CHECK:        Record ID: 11, instruction offset: 42
+CHECK:        Record ID: 11, instruction offset: 4
 CHECK-NEXT:     17 locations:
 CHECK-NEXT:       #1: Register R#9, size: 8
-CHECK-NEXT:       #2: Register R#14, size: 8
-CHECK-NEXT:       #3: Register R#10, size: 8
-CHECK-NEXT:       #4: Register R#3, size: 8
-CHECK-NEXT:       #5: Register R#0, size: 8
-CHECK-NEXT:       #6: Register R#13, size: 8
-CHECK-NEXT:       #7: Register R#12, size: 8
-CHECK-NEXT:       #8: Register R#15, size: 8
+CHECK-NEXT:       #2: Indirect [R#6 + 16], size: 8
+CHECK-NEXT:       #3: Indirect [R#6 + 24], size: 8
+CHECK-NEXT:       #4: Indirect [R#6 + 32], size: 8
+CHECK-NEXT:       #5: Indirect [R#6 + 40], size: 8
+CHECK-NEXT:       #6: Indirect [R#6 + 48], size: 8
+CHECK-NEXT:       #7: Indirect [R#6 + 56], size: 8
+CHECK-NEXT:       #8: Indirect [R#6 + 64], size: 8
 CHECK-NEXT:       #9: Indirect [R#6 + 72], size: 8
 CHECK-NEXT:       #10: Indirect [R#6 + 80], size: 8
 CHECK-NEXT:       #11: Indirect [R#6 + 88], size: 8
@@ -100,21 +99,21 @@ CHECK-NEXT:       #16: Indirect [R#6 + 1
 CHECK-NEXT:       #17: Indirect [R#6 + 136], size: 8
 CHECK-NEXT:     1 live-outs: [ R#7 (8-bytes) ]
 
-CHECK:        Record ID: 12, instruction offset: 62
+CHECK:        Record ID: 12, instruction offset: 4
 CHECK-NEXT:     17 locations:
 CHECK-NEXT:       #1: Register R#0, size: 8
-CHECK-NEXT:       #2: Register R#14, size: 8
-CHECK-NEXT:       #3: Register R#10, size: 8
-CHECK-NEXT:       #4: Register R#9, size: 8
-CHECK-NEXT:       #5: Register R#8, size: 8
-CHECK-NEXT:       #6: Register R#4, size: 8
-CHECK-NEXT:       #7: Register R#1, size: 8
-CHECK-NEXT:       #8: Register R#2, size: 8
-CHECK-NEXT:       #9: Register R#5, size: 8
-CHECK-NEXT:       #10: Register R#3, size: 8
-CHECK-NEXT:       #11: Register R#13, size: 8
-CHECK-NEXT:       #12: Register R#12, size: 8
-CHECK-NEXT:       #13: Register R#15, size: 8
+CHECK-NEXT:       #2: Indirect [R#6 + 16], size: 8
+CHECK-NEXT:       #3: Indirect [R#6 + 24], size: 8
+CHECK-NEXT:       #4: Indirect [R#6 + 32], size: 8
+CHECK-NEXT:       #5: Indirect [R#6 + 40], size: 8
+CHECK-NEXT:       #6: Indirect [R#6 + 48], size: 8
+CHECK-NEXT:       #7: Indirect [R#6 + 56], size: 8
+CHECK-NEXT:       #8: Indirect [R#6 + 64], size: 8
+CHECK-NEXT:       #9: Indirect [R#6 + 72], size: 8
+CHECK-NEXT:       #10: Indirect [R#6 + 80], size: 8
+CHECK-NEXT:       #11: Indirect [R#6 + 88], size: 8
+CHECK-NEXT:       #12: Indirect [R#6 + 96], size: 8
+CHECK-NEXT:       #13: Indirect [R#6 + 104], size: 8
 CHECK-NEXT:       #14: Indirect [R#6 + 112], size: 8
 CHECK-NEXT:       #15: Indirect [R#6 + 120], size: 8
 CHECK-NEXT:       #16: Indirect [R#6 + 128], size: 8
@@ -137,15 +136,15 @@ CHECK-NEXT:     1 locations:
 CHECK-NEXT:       #1: Constant 33, size: 8
 CHECK-NEXT:     0 live-outs: [ ]
 
-CHECK:        Record ID: 16, instruction offset: 32
+CHECK:        Record ID: 16, instruction offset: 16
 CHECK-NEXT:     1 locations:
-CHECK-NEXT:       #1: Direct R#6 + -32, size: 8
+CHECK-NEXT:       #1: Direct R#6 + -40, size: 8
 CHECK-NEXT:     0 live-outs: [ ]
 
-CHECK:        Record ID: 17, instruction offset: 32
+CHECK:        Record ID: 17, instruction offset: 16
 CHECK-NEXT:     2 locations:
 CHECK-NEXT:       #1: Direct R#6 + -8, size: 8
-CHECK-NEXT:       #2: Direct R#6 + -40, size: 8
+CHECK-NEXT:       #2: Direct R#6 + -16, size: 8
 CHECK-NEXT:     1 live-outs: [ R#7 (8-bytes) ]
 
 CHECK:        Record ID: 4294967295, instruction offset: 4
@@ -169,6 +168,6 @@ CHECK-NEXT:     1 locations:
 CHECK-NEXT:       #1: Indirect [R#6 + -44], size: 4
 CHECK-NEXT:     0 live-outs: [ ]
 
-CHECK:        Record ID: 0, instruction offset: 26
+CHECK:        Record ID: 0, instruction offset: 25
 CHECK-NEXT:     0 locations:
 CHECK-NEXT:     0 live-outs: [ ]




More information about the llvm-commits mailing list