Skip to content

Commit 7af8e3d

Browse files
committed
[PAC][clang] Handle pauthtest environment and ABI in Linux-specific code
Since pauthtest is a Linux-specific ABI, it should not be handled in common driver code.
1 parent 63eb66f commit 7af8e3d

File tree

13 files changed

+153
-100
lines changed

13 files changed

+153
-100
lines changed

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,7 @@ AArch64TargetInfo::AArch64TargetInfo(const llvm::Triple &Triple,
206206
StringRef AArch64TargetInfo::getABI() const { return ABI; }
207207

208208
bool AArch64TargetInfo::setABI(const std::string &Name) {
209-
if (Name != "aapcs" && Name != "aapcs-soft" && Name != "darwinpcs" &&
210-
Name != "pauthtest")
209+
if (Name != "aapcs" && Name != "aapcs-soft" && Name != "darwinpcs")
211210
return false;
212211

213212
ABI = Name;
@@ -221,12 +220,6 @@ bool AArch64TargetInfo::validateTarget(DiagnosticsEngine &Diags) const {
221220
Diags.Report(diag::err_target_unsupported_abi_with_fpu) << ABI;
222221
return false;
223222
}
224-
if (getTriple().getEnvironment() == llvm::Triple::PAuthTest &&
225-
getTriple().getOS() != llvm::Triple::Linux) {
226-
Diags.Report(diag::err_target_unsupported_abi_for_triple)
227-
<< getTriple().getEnvironmentName() << getTriple().getTriple();
228-
return false;
229-
}
230223
return true;
231224
}
232225

clang/lib/Basic/Targets/AArch64.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
135135

136136
const llvm::AArch64::ArchInfo *ArchInfo = &llvm::AArch64::ARMV8A;
137137

138+
protected:
138139
std::string ABI;
139140

140141
public:
@@ -277,6 +278,16 @@ class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo {
277278
void setDataLayout() override;
278279
};
279280

281+
template <>
282+
inline bool
283+
LinuxTargetInfo<AArch64leTargetInfo>::setABI(const std::string &Name) {
284+
if (Name == "pauthtest") {
285+
ABI = Name;
286+
return true;
287+
}
288+
return AArch64leTargetInfo::setABI(Name);
289+
}
290+
280291
class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo
281292
: public WindowsTargetInfo<AArch64leTargetInfo> {
282293
const llvm::Triple Triple;

clang/lib/Basic/Targets/OSTargets.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//===----------------------------------------------------------------------===//
1111

1212
#include "OSTargets.h"
13+
#include "AArch64.h"
1314
#include "clang/Basic/MacroBuilder.h"
1415
#include "llvm/ADT/StringRef.h"
1516

clang/lib/Basic/Targets/OSTargets.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,12 @@ class LLVM_LIBRARY_VISIBILITY LinuxTargetInfo : public OSTargetInfo<Target> {
396396
const char *getStaticInitSectionSpecifier() const override {
397397
return ".text.startup";
398398
}
399+
400+
// This allows template specializations, see
401+
// LinuxTargetInfo<AArch64leTargetInfo>::setABI
402+
bool setABI(const std::string &Name) override {
403+
return OSTargetInfo<Target>::setABI(Name);
404+
}
399405
};
400406

401407
// Managarm Target

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,6 @@ createTargetCodeGenInfo(CodeGenModule &CGM) {
145145
return createWindowsAArch64TargetCodeGenInfo(CGM, AArch64ABIKind::Win64);
146146
else if (Target.getABI() == "aapcs-soft")
147147
Kind = AArch64ABIKind::AAPCSSoft;
148-
else if (Target.getABI() == "pauthtest")
149-
Kind = AArch64ABIKind::PAuthTest;
150148

151149
return createAArch64TargetCodeGenInfo(CGM, Kind);
152150
}

clang/lib/CodeGen/TargetInfo.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,6 @@ enum class AArch64ABIKind {
483483
DarwinPCS,
484484
Win64,
485485
AAPCSSoft,
486-
PAuthTest,
487486
};
488487

489488
std::unique_ptr<TargetCodeGenInfo>

clang/lib/Driver/ToolChain.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1251,7 +1251,6 @@ std::string ToolChain::ComputeLLVMTriple(const ArgList &Args,
12511251
}
12521252
case llvm::Triple::aarch64: {
12531253
llvm::Triple Triple = getTriple();
1254-
tools::aarch64::setPAuthABIInTriple(getDriver(), Args, Triple);
12551254
if (!Triple.isOSBinFormatMachO())
12561255
return Triple.getTriple();
12571256

clang/lib/Driver/ToolChains/Arch/AArch64.cpp

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -463,27 +463,6 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
463463
Features.push_back("+no-bti-at-return-twice");
464464
}
465465

466-
void aarch64::setPAuthABIInTriple(const Driver &D, const ArgList &Args,
467-
llvm::Triple &Triple) {
468-
Arg *ABIArg = Args.getLastArg(options::OPT_mabi_EQ);
469-
bool HasPAuthABI =
470-
ABIArg ? (StringRef(ABIArg->getValue()) == "pauthtest") : false;
471-
472-
switch (Triple.getEnvironment()) {
473-
case llvm::Triple::UnknownEnvironment:
474-
if (HasPAuthABI)
475-
Triple.setEnvironment(llvm::Triple::PAuthTest);
476-
break;
477-
case llvm::Triple::PAuthTest:
478-
break;
479-
default:
480-
if (HasPAuthABI)
481-
D.Diag(diag::err_drv_unsupported_opt_for_target)
482-
<< ABIArg->getAsString(Args) << Triple.getTriple();
483-
break;
484-
}
485-
}
486-
487466
/// Is the triple {aarch64.aarch64_be}-none-elf?
488467
bool aarch64::isAArch64BareMetal(const llvm::Triple &Triple) {
489468
if (Triple.getArch() != llvm::Triple::aarch64 &&

clang/lib/Driver/ToolChains/Arch/AArch64.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ void getAArch64TargetFeatures(const Driver &D, const llvm::Triple &Triple,
2828
std::string getAArch64TargetCPU(const llvm::opt::ArgList &Args,
2929
const llvm::Triple &Triple, llvm::opt::Arg *&A);
3030

31-
void setPAuthABIInTriple(const Driver &D, const llvm::opt::ArgList &Args,
32-
llvm::Triple &triple);
3331
bool isAArch64BareMetal(const llvm::Triple &Triple);
3432

3533
} // end namespace aarch64

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 6 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1340,59 +1340,6 @@ void AddUnalignedAccessWarning(ArgStringList &CmdArgs) {
13401340
}
13411341
}
13421342

1343-
// Each combination of options here forms a signing schema, and in most cases
1344-
// each signing schema is its own incompatible ABI. The default values of the
1345-
// options represent the default signing schema.
1346-
static void handlePAuthABI(const ArgList &DriverArgs, ArgStringList &CC1Args) {
1347-
if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
1348-
options::OPT_fno_ptrauth_intrinsics))
1349-
CC1Args.push_back("-fptrauth-intrinsics");
1350-
1351-
if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
1352-
options::OPT_fno_ptrauth_calls))
1353-
CC1Args.push_back("-fptrauth-calls");
1354-
1355-
if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
1356-
options::OPT_fno_ptrauth_returns))
1357-
CC1Args.push_back("-fptrauth-returns");
1358-
1359-
if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
1360-
options::OPT_fno_ptrauth_auth_traps))
1361-
CC1Args.push_back("-fptrauth-auth-traps");
1362-
1363-
if (!DriverArgs.hasArg(
1364-
options::OPT_fptrauth_vtable_pointer_address_discrimination,
1365-
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
1366-
CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
1367-
1368-
if (!DriverArgs.hasArg(
1369-
options::OPT_fptrauth_vtable_pointer_type_discrimination,
1370-
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
1371-
CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
1372-
1373-
if (!DriverArgs.hasArg(
1374-
options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
1375-
options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination))
1376-
CC1Args.push_back("-fptrauth-type-info-vtable-pointer-discrimination");
1377-
1378-
if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
1379-
options::OPT_fno_ptrauth_indirect_gotos))
1380-
CC1Args.push_back("-fptrauth-indirect-gotos");
1381-
1382-
if (!DriverArgs.hasArg(options::OPT_fptrauth_init_fini,
1383-
options::OPT_fno_ptrauth_init_fini))
1384-
CC1Args.push_back("-fptrauth-init-fini");
1385-
1386-
if (!DriverArgs.hasArg(
1387-
options::OPT_fptrauth_init_fini_address_discrimination,
1388-
options::OPT_fno_ptrauth_init_fini_address_discrimination))
1389-
CC1Args.push_back("-fptrauth-init-fini-address-discrimination");
1390-
1391-
if (!DriverArgs.hasArg(options::OPT_faarch64_jump_table_hardening,
1392-
options::OPT_fno_aarch64_jump_table_hardening))
1393-
CC1Args.push_back("-faarch64-jump-table-hardening");
1394-
}
1395-
13961343
static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args,
13971344
ArgStringList &CmdArgs, bool isAArch64) {
13981345
const llvm::Triple &Triple = TC.getEffectiveTriple();
@@ -1630,7 +1577,9 @@ void RenderAArch64ABI(const llvm::Triple &Triple, const ArgList &Args,
16301577
ABIName = A->getValue();
16311578
else if (Triple.isOSDarwin())
16321579
ABIName = "darwinpcs";
1633-
else if (Triple.getEnvironment() == llvm::Triple::PAuthTest)
1580+
// TODO: we probably want to have some target hook here.
1581+
else if (Triple.isOSLinux() &&
1582+
Triple.getEnvironment() == llvm::Triple::PAuthTest)
16341583
ABIName = "pauthtest";
16351584
else
16361585
ABIName = "aapcs";
@@ -1665,6 +1614,9 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
16651614
CmdArgs.push_back("-aarch64-enable-global-merge=true");
16661615
}
16671616

1617+
// Enable/disable return address signing and indirect branch targets.
1618+
CollectARMPACBTIOptions(getToolChain(), Args, CmdArgs, true /*isAArch64*/);
1619+
16681620
// Handle -msve_vector_bits=<bits>
16691621
auto HandleVectorBits = [&](Arg *A, StringRef VScaleMin,
16701622
StringRef VScaleMax) {
@@ -1750,8 +1702,6 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
17501702
options::OPT_fno_ptrauth_objc_interface_sel);
17511703
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_objc_class_ro,
17521704
options::OPT_fno_ptrauth_objc_class_ro);
1753-
if (Triple.getEnvironment() == llvm::Triple::PAuthTest)
1754-
handlePAuthABI(Args, CmdArgs);
17551705

17561706
// Enable/disable return address signing and indirect branch targets.
17571707
CollectARMPACBTIOptions(getToolChain(), Args, CmdArgs, true /*isAArch64*/);

0 commit comments

Comments
 (0)