1# RUN: yaml2obj < %p/Inputs/export.yaml > %t.obj 2# 3# RUN: lld-link /out:%t.dll /dll %t.obj /export:exportfn1 /export:exportfn2 4# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=CHECK1 %s 5 6CHECK1: Export Table: 7CHECK1: DLL name: export.test.tmp.dll 8CHECK1: Ordinal RVA Name 9CHECK1-NEXT: 0 0 10CHECK1-NEXT: 1 0x1008 exportfn1 11CHECK1-NEXT: 2 0x1010 exportfn2 12 13# RUN: lld-link /out:%t.dll /dll %t.obj /export:exportfn1,@5 /export:exportfn2 14# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=CHECK2 %s 15 16CHECK2: Export Table: 17CHECK2: DLL name: export.test.tmp.dll 18CHECK2: Ordinal RVA Name 19CHECK2-NEXT: 0 0 20CHECK2-NEXT: 1 0 21CHECK2-NEXT: 2 0 22CHECK2-NEXT: 3 0 23CHECK2-NEXT: 4 0 24CHECK2-NEXT: 5 0x1008 exportfn1 25CHECK2-NEXT: 6 0x1010 exportfn2 26CHECK2-NEXT: 7 0x1010 exportfn3 27 28# RUN: lld-link /out:%t.dll /dll %t.obj /export:exportfn1,@5,noname /export:exportfn2 29# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=CHECK3 %s 30 31CHECK3: Export Table: 32CHECK3: DLL name: export.test.tmp.dll 33CHECK3: Ordinal RVA Name 34CHECK3-NEXT: 0 0 35CHECK3-NEXT: 1 0 36CHECK3-NEXT: 2 0 37CHECK3-NEXT: 3 0 38CHECK3-NEXT: 4 0 39CHECK3-NEXT: 5 0x1008 40CHECK3-NEXT: 6 0x1010 exportfn2 41 42# RUN: lld-link /out:%t.dll /dll %t.obj /export:f1=exportfn1 /export:f2=exportfn2 /implib:%t.lib 43# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=CHECK4 %s 44# RUN: llvm-nm %t.lib | FileCheck -check-prefix=CHECK4-NM %s 45 46CHECK4: Export Table: 47CHECK4: DLL name: export.test.tmp.dll 48CHECK4: Ordinal RVA Name 49CHECK4-NEXT: 0 0 50CHECK4-NEXT: 1 0x1010 exportfn3 51CHECK4-NEXT: 2 0x1008 f1 52CHECK4-NEXT: 3 0x1010 f2 53CHECK4-NM: 00000000 T f1 54CHECK4-NM: 00000000 T f2 55 56# RUN: echo "EXPORTS exportfn1 @3" > %t.def 57# RUN: echo "fn2=exportfn2 @2" >> %t.def 58# RUN: lld-link /out:%t.dll /dll %t.obj /def:%t.def 59# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=CHECK5 %s 60 61CHECK5: Export Table: 62CHECK5: DLL name: export.test.tmp.dll 63CHECK5: Ordinal RVA Name 64CHECK5-NEXT: 0 0 65CHECK5-NEXT: 1 0 66CHECK5-NEXT: 2 0x1010 fn2 67CHECK5-NEXT: 3 0x1008 exportfn1 68CHECK5-NEXT: 4 0x1010 exportfn3 69 70# RUN: lld-link /out:%t.DLL /dll %t.obj /export:exportfn1 /export:exportfn2 \ 71# RUN: /export:exportfn1 /export:exportfn2,@5 >& %t.log 72# RUN: FileCheck -check-prefix=CHECK6 %s < %t.log 73 74CHECK6: duplicate /export option: exportfn2 75CHECK6-NOT: duplicate /export option: exportfn1 76 77# RUN: llvm-nm -M %t.lib | FileCheck --check-prefix=SYMTAB %s 78 79SYMTAB: __imp_exportfn1 in export.test.tmp.DLL 80SYMTAB: exportfn1 in export.test.tmp.DLL 81SYMTAB: __imp_exportfn2 in export.test.tmp.DLL 82SYMTAB: exportfn2 in export.test.tmp.DLL 83SYMTAB: __imp_exportfn3 in export.test.tmp.DLL 84SYMTAB: exportfn3 in export.test.tmp.DLL 85 86# RUN: lld-link /out:%t.dll /dll %t.obj /export:foo=kernel32.foobar 87# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=FORWARDER %s 88 89# RUN: echo "EXPORTS foo=kernel32.foobar" > %t.def 90# RUN: lld-link /out:%t.dll /dll %t.obj /def:%t.def 91# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=FORWARDER %s 92 93FORWARDER: Export Table: 94FORWARDER: DLL name: export.test.tmp.dll 95FORWARDER: Ordinal base: 0 96FORWARDER: Ordinal RVA Name 97FORWARDER: 0 0 98FORWARDER: 1 0x1010 exportfn 99FORWARDER: 2 foo (forwarded to kernel32.foobar) 100 101# RUN: lld-link /out:%t.dll /dll %t.obj /merge:.rdata=.text /export:exportfn1 /export:exportfn2 102# RUN: llvm-objdump -p %t.dll | FileCheck --check-prefix=MERGE --match-full-lines %s 103 104MERGE: DLL name: export.test.tmp.dll 105MERGE: Ordinal RVA Name 106MERGE-NEXT: 0 0 107MERGE-NEXT: 1 0x1008 exportfn1 108MERGE-NEXT: 2 0x1010 exportfn2 109