1Make a DLL that exports a few functions, then make a DLL with PDBs that imports
2them. Check that the __imp_ pointer and the generated thunks appear in the
3publics stream.
4
5RUN: yaml2obj < %p/Inputs/export.yaml > %t1.obj
6RUN: lld-link /out:%t1.dll /dll %t1.obj /implib:%t1.lib \
7RUN:   /export:exportfn1 /export:exportfn2
8RUN: yaml2obj < %p/Inputs/import.yaml > %t2.obj
9RUN: lld-link /out:%t2.exe /pdb:%t2.pdb /pdbaltpath:test.pdb \
10RUN:   /debug /entry:main %t2.obj %t1.lib
11RUN: llvm-pdbutil dump %t2.pdb -all | FileCheck %s
12
13CHECK:                             Streams
14CHECK-NEXT: ============================================================
15CHECK-LABEL:   Stream 10 ( 256 bytes): [Module "Import:pdb-publics-import.test.tmp1.dll"]
16
17CHECK:                         Module Stats
18CHECK-NEXT: ============================================================
19CHECK-NEXT: Mod 0000 | `{{.*}}pdb-publics-import.test.tmp2.obj`:
20CHECK-NEXT:   Mod 0 (debug info not present): [{{.*}}pdb-publics-import.test.tmp2.obj]
21CHECK-NEXT: Mod 0001 | `pdb-publics-import.test.tmp1.dll`:
22CHECK-NEXT:   Mod 1 (debug info not present): [pdb-publics-import.test.tmp1.dll]
23CHECK-NEXT: Mod 0002 | `Import:pdb-publics-import.test.tmp1.dll`:
24CHECK-NEXT:   Stream 10, 256 bytes
25
26CHECK:                           Modules
27CHECK-NEXT: ============================================================
28CHECK-NEXT:   Mod 0000 | `{{.*}}pdb-publics-import.test.tmp2.obj`:
29CHECK-NEXT:   SC[.text]  | mod = 0, 0001:0000, size = 8, data crc = 0, reloc crc = 0
30CHECK-NEXT:           IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE |
31CHECK-NEXT:           IMAGE_SCN_MEM_READ
32CHECK-NEXT:   Obj: `{{.*}}pdb-publics-import.test.tmp2.obj`:
33CHECK-NEXT:   debug stream: 65535, # files: 0, has ec info: false
34CHECK-NEXT:   pdb file ni: 0 ``, src file ni: 0 ``
35CHECK-NEXT: Mod 0001 | `pdb-publics-import.test.tmp1.dll`:
36CHECK-NEXT: SC[???]  | mod = 65535, 65535:0000, size = -1, data crc = 0, reloc crc = 0
37CHECK-NEXT:         none
38CHECK-NEXT: Obj: `{{.*}}pdb-publics-import.test.tmp1.lib`:
39CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false
40CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
41CHECK-NEXT: Mod 0002 | `Import:pdb-publics-import.test.tmp1.dll`:
42CHECK-NEXT: SC[.text]  | mod = 2, 0001:0032, size = 6, data crc = 0, reloc crc = 0
43CHECK-NEXT:         IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
44CHECK-NEXT: Obj: `{{.*}}pdb-publics-import.test.tmp1.lib`:
45CHECK-NEXT: debug stream: 10, # files: 0, has ec info: false
46CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
47CHECK-NEXT: Mod 0003 | `* Linker *`:
48CHECK-NEXT: SC[???]  | mod = 65535, 65535:0000, size = -1, data crc = 0, reloc crc = 0
49CHECK-NEXT:         none
50CHECK-NEXT: Obj: ``:
51CHECK-NEXT: debug stream: 11, # files: 0, has ec info: false
52CHECK-NEXT: pdb file ni: 1 `{{.*}}pdb-publics-import.test.tmp2.pdb`, src file ni: 0 ``
53
54CHECK:                             Public Symbols
55CHECK-NEXT: ============================================================
56CHECK-NEXT:    Records
57CHECK-NEXT:      112 | S_PUB32 [size = 20] `main`
58CHECK-NEXT:            flags = function, addr = 0001:0000
59CHECK-NEXT:       64 | S_PUB32 [size = 24] `exportfn1`
60CHECK-NEXT:            flags = function, addr = 0001:0016
61CHECK-NEXT:       88 | S_PUB32 [size = 24] `exportfn2`
62CHECK-NEXT:            flags = function, addr = 0001:0032
63CHECK-NEXT:       32 | S_PUB32 [size = 32] `__imp_exportfn2`
64CHECK-NEXT:            flags = none, addr = 0002:0136
65CHECK-NEXT:        0 | S_PUB32 [size = 32] `__imp_exportfn1`
66CHECK-NEXT:            flags = none, addr = 0002:0128
67
68CHECK:                           Symbols
69CHECK-NEXT: ============================================================
70CHECK-NEXT:   Mod 0000 | `{{.*}}pdb-publics-import.test.tmp2.obj`:
71CHECK-NEXT:   Error loading module stream 0.  The specified stream could not be loaded. Module stream not present
72CHECK-NEXT: Mod 0001 | `pdb-publics-import.test.tmp1.dll`:
73CHECK-NEXT: Error loading module stream 1.  The specified stream could not be loaded. Module stream not present
74CHECK-NEXT: Mod 0002 | `Import:pdb-publics-import.test.tmp1.dll`:
75CHECK-NEXT:      4 | S_OBJNAME [size = 44] sig=0, `pdb-publics-import.test.tmp1.dll`
76CHECK-NEXT:     48 | S_COMPILE3 [size = 40]
77CHECK-NEXT:          machine = intel x86-x64, Ver = LLVM Linker, language = link
78CHECK-NEXT:          frontend = 0.0.0.0, backend = 14.10.25019.0
79CHECK-NEXT:          flags = none
80CHECK-NEXT:     88 | S_THUNK32 [size = 36] `exportfn1`
81CHECK-NEXT:          parent = 0, end = 124, next = 0
82CHECK-NEXT:          kind = thunk, size = 6, addr = 0001:0016
83CHECK-NEXT:    124 | S_END [size = 4]
84CHECK-NEXT:    128 | S_OBJNAME [size = 44] sig=0, `pdb-publics-import.test.tmp1.dll`
85CHECK-NEXT:    172 | S_COMPILE3 [size = 40]
86CHECK-NEXT:          machine = intel x86-x64, Ver = LLVM Linker, language = link
87CHECK-NEXT:          frontend = 0.0.0.0, backend = 14.10.25019.0
88CHECK-NEXT:          flags = none
89CHECK-NEXT:    212 | S_THUNK32 [size = 36] `exportfn2`
90CHECK-NEXT:          parent = 0, end = 248, next = 0
91CHECK-NEXT:          kind = thunk, size = 6, addr = 0001:0032
92CHECK-NEXT:    248 | S_END [size = 4]
93CHECK-NEXT: Mod 0003 | `* Linker *`:
94CHECK-NEXT:      4 | S_OBJNAME [size = 20] sig=0, `* Linker *`
95CHECK-NEXT:     24 | S_COMPILE3 [size = 40]
96CHECK-NEXT:          machine = intel x86-x64, Ver = LLVM Linker, language = link
97CHECK-NEXT:          frontend = 0.0.0.0, backend = 14.10.25019.0
98CHECK-NEXT:          flags = none
99CHECK-NEXT:     64 | S_ENVBLOCK [size = {{[0-9]+}}]
100CHECK:  {{[0-9]+}} | S_SECTION [size = 28] `.text`
101CHECK-NEXT:          length = 38, alignment = 12, rva = 4096, section # = 1
102CHECK-NEXT:          characteristics =
103CHECK-NEXT:            code
104CHECK-NEXT:            execute permissions
105CHECK-NEXT:            read permissions
106CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 24] `.text`
107CHECK-NEXT:          length = 8, addr = 0001:0000
108CHECK-NEXT:          characteristics =
109CHECK-NEXT:            code
110CHECK-NEXT:            execute permissions
111CHECK-NEXT:            read permissions
112CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.rdata`
113CHECK-NEXT:          length = 209, alignment = 12, rva = 8192, section # = 2
114CHECK-NEXT:          characteristics =
115CHECK-NEXT:            initialized data
116CHECK-NEXT:            read permissions
117CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$2`
118CHECK-NEXT:          length = 40, addr = 0002:0061
119CHECK-NEXT:          characteristics =
120CHECK-NEXT:            initialized data
121CHECK-NEXT:            read permissions
122CHECK-NEXT:            write permissions
123CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$4`
124CHECK-NEXT:          length = 24, addr = 0002:0104
125CHECK-NEXT:          characteristics =
126CHECK-NEXT:            initialized data
127CHECK-NEXT:            read permissions
128CHECK-NEXT:            write permissions
129CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$5`
130CHECK-NEXT:          length = 24, addr = 0002:0128
131CHECK-NEXT:          characteristics =
132CHECK-NEXT:            initialized data
133CHECK-NEXT:            read permissions
134CHECK-NEXT:            write permissions
135CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$6`
136CHECK-NEXT:          length = 24, addr = 0002:0152
137CHECK-NEXT:          characteristics =
138CHECK-NEXT:            initialized data
139CHECK-NEXT:            read permissions
140CHECK-NEXT:            write permissions
141CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$7`
142CHECK-NEXT:          length = 33, addr = 0002:0176
143CHECK-NEXT:          characteristics =
144CHECK-NEXT:            initialized data
145CHECK-NEXT:            read permissions
146CHECK-NEXT:            write permissions
147
148CHECK:                         Section Contributions
149CHECK-NEXT: ============================================================
150    main
151CHECK-NEXT:   SC[.text]   | mod = 0, 0001:0000, size = 8, data crc = 0, reloc crc = 0
152CHECK-NEXT:                 IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE |
153CHECK-NEXT:                 IMAGE_SCN_MEM_READ
154    exportfn1 thunk
155CHECK-NEXT:   SC[.text]   | mod = 3, 0001:0016, size = 6, data crc = 0, reloc crc = 0
156CHECK-NEXT:                 IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
157    exportfn2 thunk
158CHECK-NEXT:   SC[.text]   | mod = 3, 0001:0032, size = 6, data crc = 0, reloc crc = 0
159CHECK-NEXT:                 IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
160    .rdata debug directory data chunks
161CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0000, size = 28, data crc = 0, reloc crc = 0
162CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
163CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0028, size = 33, data crc = 0, reloc crc = 0
164CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
165CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0061, size = 20, data crc = 0, reloc crc = 0
166CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
167CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0081, size = 20, data crc = 0, reloc crc = 0
168CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
169CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0104, size = 8, data crc = 0, reloc crc = 0
170CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
171CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0112, size = 8, data crc = 0, reloc crc = 0
172CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
173CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0120, size = 8, data crc = 0, reloc crc = 0
174CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
175CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0128, size = 8, data crc = 0, reloc crc = 0
176CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
177CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0136, size = 8, data crc = 0, reloc crc = 0
178CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
179CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0144, size = 8, data crc = 0, reloc crc = 0
180CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
181CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0152, size = 12, data crc = 0, reloc crc = 0
182CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
183CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0164, size = 12, data crc = 0, reloc crc = 0
184CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
185CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0176, size = 33, data crc = 0, reloc crc = 0
186CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
187