view test/MC/COFF/cv-inline-linetable-unlikely.s @ 121:803732b1fca8

LLVM 5.0
author kono
date Fri, 27 Oct 2017 17:07:41 +0900
parents 1172e4bd9c6f
children c2174574ed3a
line wrap: on
line source

# RUN: llvm-mc -triple=x86_64-windows -filetype=obj < %s | llvm-readobj -codeview | FileCheck %s

# C source to generate the assembly:
# volatile int unlikely_cond = 0;
# extern void __declspec(noreturn) abort();
# __forceinline void f() {
#   if (unlikely_cond)
#     abort();
# }
# void g() {
#   unlikely_cond = 0;
#   f();
#   unlikely_cond = 0;
# }

# This test is interesting because the inlined instructions are discontiguous.
# LLVM's block layout algorithms will put the 'abort' call last, as it is
# considered highly unlikely to execute. This is similar to what it does for
# calls to __asan_report*, for which it is very important to have an accurate
# stack trace.

# CHECK:    GlobalProcIdSym {
# CHECK:      FunctionType: g (0x1003)
# CHECK:      CodeOffset: g+0x0
# CHECK:      DisplayName: g
# CHECK:      LinkageName: g
# CHECK:    }
# CHECK:    InlineSiteSym {
# CHECK:      Inlinee: f (0x1002)
# CHECK:      BinaryAnnotations [
# CHECK-NEXT:   ChangeCodeOffsetAndLineOffset: {CodeOffset: 0xE, LineOffset: 1}
# CHECK-NEXT:   ChangeCodeLength: 0x9
# CHECK-NEXT:   ChangeCodeOffsetAndLineOffset: {CodeOffset: 0xF, LineOffset: 1}
# CHECK-NEXT:   ChangeCodeLength: 0x7
# CHECK-NEXT: ]

	.text
	.globl	g
g:                                      # @g
.Lfunc_begin0:
	.cv_func_id 0
	.cv_file	1 "C:\\src\\llvm\\build\\t.cpp"
	.cv_loc	0 1 7 0 is_stmt 0       # t.cpp:7:0
.seh_proc g
	subq	$40, %rsp
	.seh_stackalloc 40
	.seh_endprologue
	.cv_loc	0 1 8 17                # t.cpp:8:17
	movl	$0, unlikely_cond(%rip)
	.cv_inline_site_id 1 within 0 inlined_at 1 9 3
	.cv_loc	1 1 4 7                 # t.cpp:4:7
	cmpl	$0, unlikely_cond(%rip)
	jne	.LBB0_1
	.cv_loc	0 1 10 17               # t.cpp:10:17
	movl	$0, unlikely_cond(%rip)
	.cv_loc	0 1 11 1                # t.cpp:11:1
	addq	$40, %rsp
	retq

.LBB0_1:                                # %if.then.i
	.cv_loc	1 1 5 5                 # t.cpp:5:5
	callq	abort
	ud2
.Lfunc_end0:
	.seh_handlerdata
	.text
	.seh_endproc

	.bss
	.globl	unlikely_cond           # @unlikely_cond
	.p2align	2
unlikely_cond:
	.long	0                       # 0x0

	.section	.debug$S,"dr"
	.p2align	2
	.long	4                       # Debug section magic
	.long	246                     # Inlinee lines subsection
	.long	.Ltmp9-.Ltmp8           # Subsection size
.Ltmp8:
	.long	0                       # Inlinee lines signature

                                        # Inlined function f starts at t.cpp:3
	.long	4098                    # Type index of inlined function
	.long	0                       # Offset into filechecksum table
	.long	3                       # Starting line number
.Ltmp9:
	.p2align	2
	.long	241                     # Symbol subsection for g
	.long	.Ltmp11-.Ltmp10         # Subsection size
.Ltmp10:
	.short	.Ltmp13-.Ltmp12         # Record length
.Ltmp12:
	.short	4423                    # Record kind: S_GPROC32_ID
	.long	0                       # PtrParent
	.long	0                       # PtrEnd
	.long	0                       # PtrNext
	.long	.Lfunc_end0-g           # Code size
	.long	0                       # Offset after prologue
	.long	0                       # Offset before epilogue
	.long	4099                    # Function type index
	.secrel32	g               # Function section relative address
	.secidx	g                       # Function section index
	.byte	0                       # Flags
	.asciz	"g"                     # Function name
.Ltmp13:
	.short	.Ltmp15-.Ltmp14         # Record length
.Ltmp14:
	.short	4429                    # Record kind: S_INLINESITE
	.long	0                       # PtrParent
	.long	0                       # PtrEnd
	.long	4098                    # Inlinee type index
	.cv_inline_linetable	1 1 3 .Lfunc_begin0 .Lfunc_end0
.Ltmp15:
	.short	2                       # Record length
	.short	4430                    # Record kind: S_INLINESITE_END
	.short	2                       # Record length
	.short	4431                    # Record kind: S_PROC_ID_END
.Ltmp11:
	.p2align	2
	.cv_linetable	0, g, .Lfunc_end0
	.long	241                     # Symbol subsection for globals
	.long	.Ltmp17-.Ltmp16         # Subsection size
.Ltmp16:
	.short	.Ltmp19-.Ltmp18         # Record length
.Ltmp18:
	.short	4365                    # Record kind: S_GDATA32
	.long	4100                    # Type
	.secrel32	unlikely_cond   # DataOffset
	.secidx	unlikely_cond           # Segment
	.asciz	"unlikely_cond"         # Name
.Ltmp19:
.Ltmp17:
	.p2align	2
	.cv_filechecksums               # File index to string table offset subsection
	.cv_stringtable                 # String table
	.section	.debug$T,"dr"
	.p2align	2
	.long	4                       # Debug section magic
	# ArgList (0x1000) {
	#   TypeLeafKind: LF_ARGLIST (0x1201)
	#   NumArgs: 0
	#   Arguments [
	#   ]
	# }
	.byte	0x06, 0x00, 0x01, 0x12
	.byte	0x00, 0x00, 0x00, 0x00
	# Procedure (0x1001) {
	#   TypeLeafKind: LF_PROCEDURE (0x1008)
	#   ReturnType: void (0x3)
	#   CallingConvention: NearC (0x0)
	#   FunctionOptions [ (0x0)
	#   ]
	#   NumParameters: 0
	#   ArgListType: () (0x1000)
	# }
	.byte	0x0e, 0x00, 0x08, 0x10
	.byte	0x03, 0x00, 0x00, 0x00
	.byte	0x00, 0x00, 0x00, 0x00
	.byte	0x00, 0x10, 0x00, 0x00
	# FuncId (0x1002) {
	#   TypeLeafKind: LF_FUNC_ID (0x1601)
	#   ParentScope: 0x0
	#   FunctionType: void () (0x1001)
	#   Name: f
	# }
	.byte	0x0e, 0x00, 0x01, 0x16
	.byte	0x00, 0x00, 0x00, 0x00
	.byte	0x01, 0x10, 0x00, 0x00
	.byte	0x66, 0x00, 0xf2, 0xf1
	# FuncId (0x1003) {
	#   TypeLeafKind: LF_FUNC_ID (0x1601)
	#   ParentScope: 0x0
	#   FunctionType: void () (0x1001)
	#   Name: g
	# }
	.byte	0x0e, 0x00, 0x01, 0x16
	.byte	0x00, 0x00, 0x00, 0x00
	.byte	0x01, 0x10, 0x00, 0x00
	.byte	0x67, 0x00, 0xf2, 0xf1
	# Modifier (0x1004) {
	#   TypeLeafKind: LF_MODIFIER (0x1001)
	#   ModifiedType: int (0x74)
	#   Modifiers [ (0x2)
	#     Volatile (0x2)
	#   ]
	# }
	.byte	0x0a, 0x00, 0x01, 0x10
	.byte	0x74, 0x00, 0x00, 0x00
	.byte	0x02, 0x00, 0xf2, 0xf1