Skip to content

Commit c7a3469

Browse files
committed
[IR] Use EXPORTAS for ARM64EC mangled symbols with dllexport attribute.
1 parent 49839f9 commit c7a3469

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)