Skip to content

Commit 418ead4

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 872c8b9 commit 418ead4

File tree

13 files changed

+150
-102
lines changed

13 files changed

+150
-102
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
@@ -121,6 +121,7 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
121121

122122
const llvm::AArch64::ArchInfo *ArchInfo = &llvm::AArch64::ARMV8A;
123123

124+
protected:
124125
std::string ABI;
125126

126127
public:
@@ -259,6 +260,16 @@ class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo {
259260
void setDataLayout() override;
260261
};
261262

263+
template <>
264+
inline bool
265+
LinuxTargetInfo<AArch64leTargetInfo>::setABI(const std::string &Name) {
266+
if (Name == "pauthtest") {
267+
ABI = Name;
268+
return true;
269+
}
270+
return AArch64leTargetInfo::setABI(Name);
271+
}
272+
262273
class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo
263274
: public WindowsTargetInfo<AArch64leTargetInfo> {
264275
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
@@ -371,6 +371,12 @@ class LLVM_LIBRARY_VISIBILITY LinuxTargetInfo : public OSTargetInfo<Target> {
371371
const char *getStaticInitSectionSpecifier() const override {
372372
return ".text.startup";
373373
}
374+
375+
// This allows template specializations, see
376+
// LinuxTargetInfo<AArch64leTargetInfo>::setABI
377+
bool setABI(const std::string &Name) override {
378+
return OSTargetInfo<Target>::setABI(Name);
379+
}
374380
};
375381

376382
// NetBSD Target

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,6 @@ createTargetCodeGenInfo(CodeGenModule &CGM) {
148148
return createWindowsAArch64TargetCodeGenInfo(CGM, AArch64ABIKind::Win64);
149149
else if (Target.getABI() == "aapcs-soft")
150150
Kind = AArch64ABIKind::AAPCSSoft;
151-
else if (Target.getABI() == "pauthtest")
152-
Kind = AArch64ABIKind::PAuthTest;
153151

154152
return createAArch64TargetCodeGenInfo(CGM, Kind);
155153
}

clang/lib/CodeGen/TargetInfo.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,6 @@ enum class AArch64ABIKind {
451451
DarwinPCS,
452452
Win64,
453453
AAPCSSoft,
454-
PAuthTest,
455454
};
456455

457456
std::unique_ptr<TargetCodeGenInfo>

clang/lib/Driver/ToolChain.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1080,7 +1080,6 @@ std::string ToolChain::ComputeLLVMTriple(const ArgList &Args,
10801080
}
10811081
case llvm::Triple::aarch64: {
10821082
llvm::Triple Triple = getTriple();
1083-
tools::aarch64::setPAuthABIInTriple(getDriver(), Args, Triple);
10841083
if (!Triple.isOSBinFormatMachO())
10851084
return Triple.getTriple();
10861085

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

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -449,24 +449,3 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
449449
if (Args.getLastArg(options::OPT_mno_bti_at_return_twice))
450450
Features.push_back("+no-bti-at-return-twice");
451451
}
452-
453-
void aarch64::setPAuthABIInTriple(const Driver &D, const ArgList &Args,
454-
llvm::Triple &Triple) {
455-
Arg *ABIArg = Args.getLastArg(options::OPT_mabi_EQ);
456-
bool HasPAuthABI =
457-
ABIArg ? (StringRef(ABIArg->getValue()) == "pauthtest") : false;
458-
459-
switch (Triple.getEnvironment()) {
460-
case llvm::Triple::UnknownEnvironment:
461-
if (HasPAuthABI)
462-
Triple.setEnvironment(llvm::Triple::PAuthTest);
463-
break;
464-
case llvm::Triple::PAuthTest:
465-
break;
466-
default:
467-
if (HasPAuthABI)
468-
D.Diag(diag::err_drv_unsupported_opt_for_target)
469-
<< ABIArg->getAsString(Args) << Triple.getTriple();
470-
break;
471-
}
472-
}

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +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);
33-
3431
} // end namespace aarch64
3532
} // end namespace target
3633
} // end namespace driver

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 3 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,59 +1477,6 @@ void AddUnalignedAccessWarning(ArgStringList &CmdArgs) {
14771477
}
14781478
}
14791479

1480-
// Each combination of options here forms a signing schema, and in most cases
1481-
// each signing schema is its own incompatible ABI. The default values of the
1482-
// options represent the default signing schema.
1483-
static void handlePAuthABI(const ArgList &DriverArgs, ArgStringList &CC1Args) {
1484-
if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
1485-
options::OPT_fno_ptrauth_intrinsics))
1486-
CC1Args.push_back("-fptrauth-intrinsics");
1487-
1488-
if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
1489-
options::OPT_fno_ptrauth_calls))
1490-
CC1Args.push_back("-fptrauth-calls");
1491-
1492-
if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
1493-
options::OPT_fno_ptrauth_returns))
1494-
CC1Args.push_back("-fptrauth-returns");
1495-
1496-
if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
1497-
options::OPT_fno_ptrauth_auth_traps))
1498-
CC1Args.push_back("-fptrauth-auth-traps");
1499-
1500-
if (!DriverArgs.hasArg(
1501-
options::OPT_fptrauth_vtable_pointer_address_discrimination,
1502-
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
1503-
CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
1504-
1505-
if (!DriverArgs.hasArg(
1506-
options::OPT_fptrauth_vtable_pointer_type_discrimination,
1507-
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
1508-
CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
1509-
1510-
if (!DriverArgs.hasArg(
1511-
options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
1512-
options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination))
1513-
CC1Args.push_back("-fptrauth-type-info-vtable-pointer-discrimination");
1514-
1515-
if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
1516-
options::OPT_fno_ptrauth_indirect_gotos))
1517-
CC1Args.push_back("-fptrauth-indirect-gotos");
1518-
1519-
if (!DriverArgs.hasArg(options::OPT_fptrauth_init_fini,
1520-
options::OPT_fno_ptrauth_init_fini))
1521-
CC1Args.push_back("-fptrauth-init-fini");
1522-
1523-
if (!DriverArgs.hasArg(
1524-
options::OPT_fptrauth_init_fini_address_discrimination,
1525-
options::OPT_fno_ptrauth_init_fini_address_discrimination))
1526-
CC1Args.push_back("-fptrauth-init-fini-address-discrimination");
1527-
1528-
if (!DriverArgs.hasArg(options::OPT_faarch64_jump_table_hardening,
1529-
options::OPT_fno_aarch64_jump_table_hardening))
1530-
CC1Args.push_back("-faarch64-jump-table-hardening");
1531-
}
1532-
15331480
static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args,
15341481
ArgStringList &CmdArgs, bool isAArch64) {
15351482
const Arg *A = isAArch64
@@ -1759,7 +1706,9 @@ void RenderAArch64ABI(const llvm::Triple &Triple, const ArgList &Args,
17591706
ABIName = A->getValue();
17601707
else if (Triple.isOSDarwin())
17611708
ABIName = "darwinpcs";
1762-
else if (Triple.getEnvironment() == llvm::Triple::PAuthTest)
1709+
// TODO: we probably want to have some target hook here.
1710+
else if (Triple.isOSLinux() &&
1711+
Triple.getEnvironment() == llvm::Triple::PAuthTest)
17631712
ABIName = "pauthtest";
17641713
else
17651714
ABIName = "aapcs";
@@ -1797,9 +1746,6 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
17971746
// Enable/disable return address signing and indirect branch targets.
17981747
CollectARMPACBTIOptions(getToolChain(), Args, CmdArgs, true /*isAArch64*/);
17991748

1800-
if (Triple.getEnvironment() == llvm::Triple::PAuthTest)
1801-
handlePAuthABI(Args, CmdArgs);
1802-
18031749
// Handle -msve_vector_bits=<bits>
18041750
if (Arg *A = Args.getLastArg(options::OPT_msve_vector_bits_EQ)) {
18051751
StringRef Val = A->getValue();

0 commit comments

Comments
 (0)