xref: /llvm-project/lld/test/COFF/def-export-stdcall.s (revision a2e5287d5a499521aaf093f812cbedcbbc2a4bc8)
1# REQUIRES: x86
2# RUN: llvm-mc -filetype=obj -triple=i686-windows-msvc %s -o %t.obj
3# RUN: echo -e "LIBRARY foo\nEXPORTS\n  stdcall\n  fastcall\n  vectorcall\n  _underscored" > %t.def
4# RUN: lld-link -safeseh:no -entry:dllmain -dll -def:%t.def %t.obj -out:%t.dll -implib:%t.lib
5# RUN: llvm-readobj %t.lib | FileCheck -check-prefix UNDECORATED-IMPLIB %s
6# RUN: llvm-readobj --coff-exports %t.dll | FileCheck -check-prefix UNDECORATED-EXPORTS %s
7
8# UNDECORATED-IMPLIB: Name type: noprefix
9# UNDECORATED-IMPLIB-NEXT: Export name: _underscored
10# UNDECORATED-IMPLIB-NEXT: __imp___underscored
11# UNDECORATED-IMPLIB-NEXT: __underscored
12# UNDECORATED-IMPLIB: Name type: undecorate
13# UNDECORATED-IMPLIB-NEXT: Export name: fastcall
14# UNDECORATED-IMPLIB-NEXT: __imp_@fastcall@8
15# UNDECORATED-IMPLIB-NEXT: fastcall@8
16# UNDECORATED-IMPLIB: Name type: undecorate
17# UNDECORATED-IMPLIB-NEXT: Export name: stdcall
18# UNDECORATED-IMPLIB-NEXT: __imp__stdcall@8
19# UNDECORATED-IMPLIB-NEXT: _stdcall@8
20# UNDECORATED-IMPLIB: Name type: undecorate
21# UNDECORATED-IMPLIB-NEXT: Export name: vectorcall
22# UNDECORATED-IMPLIB-NEXT: __imp_vectorcall@@8
23# UNDECORATED-IMPLIB-NEXT: vectorcall@@8
24
25# UNDECORATED-EXPORTS: Name: _underscored
26# UNDECORATED-EXPORTS: Name: fastcall
27# UNDECORATED-EXPORTS: Name: stdcall
28# UNDECORATED-EXPORTS: Name: vectorcall
29
30
31# RUN: echo -e "LIBRARY foo\nEXPORTS\n  _stdcall@8\n  @fastcall@8\n  vectorcall@@8" > %t.def
32# RUN: lld-link -safeseh:no -entry:dllmain -dll -def:%t.def %t.obj -out:%t.dll -implib:%t.lib
33# RUN: llvm-readobj %t.lib | FileCheck -check-prefix DECORATED-IMPLIB %s
34# RUN: llvm-readobj --coff-exports %t.dll | FileCheck -check-prefix DECORATED-EXPORTS %s
35
36# DECORATED-IMPLIB: Name type: name
37# DECORATED-IMPLIB-NEXT: Export name: @fastcall@8
38# DECORATED-IMPLIB-NEXT: __imp_@fastcall@8
39# DECORATED-IMPLIB-NEXT: @fastcall@8
40# DECORATED-IMPLIB: Name type: name
41# DECORATED-IMPLIB-NEXT: Export name: _stdcall@8
42# DECORATED-IMPLIB-NEXT: __imp__stdcall@8
43# DECORATED-IMPLIB-NEXT: _stdcall@8
44# DECORATED-IMPLIB: Name type: name
45# DECORATED-IMPLIB-NEXT: Export name: vectorcall@@8
46# DECORATED-IMPLIB-NEXT: __imp_vectorcall@@8
47# DECORATED-IMPLIB-NEXT: vectorcall@@8
48
49# DECORATED-EXPORTS: Name: @fastcall@8
50# DECORATED-EXPORTS: Name: _stdcall@8
51# DECORATED-EXPORTS: Name: vectorcall@@8
52
53
54# GNU tools don't support vectorcall at the moment, but test it for completeness.
55# RUN: echo -e "LIBRARY foo\nEXPORTS\n  stdcall@8\n  @fastcall@8\n  vectorcall@@8" > %t.def
56# RUN: lld-link -lldmingw -entry:dllmain -dll -def:%t.def %t.obj -out:%t.dll -implib:%t.lib
57# RUN: llvm-readobj %t.lib | FileCheck -check-prefix DECORATED-MINGW-IMPLIB %s
58# RUN: llvm-readobj --coff-exports %t.dll | FileCheck -check-prefix DECORATED-MINGW-EXPORTS %s
59
60# DECORATED-MINGW-IMPLIB: Name type: name
61# DECORATED-MINGW-IMPLIB-NEXT: Export name: @fastcall@8
62# DECORATED-MINGW-IMPLIB-NEXT: __imp_@fastcall@8
63# DECORATED-MINGW-IMPLIB-NEXT: fastcall@8
64# DECORATED-MINGW-IMPLIB: Name type: noprefix
65# DECORATED-MINGW-IMPLIB-NEXT: Export name: stdcall@8
66# DECORATED-MINGW-IMPLIB-NEXT: __imp__stdcall@8
67# DECORATED-MINGW-IMPLIB-NEXT: _stdcall@8
68# GNU tools don't support vectorcall, but this test is just to track that
69# lld's behaviour remains consistent over time.
70# DECORATED-MINGW-IMPLIB: Name type: name
71# DECORATED-MINGW-IMPLIB-NEXT: Export name: vectorcall@@8
72# DECORATED-MINGW-IMPLIB-NEXT: __imp_vectorcall@@8
73# DECORATED-MINGW-IMPLIB-NEXT: vectorcall@@8
74
75# DECORATED-MINGW-EXPORTS: Name: @fastcall@8
76# DECORATED-MINGW-EXPORTS: Name: stdcall@8
77# DECORATED-MINGW-EXPORTS: Name: vectorcall@@8
78
79# RUN: lld-link -lldmingw -kill-at -entry:dllmain -dll -def:%t.def %t.obj -out:%t.dll -implib:%t.lib
80# RUN: llvm-readobj %t.lib | FileCheck -check-prefix MINGW-KILL-AT-IMPLIB %s
81# RUN: llvm-readobj --coff-exports %t.dll | FileCheck -check-prefix MINGW-KILL-AT-EXPORTS %s
82
83# RUN: lld-link -lldmingw -kill-at -entry:dllmain -dll %t.obj -out:%t.dll -implib:%t.lib
84# RUN: llvm-readobj %t.lib | FileCheck -check-prefix MINGW-KILL-AT-IMPLIB %s
85# RUN: llvm-readobj --coff-exports %t.dll | FileCheck -check-prefix MINGW-KILL-AT-EXPORTS %s
86
87# MINGW-KILL-AT-IMPLIB: Name type: noprefix
88# MINGW-KILL-AT-IMPLIB: Export name: fastcall
89# MINGW-KILL-AT-IMPLIB: __imp__fastcall
90# MINGW-KILL-AT-IMPLIB-NEXT: _fastcall
91# MINGW-KILL-AT-IMPLIB: Name type: noprefix
92# MINGW-KILL-AT-IMPLIB-NEXT: Export name: stdcall
93# MINGW-KILL-AT-IMPLIB-NEXT: __imp__stdcall
94# MINGW-KILL-AT-IMPLIB-NEXT: _stdcall
95# GNU tools don't support vectorcall, but this test is just to track that
96# lld's behaviour remains consistent over time.
97# MINGW-KILL-AT-IMPLIB: Name type: noprefix
98# MINGW-KILL-AT-IMPLIB-NEXT: Export name: vectorcall
99# MINGW-KILL-AT-IMPLIB-NEXT: __imp__vectorcall
100# MINGW-KILL-AT-IMPLIB-NEXT: _vectorcall
101
102# MINGW-KILL-AT-EXPORTS: Name: fastcall
103# MINGW-KILL-AT-EXPORTS: Name: stdcall
104# MINGW-KILL-AT-EXPORTS: Name: vectorcall
105
106
107        .def     _stdcall@8;
108        .scl    2;
109        .type   32;
110        .endef
111        .globl  _stdcall@8
112        .globl  @fastcall@8
113        .globl  vectorcall@@8
114        .globl  __underscored
115_stdcall@8:
116        movl    8(%esp), %eax
117        addl    4(%esp), %eax
118        retl    $8
119@fastcall@8:
120        movl    8(%esp), %eax
121        addl    4(%esp), %eax
122        retl    $8
123vectorcall@@8:
124        movl    8(%esp), %eax
125        addl    4(%esp), %eax
126        retl    $8
127__underscored:
128        ret
129
130        .def     _dllmain;
131        .scl    2;
132        .type   32;
133        .endef
134        .globl  _dllmain
135_dllmain:
136        retl
137
138