# 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
