| # clang-format off | |
| # REQUIRES: lld, x86 | |
| # Test when nested S_BLOCK32 have same address range, ResolveSymbolContext should return the innnermost block. | |
| # RUN: llvm-mc -triple=x86_64-windows-msvc --filetype=obj %s > %t.obj | |
| # RUN: lld-link /debug:full /nodefaultlib /entry:main %t.obj /out:%t.exe /base:0x140000000 | |
| # RUN: %lldb -f %t.exe -o "image lookup -a 0x14000103c -v" -o "exit" | FileCheck %s | |
| # This file is compiled from following source file: | |
| # $ clang-cl /Z7 /GS- /c /O2 test.cpp /Fatest.s | |
| # __attribute__((optnone)) bool func(const char* cp, volatile char p[]) { | |
| # return false; | |
| # } | |
| # | |
| # int main() { | |
| # const char* const kMfDLLs[] = {"a"}; | |
| # asm("nop"); | |
| # for (const char* kMfDLL : kMfDLLs) { | |
| # volatile char path[10] = {0}; | |
| # if (func(kMfDLL, path)) | |
| # break; | |
| # } | |
| # return 0; | |
| # } | |
| # CHECK: Function: id = {{.*}}, name = "main", range = [0x0000000140001020-0x000000014000104d) | |
| # CHECK-NEXT: FuncType: id = {{.*}}, byte-size = 0, compiler_type = "int (void)" | |
| # CHECK-NEXT: Blocks: id = {{.*}}, range = [0x140001020-0x14000104d) | |
| # CHECK-NEXT: id = {{.*}}, range = [0x140001025-0x140001046) | |
| # CHECK-NEXT: id = {{.*}}, range = [0x140001025-0x140001046) | |
| # CHECK-NEXT: id = {{.*}}, range = [0x140001025-0x140001046) | |
| # CHECK-NEXT: LineEntry: [0x0000000140001035-0x0000000140001046): /tmp/test.cpp:10 | |
| # CHECK-NEXT: Symbol: id = {{.*}}, range = [0x0000000140001020-0x000000014000104d), name="main" | |
| # CHECK-NEXT: Variable: id = {{.*}}, name = "path", type = "volatile char[10]", valid ranges = <block>, location = [0x0000000140001025, 0x0000000140001046) -> DW_OP_breg7 RSP+40, decl = | |
| # CHECK-NEXT: Variable: id = {{.*}}, name = "kMfDLL", type = "const char *", valid ranges = <block>, location = [0x000000014000103c, 0x0000000140001046) -> DW_OP_reg2 RCX, decl = | |
| # CHECK-NEXT: Variable: id = {{.*}}, name = "__range1", type = "const char *const (&)[1]", valid ranges = <block>, location = <empty>, decl = | |
| # CHECK-NEXT: Variable: id = {{.*}}, name = "__begin1", type = "const char *const *", valid ranges = <block>, location = <empty>, decl = | |
| # CHECK-NEXT: Variable: id = {{.*}}, name = "__end1", type = "const char *const *", valid ranges = <block>, location = <empty>, decl = | |
| # CHECK-NEXT: Variable: id = {{.*}}, name = "kMfDLLs", type = "const char *const[1]", valid ranges = <block>, location = [0x000000014000103c, 0x0000000140001046) -> DW_OP_reg2 RCX, decl = | |
| .text | |
| .def @feat.00; | |
| .scl 3; | |
| .type 0; | |
| .endef | |
| .globl @feat.00 | |
| .set @feat.00, 0 | |
| .intel_syntax noprefix | |
| .file "test.cpp" | |
| .def "?func@@YA_NPEBDQECD@Z"; | |
| .scl 2; | |
| .type 32; | |
| .endef | |
| .section .text,"xr",one_only,"?func@@YA_NPEBDQECD@Z" | |
| .globl "?func@@YA_NPEBDQECD@Z" # -- Begin function ?func@@YA_NPEBDQECD@Z | |
| .p2align 4, 0x90 | |
| "?func@@YA_NPEBDQECD@Z": # @"?func@@YA_NPEBDQECD@Z" | |
| .Lfunc_begin0: | |
| .cv_func_id 0 | |
| .cv_file 1 "/tmp/test.cpp" "8CDAA03EE93954606427F9B409CE7638" 1 | |
| .cv_loc 0 1 1 0 # test.cpp:1:0 | |
| .seh_proc "?func@@YA_NPEBDQECD@Z" | |
| # %bb.0: # %entry | |
| sub rsp, 16 | |
| .seh_stackalloc 16 | |
| .seh_endprologue | |
| mov qword ptr [rsp + 8], rdx | |
| mov qword ptr [rsp], rcx | |
| .Ltmp0: | |
| .cv_loc 0 1 2 0 # test.cpp:2:0 | |
| xor eax, eax | |
| and al, 1 | |
| movzx eax, al | |
| add rsp, 16 | |
| ret | |
| .Ltmp1: | |
| .Lfunc_end0: | |
| .seh_endproc | |
| # -- End function | |
| .def main; | |
| .scl 2; | |
| .type 32; | |
| .endef | |
| .section .text,"xr",one_only,main | |
| .globl main # -- Begin function main | |
| .p2align 4, 0x90 | |
| main: # @main | |
| .Lfunc_begin1: | |
| .cv_func_id 1 | |
| .cv_loc 1 1 5 0 # test.cpp:5:0 | |
| .seh_proc main | |
| # %bb.0: # %entry | |
| sub rsp, 56 | |
| .seh_stackalloc 56 | |
| .seh_endprologue | |
| .Ltmp2: | |
| .cv_loc 1 1 7 0 # test.cpp:7:0 | |
| #APP | |
| nop | |
| #NO_APP | |
| .Ltmp3: | |
| #DEBUG_VALUE: __range1 <- undef | |
| #DEBUG_VALUE: __begin1 <- undef | |
| #DEBUG_VALUE: __end1 <- [DW_OP_plus_uconst 8, DW_OP_stack_value] undef | |
| .cv_loc 1 1 9 0 # test.cpp:9:0 | |
| mov word ptr [rsp + 48], 0 | |
| mov qword ptr [rsp + 40], 0 | |
| .cv_loc 1 1 10 0 # test.cpp:10:0 | |
| lea rcx, [rip + "??_C@_01MCMALHOG@a?$AA@"] | |
| .Ltmp4: | |
| #DEBUG_VALUE: main:kMfDLLs <- $rcx | |
| #DEBUG_VALUE: kMfDLL <- $rcx | |
| lea rdx, [rsp + 40] | |
| call "?func@@YA_NPEBDQECD@Z" | |
| .Ltmp5: | |
| #DEBUG_VALUE: __begin1 <- [DW_OP_LLVM_arg 0, DW_OP_LLVM_arg 1, DW_OP_constu 8, DW_OP_mul, DW_OP_plus, DW_OP_stack_value] undef, undef | |
| .cv_loc 1 1 14 0 # test.cpp:14:0 | |
| xor eax, eax | |
| add rsp, 56 | |
| ret | |
| .Ltmp6: | |
| .Lfunc_end1: | |
| .seh_endproc | |
| # -- End function | |
| .section .rdata,"dr",discard,"??_C@_01MCMALHOG@a?$AA@" | |
| .globl "??_C@_01MCMALHOG@a?$AA@" # @"??_C@_01MCMALHOG@a?$AA@" | |
| "??_C@_01MCMALHOG@a?$AA@": | |
| .asciz "a" | |
| .section .debug$S,"dr" | |
| .p2align 2, 0x0 | |
| .long 4 # Debug section magic | |
| .long 241 | |
| .long .Ltmp8-.Ltmp7 # Subsection size | |
| .Ltmp7: | |
| .short .Ltmp12-.Ltmp11 # Record length | |
| .Ltmp11: | |
| .short 4412 # Record kind: S_COMPILE3 | |
| .long 1 # Flags and language | |
| .short 208 # CPUType | |
| .short 16 # Frontend version | |
| .short 0 | |
| .short 0 | |
| .short 0 | |
| .short 16000 # Backend version | |
| .short 0 | |
| .short 0 | |
| .short 0 | |
| .asciz "clang version 16.0.0" # Null-terminated compiler version string | |
| .p2align 2, 0x0 | |
| .Ltmp12: | |
| .Ltmp8: | |
| .p2align 2, 0x0 | |
| .section .debug$S,"dr",associative,"?func@@YA_NPEBDQECD@Z" | |
| .p2align 2, 0x0 | |
| .long 4 # Debug section magic | |
| .long 241 # Symbol subsection for func | |
| .Ltmp14: | |
| .p2align 2, 0x0 | |
| .cv_linetable 0, "?func@@YA_NPEBDQECD@Z", .Lfunc_end0 | |
| .section .debug$S,"dr",associative,main | |
| .p2align 2, 0x0 | |
| .long 4 # Debug section magic | |
| .long 241 # Symbol subsection for main | |
| .long .Ltmp24-.Ltmp23 # Subsection size | |
| .Ltmp23: | |
| .short .Ltmp26-.Ltmp25 # Record length | |
| .Ltmp25: | |
| .short 4423 # Record kind: S_GPROC32_ID | |
| .long 0 # PtrParent | |
| .long 0 # PtrEnd | |
| .long 0 # PtrNext | |
| .long .Lfunc_end1-main # Code size | |
| .long 0 # Offset after prologue | |
| .long 0 # Offset before epilogue | |
| .long 4105 # Function type index | |
| .secrel32 main # Function section relative address | |
| .secidx main # Function section index | |
| .byte 0 # Flags | |
| .asciz "main" # Function name | |
| .p2align 2, 0x0 | |
| .Ltmp26: | |
| .short .Ltmp28-.Ltmp27 # Record length | |
| .Ltmp27: | |
| .short 4114 # Record kind: S_FRAMEPROC | |
| .long 56 # FrameSize | |
| .long 0 # Padding | |
| .long 0 # Offset of padding | |
| .long 0 # Bytes of callee saved registers | |
| .long 0 # Exception handler offset | |
| .short 0 # Exception handler section | |
| .long 1130504 # Flags (defines frame register) | |
| .p2align 2, 0x0 | |
| .Ltmp28: | |
| .short .Ltmp30-.Ltmp29 # Record length | |
| .Ltmp29: | |
| .short 4414 # Record kind: S_LOCAL | |
| .long 4107 # TypeIndex | |
| .short 0 # Flags | |
| .asciz "kMfDLLs" | |
| .p2align 2, 0x0 | |
| .Ltmp30: | |
| .cv_def_range .Ltmp4 .Ltmp5, reg, 330 | |
| .short .Ltmp32-.Ltmp31 # Record length | |
| .Ltmp31: | |
| .short 4355 # Record kind: S_BLOCK32 | |
| .long 0 # PtrParent | |
| .long 0 # PtrEnd | |
| .long .Ltmp5-.Ltmp3 # Code size | |
| .secrel32 .Ltmp3 # Function section relative address | |
| .secidx .Lfunc_begin1 # Function section index | |
| .byte 0 # Lexical block name | |
| .p2align 2, 0x0 | |
| .Ltmp32: | |
| .short .Ltmp34-.Ltmp33 # Record length | |
| .Ltmp33: | |
| .short 4414 # Record kind: S_LOCAL | |
| .long 4108 # TypeIndex | |
| .short 256 # Flags | |
| .asciz "__range1" | |
| .p2align 2, 0x0 | |
| .Ltmp34: | |
| .short .Ltmp36-.Ltmp35 # Record length | |
| .Ltmp35: | |
| .short 4414 # Record kind: S_LOCAL | |
| .long 4109 # TypeIndex | |
| .short 256 # Flags | |
| .asciz "__begin1" | |
| .p2align 2, 0x0 | |
| .Ltmp36: | |
| .short .Ltmp38-.Ltmp37 # Record length | |
| .Ltmp37: | |
| .short 4414 # Record kind: S_LOCAL | |
| .long 4109 # TypeIndex | |
| .short 256 # Flags | |
| .asciz "__end1" | |
| .p2align 2, 0x0 | |
| .Ltmp38: | |
| .short .Ltmp40-.Ltmp39 # Record length | |
| .Ltmp39: | |
| .short 4355 # Record kind: S_BLOCK32 | |
| .long 0 # PtrParent | |
| .long 0 # PtrEnd | |
| .long .Ltmp5-.Ltmp3 # Code size | |
| .secrel32 .Ltmp3 # Function section relative address | |
| .secidx .Lfunc_begin1 # Function section index | |
| .byte 0 # Lexical block name | |
| .p2align 2, 0x0 | |
| .Ltmp40: | |
| .short .Ltmp42-.Ltmp41 # Record length | |
| .Ltmp41: | |
| .short 4414 # Record kind: S_LOCAL | |
| .long 4097 # TypeIndex | |
| .short 0 # Flags | |
| .asciz "kMfDLL" | |
| .p2align 2, 0x0 | |
| .Ltmp42: | |
| .cv_def_range .Ltmp4 .Ltmp5, reg, 330 | |
| .short .Ltmp44-.Ltmp43 # Record length | |
| .Ltmp43: | |
| .short 4355 # Record kind: S_BLOCK32 | |
| .long 0 # PtrParent | |
| .long 0 # PtrEnd | |
| .long .Ltmp5-.Ltmp3 # Code size | |
| .secrel32 .Ltmp3 # Function section relative address | |
| .secidx .Lfunc_begin1 # Function section index | |
| .byte 0 # Lexical block name | |
| .p2align 2, 0x0 | |
| .Ltmp44: | |
| .short .Ltmp46-.Ltmp45 # Record length | |
| .Ltmp45: | |
| .short 4414 # Record kind: S_LOCAL | |
| .long 4110 # TypeIndex | |
| .short 0 # Flags | |
| .asciz "path" | |
| .p2align 2, 0x0 | |
| .Ltmp46: | |
| .cv_def_range .Ltmp3 .Ltmp5, frame_ptr_rel, 40 | |
| .short 2 # Record length | |
| .short 6 # Record kind: S_END | |
| .short 2 # Record length | |
| .short 6 # Record kind: S_END | |
| .short 2 # Record length | |
| .short 6 # Record kind: S_END | |
| .short 2 # Record length | |
| .short 4431 # Record kind: S_PROC_ID_END | |
| .Ltmp24: | |
| .p2align 2, 0x0 | |
| .cv_linetable 1, main, .Lfunc_end1 | |
| .section .debug$S,"dr" | |
| .cv_filechecksums # File index to string table offset subsection | |
| .cv_stringtable # String table | |
| .Ltmp50: | |
| .Ltmp48: | |
| .p2align 2, 0x0 | |
| .section .debug$T,"dr" | |
| .p2align 2, 0x0 | |
| .long 4 # Debug section magic | |
| # Modifier (0x1000) | |
| .short 0xa # Record length | |
| .short 0x1001 # Record kind: LF_MODIFIER | |
| .long 0x70 # ModifiedType: char | |
| .short 0x1 # Modifiers ( Const (0x1) ) | |
| .byte 242 | |
| .byte 241 | |
| # Pointer (0x1001) | |
| .short 0xa # Record length | |
| .short 0x1002 # Record kind: LF_POINTER | |
| .long 0x1000 # PointeeType: const char | |
| .long 0x1000c # Attrs: [ Type: Near64, Mode: Pointer, SizeOf: 8 ] | |
| # Modifier (0x1002) | |
| .short 0xa # Record length | |
| .short 0x1001 # Record kind: LF_MODIFIER | |
| .long 0x70 # ModifiedType: char | |
| .short 0x2 # Modifiers ( Volatile (0x2) ) | |
| .byte 242 | |
| .byte 241 | |
| # Pointer (0x1003) | |
| .short 0xa # Record length | |
| .short 0x1002 # Record kind: LF_POINTER | |
| .long 0x1002 # PointeeType: volatile char | |
| .long 0x1000c # Attrs: [ Type: Near64, Mode: Pointer, SizeOf: 8 ] | |
| # ArgList (0x1004) | |
| .short 0xe # Record length | |
| .short 0x1201 # Record kind: LF_ARGLIST | |
| .long 0x2 # NumArgs | |
| .long 0x1001 # Argument: const char* | |
| .long 0x1003 # Argument: volatile char* | |
| # Procedure (0x1005) | |
| .short 0xe # Record length | |
| .short 0x1008 # Record kind: LF_PROCEDURE | |
| .long 0x30 # ReturnType: bool | |
| .byte 0x0 # CallingConvention: NearC | |
| .byte 0x0 # FunctionOptions | |
| .short 0x2 # NumParameters | |
| .long 0x1004 # ArgListType: (const char*, volatile char*) | |
| # FuncId (0x1006) | |
| .short 0x12 # Record length | |
| .short 0x1601 # Record kind: LF_FUNC_ID | |
| .long 0x0 # ParentScope | |
| .long 0x1005 # FunctionType: bool (const char*, volatile char*) | |
| .asciz "func" # Name | |
| .byte 243 | |
| .byte 242 | |
| .byte 241 | |
| # ArgList (0x1007) | |
| .short 0x6 # Record length | |
| .short 0x1201 # Record kind: LF_ARGLIST | |
| .long 0x0 # NumArgs | |
| # Procedure (0x1008) | |
| .short 0xe # Record length | |
| .short 0x1008 # Record kind: LF_PROCEDURE | |
| .long 0x74 # ReturnType: int | |
| .byte 0x0 # CallingConvention: NearC | |
| .byte 0x0 # FunctionOptions | |
| .short 0x0 # NumParameters | |
| .long 0x1007 # ArgListType: () | |
| # FuncId (0x1009) | |
| .short 0x12 # Record length | |
| .short 0x1601 # Record kind: LF_FUNC_ID | |
| .long 0x0 # ParentScope | |
| .long 0x1008 # FunctionType: int () | |
| .asciz "main" # Name | |
| .byte 243 | |
| .byte 242 | |
| .byte 241 | |
| # Pointer (0x100A) | |
| .short 0xa # Record length | |
| .short 0x1002 # Record kind: LF_POINTER | |
| .long 0x1000 # PointeeType: const char | |
| .long 0x1040c # Attrs: [ Type: Near64, Mode: Pointer, SizeOf: 8, isConst ] | |
| # Array (0x100B) | |
| .short 0xe # Record length | |
| .short 0x1503 # Record kind: LF_ARRAY | |
| .long 0x100a # ElementType: const char* const | |
| .long 0x23 # IndexType: unsigned __int64 | |
| .short 0x8 # SizeOf | |
| .byte 0 # Name | |
| .byte 241 | |
| # Pointer (0x100C) | |
| .short 0xa # Record length | |
| .short 0x1002 # Record kind: LF_POINTER | |
| .long 0x100b # PointeeType | |
| .long 0x1002c # Attrs: [ Type: Near64, Mode: LValueReference, SizeOf: 8 ] | |
| # Pointer (0x100D) | |
| .short 0xa # Record length | |
| .short 0x1002 # Record kind: LF_POINTER | |
| .long 0x100a # PointeeType: const char* const | |
| .long 0x1000c # Attrs: [ Type: Near64, Mode: Pointer, SizeOf: 8 ] | |
| # Array (0x100E) | |
| .short 0xe # Record length | |
| .short 0x1503 # Record kind: LF_ARRAY | |
| .long 0x1002 # ElementType: volatile char | |
| .long 0x23 # IndexType: unsigned __int64 | |
| .short 0xa # SizeOf | |
| .byte 0 # Name | |
| .byte 241 |