Index: llvm/trunk/include/llvm/Object/StackMapParser.h =================================================================== --- llvm/trunk/include/llvm/Object/StackMapParser.h +++ llvm/trunk/include/llvm/Object/StackMapParser.h @@ -117,7 +117,7 @@ /// Get the Size for this location. unsigned getSizeInBytes() const { - return read(P + SizeOffset); + return read(P + SizeOffset); } @@ -155,10 +155,10 @@ } 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 @@ 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 @@ 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 @@ : 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 @@ using constant_iterator = AccessorIterator; using record_iterator = AccessorIterator; - /// 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 { Index: llvm/trunk/test/Object/stackmap-dump.test =================================================================== --- llvm/trunk/test/Object/stackmap-dump.test +++ llvm/trunk/test/Object/stackmap-dump.test @@ -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 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: #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: #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: 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: 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: [ ]