1# REQUIRES: x86 2# RUN: llvm-mc -filetype=obj %s -o %t.obj -triple x86_64-windows-msvc 3# RUN: lld-link -entry:main -nodefaultlib %t.obj -out:%t.exe -pdb:%t.pdb -debug 4# RUN: llvm-pdbutil dump -il %t.pdb | FileCheck %s 5 6# Compiled from this C code, with modifications to test multiple file checksums: 7# volatile int x; 8# static __forceinline void inlinee_2(void) { 9# ++x; 10# __debugbreak(); 11# ++x; 12# } 13# static __forceinline void inlinee_1(void) { 14# ++x; 15# inlinee_2(); 16# ++x; 17# } 18# int main() { 19# ++x; 20# inlinee_1(); 21# ++x; 22# return x; 23# } 24 25# CHECK: Inlinee Lines 26# CHECK: Mod 0000 | `{{.*}}pdb-inlinees.s.tmp.obj`: 27# CHECK-NEXT: Inlinee | Line | Source File 28# CHECK-NEXT: 0x1000 | 7 | C:\src\llvm-project\build\t.c (MD5: A79D837C976E9F0463A474D74E2EE9E7) 29# CHECK-NEXT: 0x1001 | 2 | C:\src\llvm-project\build\file2.h (MD5: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) 30 31 .text 32 .def @feat.00; 33 .scl 3; 34 .type 0; 35 .endef 36 .globl @feat.00 37.set @feat.00, 0 38 .intel_syntax noprefix 39 .file "t.c" 40 .def main; 41 .scl 2; 42 .type 32; 43 .endef 44 .section .text,"xr",one_only,main 45 .globl main # -- Begin function main 46main: # @main 47.Lfunc_begin0: 48 .cv_func_id 0 49# %bb.0: # %entry 50 .cv_file 1 "C:\\src\\llvm-project\\build\\t.c" "A79D837C976E9F0463A474D74E2EE9E7" 1 51 .cv_file 2 "C:\\src\\llvm-project\\build\\file2.h" "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" 1 52 .cv_loc 0 1 13 0 # t.c:13:0 53 inc dword ptr [rip + x] 54.Ltmp0: 55 .cv_inline_site_id 1 within 0 inlined_at 1 14 0 56 .cv_loc 1 1 8 0 # t.c:8:0 57 inc dword ptr [rip + x] 58.Ltmp1: 59 .cv_inline_site_id 2 within 1 inlined_at 1 9 0 60 .cv_loc 2 2 3 0 # file2.h:3:0 61 inc dword ptr [rip + x] 62 .cv_loc 2 2 4 0 # file2.h:4:0 63 int3 64 .cv_loc 2 2 5 0 # file2.h:5:0 65 inc dword ptr [rip + x] 66.Ltmp2: 67 .cv_loc 1 1 10 0 # t.c:10:0 68 inc dword ptr [rip + x] 69.Ltmp3: 70 .cv_loc 0 1 15 0 # t.c:15:0 71 inc dword ptr [rip + x] 72 .cv_loc 0 1 16 0 # t.c:16:0 73 mov eax, dword ptr [rip + x] 74 ret 75.Ltmp4: 76.Lfunc_end0: 77 # -- End function 78 .comm x,4,2 # @x 79 .section .debug$S,"dr" 80 .p2align 2 81 .long 4 # Debug section magic 82 .long 241 83 .long .Ltmp6-.Ltmp5 # Subsection size 84.Ltmp5: 85 .short .Ltmp8-.Ltmp7 # Record length 86.Ltmp7: 87 .short 4412 # Record kind: S_COMPILE3 88 .long 0 # Flags and language 89 .short 208 # CPUType 90 .short 9 # Frontend version 91 .short 0 92 .short 0 93 .short 0 94 .short 9000 # Backend version 95 .short 0 96 .short 0 97 .short 0 98 .asciz "clang version 9.0.0 (git@github.com:llvm/llvm-project.git aa762a56caf3ef2b0b41c501e66d3ef32903a2d0)" # Null-terminated compiler version string 99 .p2align 2 100.Ltmp8: 101.Ltmp6: 102 .p2align 2 103 .long 246 # Inlinee lines subsection 104 .long .Ltmp10-.Ltmp9 # Subsection size 105.Ltmp9: 106 .long 0 # Inlinee lines signature 107 108 # Inlined function inlinee_1 starts at t.c:7 109 .long 4098 # Type index of inlined function 110 .cv_filechecksumoffset 1 # Offset into filechecksum table 111 .long 7 # Starting line number 112 113 # Inlined function inlinee_2 starts at file2.h:2 114 .long 4099 # Type index of inlined function 115 .cv_filechecksumoffset 2 # Offset into filechecksum table 116 .long 2 # Starting line number 117.Ltmp10: 118 .p2align 2 119 .section .debug$S,"dr",associative,main 120 .p2align 2 121 .long 4 # Debug section magic 122 .long 241 # Symbol subsection for main 123 .long .Ltmp12-.Ltmp11 # Subsection size 124.Ltmp11: 125 .short .Ltmp14-.Ltmp13 # Record length 126.Ltmp13: 127 .short 4423 # Record kind: S_GPROC32_ID 128 .long 0 # PtrParent 129 .long 0 # PtrEnd 130 .long 0 # PtrNext 131 .long .Lfunc_end0-main # Code size 132 .long 0 # Offset after prologue 133 .long 0 # Offset before epilogue 134 .long 4101 # Function type index 135 .secrel32 main # Function section relative address 136 .secidx main # Function section index 137 .byte 0 # Flags 138 .asciz "main" # Function name 139 .p2align 2 140.Ltmp14: 141 .short .Ltmp16-.Ltmp15 # Record length 142.Ltmp15: 143 .short 4114 # Record kind: S_FRAMEPROC 144 .long 0 # FrameSize 145 .long 0 # Padding 146 .long 0 # Offset of padding 147 .long 0 # Bytes of callee saved registers 148 .long 0 # Exception handler offset 149 .short 0 # Exception handler section 150 .long 0 # Flags (defines frame register) 151 .p2align 2 152.Ltmp16: 153 .short .Ltmp18-.Ltmp17 # Record length 154.Ltmp17: 155 .short 4429 # Record kind: S_INLINESITE 156 .long 0 # PtrParent 157 .long 0 # PtrEnd 158 .long 4098 # Inlinee type index 159 .cv_inline_linetable 1 1 7 .Lfunc_begin0 .Lfunc_end0 160 .p2align 2 161.Ltmp18: 162 .short .Ltmp20-.Ltmp19 # Record length 163.Ltmp19: 164 .short 4429 # Record kind: S_INLINESITE 165 .long 0 # PtrParent 166 .long 0 # PtrEnd 167 .long 4099 # Inlinee type index 168 .cv_inline_linetable 2 2 2 .Lfunc_begin0 .Lfunc_end0 169 .p2align 2 170.Ltmp20: 171 .short 2 # Record length 172 .short 4430 # Record kind: S_INLINESITE_END 173 .short 2 # Record length 174 .short 4430 # Record kind: S_INLINESITE_END 175 .short 2 # Record length 176 .short 4431 # Record kind: S_PROC_ID_END 177.Ltmp12: 178 .p2align 2 179 .cv_linetable 0, main, .Lfunc_end0 180 .section .debug$S,"dr" 181 .long 241 # Symbol subsection for globals 182 .long .Ltmp22-.Ltmp21 # Subsection size 183.Ltmp21: 184 .short .Ltmp24-.Ltmp23 # Record length 185.Ltmp23: 186 .short 4365 # Record kind: S_GDATA32 187 .long 4102 # Type 188 .secrel32 x # DataOffset 189 .secidx x # Segment 190 .asciz "x" # Name 191 .p2align 2 192.Ltmp24: 193.Ltmp22: 194 .p2align 2 195 .cv_filechecksums # File index to string table offset subsection 196 .cv_stringtable # String table 197 .long 241 198 .long .Ltmp26-.Ltmp25 # Subsection size 199.Ltmp25: 200 .short .Ltmp28-.Ltmp27 # Record length 201.Ltmp27: 202 .short 4428 # Record kind: S_BUILDINFO 203 .long 4105 # LF_BUILDINFO index 204 .p2align 2 205.Ltmp28: 206.Ltmp26: 207 .p2align 2 208 .section .debug$T,"dr" 209 .p2align 2 210 .long 4 # Debug section magic 211 # ArgList (0x1000) { 212 # TypeLeafKind: LF_ARGLIST (0x1201) 213 # NumArgs: 0 214 # Arguments [ 215 # ] 216 # } 217 .byte 0x06, 0x00, 0x01, 0x12 218 .byte 0x00, 0x00, 0x00, 0x00 219 # Procedure (0x1001) { 220 # TypeLeafKind: LF_PROCEDURE (0x1008) 221 # ReturnType: void (0x3) 222 # CallingConvention: NearC (0x0) 223 # FunctionOptions [ (0x0) 224 # ] 225 # NumParameters: 0 226 # ArgListType: () (0x1000) 227 # } 228 .byte 0x0e, 0x00, 0x08, 0x10 229 .byte 0x03, 0x00, 0x00, 0x00 230 .byte 0x00, 0x00, 0x00, 0x00 231 .byte 0x00, 0x10, 0x00, 0x00 232 # FuncId (0x1002) { 233 # TypeLeafKind: LF_FUNC_ID (0x1601) 234 # ParentScope: 0x0 235 # FunctionType: void () (0x1001) 236 # Name: inlinee_1 237 # } 238 .byte 0x16, 0x00, 0x01, 0x16 239 .byte 0x00, 0x00, 0x00, 0x00 240 .byte 0x01, 0x10, 0x00, 0x00 241 .byte 0x69, 0x6e, 0x6c, 0x69 242 .byte 0x6e, 0x65, 0x65, 0x5f 243 .byte 0x31, 0x00, 0xf2, 0xf1 244 # FuncId (0x1003) { 245 # TypeLeafKind: LF_FUNC_ID (0x1601) 246 # ParentScope: 0x0 247 # FunctionType: void () (0x1001) 248 # Name: inlinee_2 249 # } 250 .byte 0x16, 0x00, 0x01, 0x16 251 .byte 0x00, 0x00, 0x00, 0x00 252 .byte 0x01, 0x10, 0x00, 0x00 253 .byte 0x69, 0x6e, 0x6c, 0x69 254 .byte 0x6e, 0x65, 0x65, 0x5f 255 .byte 0x32, 0x00, 0xf2, 0xf1 256 # Procedure (0x1004) { 257 # TypeLeafKind: LF_PROCEDURE (0x1008) 258 # ReturnType: int (0x74) 259 # CallingConvention: NearC (0x0) 260 # FunctionOptions [ (0x0) 261 # ] 262 # NumParameters: 0 263 # ArgListType: () (0x1000) 264 # } 265 .byte 0x0e, 0x00, 0x08, 0x10 266 .byte 0x74, 0x00, 0x00, 0x00 267 .byte 0x00, 0x00, 0x00, 0x00 268 .byte 0x00, 0x10, 0x00, 0x00 269 # FuncId (0x1005) { 270 # TypeLeafKind: LF_FUNC_ID (0x1601) 271 # ParentScope: 0x0 272 # FunctionType: int () (0x1004) 273 # Name: main 274 # } 275 .byte 0x12, 0x00, 0x01, 0x16 276 .byte 0x00, 0x00, 0x00, 0x00 277 .byte 0x04, 0x10, 0x00, 0x00 278 .byte 0x6d, 0x61, 0x69, 0x6e 279 .byte 0x00, 0xf3, 0xf2, 0xf1 280 # Modifier (0x1006) { 281 # TypeLeafKind: LF_MODIFIER (0x1001) 282 # ModifiedType: int (0x74) 283 # Modifiers [ (0x2) 284 # Volatile (0x2) 285 # ] 286 # } 287 .byte 0x0a, 0x00, 0x01, 0x10 288 .byte 0x74, 0x00, 0x00, 0x00 289 .byte 0x02, 0x00, 0xf2, 0xf1 290 # StringId (0x1007) { 291 # TypeLeafKind: LF_STRING_ID (0x1605) 292 # Id: 0x0 293 # StringData: C:\src\llvm-project\build 294 # } 295 .byte 0x22, 0x00, 0x05, 0x16 296 .byte 0x00, 0x00, 0x00, 0x00 297 .byte 0x43, 0x3a, 0x5c, 0x73 298 .byte 0x72, 0x63, 0x5c, 0x6c 299 .byte 0x6c, 0x76, 0x6d, 0x2d 300 .byte 0x70, 0x72, 0x6f, 0x6a 301 .byte 0x65, 0x63, 0x74, 0x5c 302 .byte 0x62, 0x75, 0x69, 0x6c 303 .byte 0x64, 0x00, 0xf2, 0xf1 304 # StringId (0x1008) { 305 # TypeLeafKind: LF_STRING_ID (0x1605) 306 # Id: 0x0 307 # StringData: t.c 308 # } 309 .byte 0x0a, 0x00, 0x05, 0x16 310 .byte 0x00, 0x00, 0x00, 0x00 311 .byte 0x74, 0x2e, 0x63, 0x00 312 # BuildInfo (0x1009) { 313 # TypeLeafKind: LF_BUILDINFO (0x1603) 314 # NumArgs: 5 315 # Arguments [ 316 # ArgType: C:\src\llvm-project\build (0x1007) 317 # ArgType: 0x0 318 # ArgType: t.c (0x1008) 319 # ArgType: 0x0 320 # ArgType: 0x0 321 # ] 322 # } 323 .byte 0x1a, 0x00, 0x03, 0x16 324 .byte 0x05, 0x00, 0x07, 0x10 325 .byte 0x00, 0x00, 0x00, 0x00 326 .byte 0x00, 0x00, 0x08, 0x10 327 .byte 0x00, 0x00, 0x00, 0x00 328 .byte 0x00, 0x00, 0x00, 0x00 329 .byte 0x00, 0x00, 0xf2, 0xf1 330 331 .addrsig 332 .addrsig_sym x 333