Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 0124e08

Browse filesBrowse files
authored
[Object][COFF][NFC] Introduce Arm64ECThunkType enum. (#85936)
And use it in EC lowering code. It will be useful for LLD too.
1 parent 8ecc377 commit 0124e08
Copy full SHA for 0124e08

File tree

Expand file treeCollapse file tree

2 files changed

+35
-28
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+35
-28
lines changed

‎llvm/include/llvm/BinaryFormat/COFF.h

Copy file name to clipboardExpand all lines: llvm/include/llvm/BinaryFormat/COFF.h
+6Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,12 @@ enum Feat00Flags : uint32_t {
806806
Kernel = 0x40000000,
807807
};
808808

809+
enum class Arm64ECThunkType : uint8_t {
810+
GuestExit = 0,
811+
Entry = 1,
812+
Exit = 4,
813+
};
814+
809815
inline bool isReservedSectionNumber(int32_t SectionNumber) {
810816
return SectionNumber <= 0;
811817
}

‎llvm/lib/Target/AArch64/AArch64Arm64ECCallLowering.cpp

Copy file name to clipboardExpand all lines: llvm/lib/Target/AArch64/AArch64Arm64ECCallLowering.cpp
+29-28Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "llvm/TargetParser/Triple.h"
3131

3232
using namespace llvm;
33+
using namespace llvm::COFF;
3334
using namespace llvm::object;
3435

3536
using OperandBundleDef = OperandBundleDefT<Value *>;
@@ -45,8 +46,6 @@ static cl::opt<bool> GenerateThunks("arm64ec-generate-thunks", cl::Hidden,
4546

4647
namespace {
4748

48-
enum class ThunkType { GuestExit, Entry, Exit };
49-
5049
class AArch64Arm64ECCallLowering : public ModulePass {
5150
public:
5251
static char ID;
@@ -73,15 +72,15 @@ class AArch64Arm64ECCallLowering : public ModulePass {
7372
Type *I64Ty;
7473
Type *VoidTy;
7574

76-
void getThunkType(FunctionType *FT, AttributeList AttrList, ThunkType TT,
77-
raw_ostream &Out, FunctionType *&Arm64Ty,
78-
FunctionType *&X64Ty);
75+
void getThunkType(FunctionType *FT, AttributeList AttrList,
76+
Arm64ECThunkType TT, raw_ostream &Out,
77+
FunctionType *&Arm64Ty, FunctionType *&X64Ty);
7978
void getThunkRetType(FunctionType *FT, AttributeList AttrList,
8079
raw_ostream &Out, Type *&Arm64RetTy, Type *&X64RetTy,
8180
SmallVectorImpl<Type *> &Arm64ArgTypes,
8281
SmallVectorImpl<Type *> &X64ArgTypes, bool &HasSretPtr);
83-
void getThunkArgTypes(FunctionType *FT, AttributeList AttrList, ThunkType TT,
84-
raw_ostream &Out,
82+
void getThunkArgTypes(FunctionType *FT, AttributeList AttrList,
83+
Arm64ECThunkType TT, raw_ostream &Out,
8584
SmallVectorImpl<Type *> &Arm64ArgTypes,
8685
SmallVectorImpl<Type *> &X64ArgTypes, bool HasSretPtr);
8786
void canonicalizeThunkType(Type *T, Align Alignment, bool Ret,
@@ -91,13 +90,11 @@ class AArch64Arm64ECCallLowering : public ModulePass {
9190

9291
} // end anonymous namespace
9392

94-
void AArch64Arm64ECCallLowering::getThunkType(FunctionType *FT,
95-
AttributeList AttrList,
96-
ThunkType TT, raw_ostream &Out,
97-
FunctionType *&Arm64Ty,
98-
FunctionType *&X64Ty) {
99-
Out << (TT == ThunkType::Entry ? "$ientry_thunk$cdecl$"
100-
: "$iexit_thunk$cdecl$");
93+
void AArch64Arm64ECCallLowering::getThunkType(
94+
FunctionType *FT, AttributeList AttrList, Arm64ECThunkType TT,
95+
raw_ostream &Out, FunctionType *&Arm64Ty, FunctionType *&X64Ty) {
96+
Out << (TT == Arm64ECThunkType::Entry ? "$ientry_thunk$cdecl$"
97+
: "$iexit_thunk$cdecl$");
10198

10299
Type *Arm64RetTy;
103100
Type *X64RetTy;
@@ -108,7 +105,7 @@ void AArch64Arm64ECCallLowering::getThunkType(FunctionType *FT,
108105
// The first argument to a thunk is the called function, stored in x9.
109106
// For exit thunks, we pass the called function down to the emulator;
110107
// for entry/guest exit thunks, we just call the Arm64 function directly.
111-
if (TT == ThunkType::Exit)
108+
if (TT == Arm64ECThunkType::Exit)
112109
Arm64ArgTypes.push_back(PtrTy);
113110
X64ArgTypes.push_back(PtrTy);
114111

@@ -125,8 +122,8 @@ void AArch64Arm64ECCallLowering::getThunkType(FunctionType *FT,
125122
}
126123

127124
void AArch64Arm64ECCallLowering::getThunkArgTypes(
128-
FunctionType *FT, AttributeList AttrList, ThunkType TT, raw_ostream &Out,
129-
SmallVectorImpl<Type *> &Arm64ArgTypes,
125+
FunctionType *FT, AttributeList AttrList, Arm64ECThunkType TT,
126+
raw_ostream &Out, SmallVectorImpl<Type *> &Arm64ArgTypes,
130127
SmallVectorImpl<Type *> &X64ArgTypes, bool HasSretPtr) {
131128

132129
Out << "$";
@@ -163,7 +160,7 @@ void AArch64Arm64ECCallLowering::getThunkArgTypes(
163160
X64ArgTypes.push_back(PtrTy);
164161
// x5
165162
Arm64ArgTypes.push_back(I64Ty);
166-
if (TT != ThunkType::Entry) {
163+
if (TT != Arm64ECThunkType::Entry) {
167164
// FIXME: x5 isn't actually used by the x64 side; revisit once we
168165
// have proper isel for varargs
169166
X64ArgTypes.push_back(I64Ty);
@@ -348,7 +345,8 @@ Function *AArch64Arm64ECCallLowering::buildExitThunk(FunctionType *FT,
348345
SmallString<256> ExitThunkName;
349346
llvm::raw_svector_ostream ExitThunkStream(ExitThunkName);
350347
FunctionType *Arm64Ty, *X64Ty;
351-
getThunkType(FT, Attrs, ThunkType::Exit, ExitThunkStream, Arm64Ty, X64Ty);
348+
getThunkType(FT, Attrs, Arm64ECThunkType::Exit, ExitThunkStream, Arm64Ty,
349+
X64Ty);
352350
if (Function *F = M->getFunction(ExitThunkName))
353351
return F;
354352

@@ -451,8 +449,8 @@ Function *AArch64Arm64ECCallLowering::buildEntryThunk(Function *F) {
451449
SmallString<256> EntryThunkName;
452450
llvm::raw_svector_ostream EntryThunkStream(EntryThunkName);
453451
FunctionType *Arm64Ty, *X64Ty;
454-
getThunkType(F->getFunctionType(), F->getAttributes(), ThunkType::Entry,
455-
EntryThunkStream, Arm64Ty, X64Ty);
452+
getThunkType(F->getFunctionType(), F->getAttributes(),
453+
Arm64ECThunkType::Entry, EntryThunkStream, Arm64Ty, X64Ty);
456454
if (Function *F = M->getFunction(EntryThunkName))
457455
return F;
458456

@@ -543,8 +541,8 @@ Function *AArch64Arm64ECCallLowering::buildEntryThunk(Function *F) {
543541
Function *AArch64Arm64ECCallLowering::buildGuestExitThunk(Function *F) {
544542
llvm::raw_null_ostream NullThunkName;
545543
FunctionType *Arm64Ty, *X64Ty;
546-
getThunkType(F->getFunctionType(), F->getAttributes(), ThunkType::GuestExit,
547-
NullThunkName, Arm64Ty, X64Ty);
544+
getThunkType(F->getFunctionType(), F->getAttributes(),
545+
Arm64ECThunkType::GuestExit, NullThunkName, Arm64Ty, X64Ty);
548546
auto MangledName = getArm64ECMangledFunctionName(F->getName().str());
549547
assert(MangledName && "Can't guest exit to function that's already native");
550548
std::string ThunkName = *MangledName;
@@ -679,7 +677,7 @@ bool AArch64Arm64ECCallLowering::runOnModule(Module &Mod) {
679677
struct ThunkInfo {
680678
Constant *Src;
681679
Constant *Dst;
682-
unsigned Kind;
680+
Arm64ECThunkType Kind;
683681
};
684682
SmallVector<ThunkInfo> ThunkMapping;
685683
for (Function &F : Mod) {
@@ -688,14 +686,17 @@ bool AArch64Arm64ECCallLowering::runOnModule(Module &Mod) {
688686
F.getCallingConv() != CallingConv::ARM64EC_Thunk_X64) {
689687
if (!F.hasComdat())
690688
F.setComdat(Mod.getOrInsertComdat(F.getName()));
691-
ThunkMapping.push_back({&F, buildEntryThunk(&F), 1});
689+
ThunkMapping.push_back(
690+
{&F, buildEntryThunk(&F), Arm64ECThunkType::Entry});
692691
}
693692
}
694693
for (Function *F : DirectCalledFns) {
695694
ThunkMapping.push_back(
696-
{F, buildExitThunk(F->getFunctionType(), F->getAttributes()), 4});
695+
{F, buildExitThunk(F->getFunctionType(), F->getAttributes()),
696+
Arm64ECThunkType::Exit});
697697
if (!F->hasDLLImportStorageClass())
698-
ThunkMapping.push_back({buildGuestExitThunk(F), F, 0});
698+
ThunkMapping.push_back(
699+
{buildGuestExitThunk(F), F, Arm64ECThunkType::GuestExit});
699700
}
700701

701702
if (!ThunkMapping.empty()) {
@@ -704,7 +705,7 @@ bool AArch64Arm64ECCallLowering::runOnModule(Module &Mod) {
704705
ThunkMappingArrayElems.push_back(ConstantStruct::getAnon(
705706
{ConstantExpr::getBitCast(Thunk.Src, PtrTy),
706707
ConstantExpr::getBitCast(Thunk.Dst, PtrTy),
707-
ConstantInt::get(M->getContext(), APInt(32, Thunk.Kind))}));
708+
ConstantInt::get(M->getContext(), APInt(32, uint8_t(Thunk.Kind)))}));
708709
}
709710
Constant *ThunkMappingArray = ConstantArray::get(
710711
llvm::ArrayType::get(ThunkMappingArrayElems[0]->getType(),

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.