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