1d6d7f7b1Szhijian## Test that "llvm-objdump --traceback-table" decodes the ControlledStorageInfo, 2d6d7f7b1Szhijian## AllocaRegister, and extension table of the traceback table. 3d6d7f7b1Szhijian 4d6d7f7b1Szhijian# RUN: yaml2obj %s -o %t.o 5d6d7f7b1Szhijian# RUN: llvm-objdump -d --traceback-table --symbol-description %t.o | \ 6d6d7f7b1Szhijian# RUN: FileCheck --match-full-lines --strict-whitespace %s 7d6d7f7b1Szhijian 8d6d7f7b1Szhijian## Show that --traceback-table implies --disassemble. 9d6d7f7b1Szhijian# RUN: llvm-objdump --traceback-table --symbol-description %t.o | \ 10d6d7f7b1Szhijian# RUN: FileCheck --match-full-lines --strict-whitespace %s 11d6d7f7b1Szhijian 12d6d7f7b1Szhijian--- !XCOFF 13d6d7f7b1SzhijianFileHeader: 14d6d7f7b1Szhijian MagicNumber: 0x1DF 15d6d7f7b1SzhijianSections: 16d6d7f7b1Szhijian - Name: .text 17d6d7f7b1Szhijian Flags: [ STYP_TEXT ] 18d6d7f7b1Szhijian SectionData: "9421ffc0000000000000204080000201000000000000000400064164644e756d0000000093e1fffc0000000000002a6080c202072c90000000000004000000036f0000010000000a000001000003666f6f1f0203c000000000002000000000000000000000000000010000000000000100000000000000000000000000123400000000" 19d6d7f7b1SzhijianSymbols: 20d6d7f7b1Szhijian - Name: .AddNum 21d6d7f7b1Szhijian Value: 0 22d6d7f7b1Szhijian Section: .text 23d6d7f7b1Szhijian Type: 0x20 24d6d7f7b1Szhijian StorageClass: C_EXT 25d6d7f7b1Szhijian AuxEntries: 26d6d7f7b1Szhijian - Type: AUX_CSECT 27d6d7f7b1Szhijian SectionOrLength: 0x24 28d6d7f7b1Szhijian SymbolAlignmentAndType: 0x21 29d6d7f7b1Szhijian StorageMappingClass: XMC_PR 30d6d7f7b1Szhijian - Name: .foo 31d6d7f7b1Szhijian Value: 0x24 32d6d7f7b1Szhijian Section: .text 33d6d7f7b1Szhijian Type: 0x20 34d6d7f7b1Szhijian StorageClass: C_EXT 35d6d7f7b1Szhijian AuxEntries: 36d6d7f7b1Szhijian - Type: AUX_CSECT 37d6d7f7b1Szhijian SectionOrLength: 0x5F 38d6d7f7b1Szhijian SymbolAlignmentAndType: 0x21 39d6d7f7b1Szhijian StorageMappingClass: XMC_PR 40d6d7f7b1Szhijian 41d6d7f7b1Szhijian## The above .text section data is generated using the compiler command: 42d6d7f7b1Szhijian## xlc -o test.o -c test.c 43d6d7f7b1Szhijian## We also modified the binary content of the traceback table in the object file to add vector information 44d6d7f7b1Szhijian## for function "foo", including ControlledStorageInfo, AllocaRegister, and ExtensionTable. 45d6d7f7b1Szhijian 46d6d7f7b1Szhijian## test.c: 47d6d7f7b1Szhijian## int AddNum(int i,intj) { 48d6d7f7b1Szhijian## return i+j; 49d6d7f7b1Szhijian## } 50d6d7f7b1Szhijian 51d6d7f7b1Szhijian## float foo(int i1,float f1,double d1,int i2, float f2) { 52d6d7f7b1Szhijian## return i1+f1+d1+i2+f2; 53d6d7f7b1Szhijian## } 54d6d7f7b1Szhijian 55d6d7f7b1Szhijian# CHECK:00000000 (idx: 0) .AddNum[PR]: 56d6d7f7b1Szhijian# CHECK-NEXT: 0: 94 21 ff c0 stwu 1, -64(1) 57d6d7f7b1Szhijian# CHECK-NEXT: 4: 00 00 00 00 # Traceback table start 58d6d7f7b1Szhijian# CHECK-NEXT: 8: 00 # Version = 0 59d6d7f7b1Szhijian# CHECK-NEXT: 9: 00 # Language = C 60d6d7f7b1Szhijian# CHECK-NEXT: a: 20 # -isGlobalLinkage, -isOutOfLineEpilogOrPrologue 61d6d7f7b1Szhijian# CHECK-NEXT: +hasTraceBackTableOffset, -isInternalProcedure 62d6d7f7b1Szhijian# CHECK-NEXT: -hasControlledStorage, -isTOCless 63d6d7f7b1Szhijian# CHECK-NEXT: -isFloatingPointPresent 64d6d7f7b1Szhijian# CHECK-NEXT: -isFloatingPointOperationLogOrAbortEnabled 65d6d7f7b1Szhijian# CHECK-NEXT: b: 40 # -isInterruptHandler, +isFuncNamePresent, -isAllocaUsed 66d6d7f7b1Szhijian# CHECK-NEXT: OnConditionDirective = 0, -isCRSaved, -isLRSaved 67d6d7f7b1Szhijian# CHECK-NEXT: c: 80 # +isBackChainStored, -isFixup, NumOfFPRsSaved = 0 68d6d7f7b1Szhijian# CHECK-NEXT: d: 00 # -hasExtensionTable, -hasVectorInfo, NumOfGPRsSaved = 0 69d6d7f7b1Szhijian# CHECK-NEXT: e: 02 # NumberOfFixedParms = 2 70d6d7f7b1Szhijian# CHECK-NEXT: f: 01 # NumberOfFPParms = 0, +hasParmsOnStack 71d6d7f7b1Szhijian# CHECK-NEXT: 10: 00 00 00 00 # ParmsType = i, i 72d6d7f7b1Szhijian# CHECK-NEXT: 14: 00 00 00 04 # TraceBackTableOffset = 4 73d6d7f7b1Szhijian# CHECK-NEXT: 18: 00 06 # FunctionNameLen = 6 74d6d7f7b1Szhijian# CHECK-NEXT: 1a: 41 64 64 4e # FunctionName = AddNum 75d6d7f7b1Szhijian# CHECK-NEXT: 1e: 75 6d 76d6d7f7b1Szhijian# CHECK-NEXT: 20: 00 00 00 00 # Padding 77d6d7f7b1Szhijian 78d6d7f7b1Szhijian# CHECK:00000024 (idx: 2) .foo[PR]: 79d6d7f7b1Szhijian# CHECK-NEXT: 24: 93 e1 ff fc stw 31, -4(1) 80d6d7f7b1Szhijian# CHECK-NEXT: 28: 00 00 00 00 # Traceback table start 81d6d7f7b1Szhijian# CHECK-NEXT: 2c: 00 # Version = 0 82d6d7f7b1Szhijian# CHECK-NEXT: 2d: 00 # Language = C 83d6d7f7b1Szhijian# CHECK-NEXT: 2e: 2a # -isGlobalLinkage, -isOutOfLineEpilogOrPrologue 84d6d7f7b1Szhijian# CHECK-NEXT: +hasTraceBackTableOffset, -isInternalProcedure 85d6d7f7b1Szhijian# CHECK-NEXT: +hasControlledStorage, -isTOCless 86d6d7f7b1Szhijian# CHECK-NEXT: +isFloatingPointPresent 87d6d7f7b1Szhijian# CHECK-NEXT: -isFloatingPointOperationLogOrAbortEnabled 88d6d7f7b1Szhijian# CHECK-NEXT: 2f: 60 # -isInterruptHandler, +isFuncNamePresent, +isAllocaUsed 89d6d7f7b1Szhijian# CHECK-NEXT: OnConditionDirective = 0, -isCRSaved, -isLRSaved 90d6d7f7b1Szhijian# CHECK-NEXT: 30: 80 # +isBackChainStored, -isFixup, NumOfFPRsSaved = 0 91d6d7f7b1Szhijian# CHECK-NEXT: 31: c2 # +hasExtensionTable, +hasVectorInfo, NumOfGPRsSaved = 2 92d6d7f7b1Szhijian# CHECK-NEXT: 32: 02 # NumberOfFixedParms = 2 93d6d7f7b1Szhijian# CHECK-NEXT: 33: 07 # NumberOfFPParms = 3, +hasParmsOnStack 94d6d7f7b1Szhijian# CHECK-NEXT: 34: 2c 90 00 00 # ParmsType = i, f, d, i, f, v 95d6d7f7b1Szhijian# CHECK-NEXT: 38: 00 00 00 04 # TraceBackTableOffset = 4 96d6d7f7b1Szhijian# CHECK-NEXT: 3c: 00 00 00 03 # NumOfCtlAnchors = 3 97d6d7f7b1Szhijian# CHECK-NEXT: 40: 6f 00 00 01 # ControlledStorageInfoDisp[0] = 1862270977 98d6d7f7b1Szhijian# CHECK-NEXT: 44: 00 00 00 0a ControlledStorageInfoDisp[1] = 10 99d6d7f7b1Szhijian# CHECK-NEXT: 48: 00 00 01 00 ControlledStorageInfoDisp[2] = 256 100d6d7f7b1Szhijian# CHECK-NEXT: 4c: 00 03 # FunctionNameLen = 3 101d6d7f7b1Szhijian# CHECK-NEXT: 4e: 66 6f 6f # FunctionName = foo 102d6d7f7b1Szhijian# CHECK-NEXT: 51: 1f # AllocaRegister = 31 103d6d7f7b1Szhijian# CHECK-NEXT: 52: 02 # NumberOfVRSaved = 0, +isVRSavedOnStack, -hasVarArgs 104d6d7f7b1Szhijian# CHECK-NEXT: 53: 03 # NumberOfVectorParms = 1, +hasVMXInstruction 105d6d7f7b1Szhijian# CHECK-NEXT: 54: c0 00 00 00 # VectorParmsInfoString = vf 106d6d7f7b1Szhijian# CHECK-NEXT: 58: 00 00 # Padding 107d6d7f7b1Szhijian# CHECK-NEXT: 5a: 20 # ExtensionTable = TB_SSP_CANARY 108d6d7f7b1Szhijian# CHECK-NEXT: 5b: 00 # Padding 109d6d7f7b1Szhijian# CHECK-NEXT: ... 110d6d7f7b1Szhijian# CHECK-NEXT: 68: 01 00 00 00 111d6d7f7b1Szhijian# CHECK-NEXT: 6c: 00 00 00 01 112d6d7f7b1Szhijian# CHECK-NEXT: 70: 00 00 00 00 113d6d7f7b1Szhijian# CHECK-NEXT: ... 114d6d7f7b1Szhijian# CHECK-NEXT: 7c: 00 12 34 00 115*b5abaea3Sstephenpeckham# CHECK-NEXT: 80: 00 00 00 116