Skip to content

Commit 799e1d6

Browse files
authored
[IR] Use EXPORTAS for ARM64EC mangled symbols with dllexport attribute. (#81940)
We currently just use mangled name. This works fine, because linker should detect that and demangle it for the export table. However, on MSVC, the compiler is more specific and passes demangled name as well, with EXPORTAS. This PR aims to match that. MSVC doesn't use quotes in this case, so I added '#' to the list of characters that don't need it.
1 parent 37c175a commit 799e1d6

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

llvm/lib/IR/Mangler.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
#include "llvm/IR/DerivedTypes.h"
1919
#include "llvm/IR/Function.h"
2020
#include "llvm/IR/Module.h"
21+
#include "llvm/Object/COFF.h"
2122
#include "llvm/Support/raw_ostream.h"
2223
#include "llvm/TargetParser/Triple.h"
24+
2325
using namespace llvm;
2426

2527
namespace {
@@ -192,7 +194,7 @@ void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
192194

193195
// Check if the name needs quotes to be safe for the linker to interpret.
194196
static bool canBeUnquotedInDirective(char C) {
195-
return isAlnum(C) || C == '_' || C == '@';
197+
return isAlnum(C) || C == '_' || C == '@' || C == '#';
196198
}
197199

198200
static bool canBeUnquotedInDirective(StringRef Name) {
@@ -233,6 +235,16 @@ void llvm::emitLinkerFlagsForGlobalCOFF(raw_ostream &OS, const GlobalValue *GV,
233235
} else {
234236
Mangler.getNameWithPrefix(OS, GV, false);
235237
}
238+
if (TT.isWindowsArm64EC()) {
239+
// Use EXPORTAS for mangled ARM64EC symbols.
240+
// FIXME: During LTO, we're invoked prior to the EC lowering pass,
241+
// so symbols are not yet mangled. Emitting the unmangled name
242+
// typically functions correctly; the linker can resolve the export
243+
// with the demangled alias.
244+
if (std::optional<std::string> demangledName =
245+
object::getArm64ECDemangledFunctionName(GV->getName()))
246+
OS << ",EXPORTAS," << *demangledName;
247+
}
236248
if (NeedQuotes)
237249
OS << "\"";
238250

llvm/test/CodeGen/AArch64/dllexport.ll

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: llc -mtriple aarch64-windows-gnu -filetype asm -o - %s | FileCheck %s -check-prefix CHECK -check-prefix CHECK-GNU
22
; RUN: llc -mtriple aarch64-windows-msvc -filetype asm -o - %s | FileCheck %s -check-prefix CHECK -check-prefix CHECK-MSVC
3+
; RUN: llc -mtriple arm64ec-windows-gnu -filetype asm -o - %s | FileCheck %s -check-prefix CHECK -check-prefix CHECK-GNU-EC
4+
; RUN: llc -mtriple arm64ec-windows-msvc -filetype asm -o - %s | FileCheck %s -check-prefix CHECK -check-prefix CHECK-MSVC-EC
35

46
define void @f() {
57
ret void
@@ -71,3 +73,40 @@ define weak_odr dllexport void @l() {
7173
; CHECK-MSVC: .ascii " /EXPORT:s"
7274
; CHECK-MSVC: .ascii " /EXPORT:t"
7375
; CHECK-MSVC: .ascii " /EXPORT:u"
76+
77+
; CHECK-GNU-EC-NOT: -export:f
78+
; CHECK-GNU-EC-NOT: -export:#f,EXPORTAS,f
79+
; CHECK-GNU-EC: .ascii " -export:#g,EXPORTAS,g
80+
; CHECK-GNU-EC: .ascii " -export:#h,EXPORTAS,h
81+
; CHECK-GNU-EC-NOT: -export:i
82+
; CHECK-GNU-EC-NOT: -export:#i,EXPORTAS,i
83+
; CHECK-GNU-EC: .ascii " -export:#j,EXPORTAS,j"
84+
; CHECK-GNU-EC: .ascii " -export:#k,EXPORTAS,k"
85+
; CHECK-GNU-EC: .ascii " -export:#l,EXPORTAS,l"
86+
; CHECK-GNU-EC: .ascii " -export:m,data"
87+
; CHECK-GNU-EC: .ascii " -export:n,data"
88+
; CHECK-GNU-EC: .ascii " -export:o,data"
89+
; CHECK-GNU-EC: .ascii " -export:p,data"
90+
; CHECK-GNU-EC: .ascii " -export:q,data"
91+
; CHECK-GNU-EC: .ascii " -export:r"
92+
; CHECK-GNU-EC: .ascii " -export:s"
93+
; CHECK-GNU-EC: .ascii " -export:t"
94+
; CHECK-GNU-EC: .ascii " -export:u"
95+
; CHECK-MSVC-EC-NOT: /EXPORT:f
96+
; CHECK-MSVC-EC-NOT: /EXPORT:#f,EXPORTAS,f
97+
; CHECK-MSVC-EC: .ascii " /EXPORT:#g,EXPORTAS,g"
98+
; CHECK-MSVC-EC: .ascii " /EXPORT:#h,EXPORTAS,h"
99+
; CHECK-MSVC-EC-NOT: /EXPORT:i
100+
; CHECK-MSVC-EC-NOT: /EXPORT:#i,EXPORTAS,i
101+
; CHECK-MSVC-EC: .ascii " /EXPORT:#j,EXPORTAS,j"
102+
; CHECK-MSVC-EC: .ascii " /EXPORT:#k,EXPORTAS,k"
103+
; CHECK-MSVC-EC: .ascii " /EXPORT:#l,EXPORTAS,l"
104+
; CHECK-MSVC-EC: .ascii " /EXPORT:m,DATA"
105+
; CHECK-MSVC-EC: .ascii " /EXPORT:n,DATA"
106+
; CHECK-MSVC-EC: .ascii " /EXPORT:o,DATA"
107+
; CHECK-MSVC-EC: .ascii " /EXPORT:p,DATA"
108+
; CHECK-MSVC-EC: .ascii " /EXPORT:q,DATA"
109+
; CHECK-MSVC-EC: .ascii " /EXPORT:r"
110+
; CHECK-MSVC-EC: .ascii " /EXPORT:s"
111+
; CHECK-MSVC-EC: .ascii " /EXPORT:t"
112+
; CHECK-MSVC-EC: .ascii " /EXPORT:u"

0 commit comments

Comments
 (0)