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