diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.h b/clang/lib/Driver/ToolChains/Arch/AArch64.h --- a/clang/lib/Driver/ToolChains/Arch/AArch64.h +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.h @@ -27,6 +27,8 @@ std::string getAArch64TargetCPU(const llvm::opt::ArgList &Args, const llvm::Triple &Triple, llvm::opt::Arg *&A); +bool isValidSysReg(StringRef RegName); + } // end namespace aarch64 } // end namespace target } // end namespace driver diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp --- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -10,9 +10,10 @@ #include "clang/Driver/Driver.h" #include "clang/Driver/DriverDiagnostic.h" #include "clang/Driver/Options.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/Option/ArgList.h" -#include "llvm/Support/TargetParser.h" #include "llvm/Support/Host.h" +#include "llvm/Support/TargetParser.h" using namespace clang::driver; using namespace clang::driver::tools; @@ -493,3 +494,932 @@ if (Args.hasArg(options::OPT_mno_neg_immediates)) Features.push_back("+no-neg-immediates"); } + +/// Checks if a string is a valid sysreg. +// While it would be good to avoid duplication of +// llvm::AArch64SysReg::lookupSysRegByName, we don't want to couple CFE to +// Target/. This list is taken from the generated +// lib/Target/AArch64/AArch64GenSystemOperands.inc. +bool aarch64::isValidSysReg(StringRef RegName) { + static const char *ValidRegs[] = { + "ACCDATA_EL1", + "ACTLR_EL1", + "ACTLR_EL2", + "ACTLR_EL3", + "AFSR0_EL1", + "AFSR0_EL12", + "AFSR0_EL2", + "AFSR0_EL3", + "AFSR1_EL1", + "AFSR1_EL12", + "AFSR1_EL2", + "AFSR1_EL3", + "AIDR_EL1", + "AMAIR_EL1", + "AMAIR_EL12", + "AMAIR_EL2", + "AMAIR_EL3", + "AMCFGR_EL0", + "AMCGCR_EL0", + "AMCNTENCLR0_EL0", + "AMCNTENCLR1_EL0", + "AMCNTENSET0_EL0", + "AMCNTENSET1_EL0", + "AMCR_EL0", + "AMEVCNTR00_EL0", + "AMEVCNTR01_EL0", + "AMEVCNTR02_EL0", + "AMEVCNTR03_EL0", + "AMEVCNTR10_EL0", + "AMEVCNTR110_EL0", + "AMEVCNTR111_EL0", + "AMEVCNTR112_EL0", + "AMEVCNTR113_EL0", + "AMEVCNTR114_EL0", + "AMEVCNTR115_EL0", + "AMEVCNTR11_EL0", + "AMEVCNTR12_EL0", + "AMEVCNTR13_EL0", + "AMEVCNTR14_EL0", + "AMEVCNTR15_EL0", + "AMEVCNTR16_EL0", + "AMEVCNTR17_EL0", + "AMEVCNTR18_EL0", + "AMEVCNTR19_EL0", + "AMEVCNTVOFF00_EL2", + "AMEVCNTVOFF010_EL2", + "AMEVCNTVOFF011_EL2", + "AMEVCNTVOFF012_EL2", + "AMEVCNTVOFF013_EL2", + "AMEVCNTVOFF014_EL2", + "AMEVCNTVOFF015_EL2", + "AMEVCNTVOFF01_EL2", + "AMEVCNTVOFF02_EL2", + "AMEVCNTVOFF03_EL2", + "AMEVCNTVOFF04_EL2", + "AMEVCNTVOFF05_EL2", + "AMEVCNTVOFF06_EL2", + "AMEVCNTVOFF07_EL2", + "AMEVCNTVOFF08_EL2", + "AMEVCNTVOFF09_EL2", + "AMEVCNTVOFF10_EL2", + "AMEVCNTVOFF110_EL2", + "AMEVCNTVOFF111_EL2", + "AMEVCNTVOFF112_EL2", + "AMEVCNTVOFF113_EL2", + "AMEVCNTVOFF114_EL2", + "AMEVCNTVOFF115_EL2", + "AMEVCNTVOFF11_EL2", + "AMEVCNTVOFF12_EL2", + "AMEVCNTVOFF13_EL2", + "AMEVCNTVOFF14_EL2", + "AMEVCNTVOFF15_EL2", + "AMEVCNTVOFF16_EL2", + "AMEVCNTVOFF17_EL2", + "AMEVCNTVOFF18_EL2", + "AMEVCNTVOFF19_EL2", + "AMEVTYPER00_EL0", + "AMEVTYPER01_EL0", + "AMEVTYPER02_EL0", + "AMEVTYPER03_EL0", + "AMEVTYPER10_EL0", + "AMEVTYPER110_EL0", + "AMEVTYPER111_EL0", + "AMEVTYPER112_EL0", + "AMEVTYPER113_EL0", + "AMEVTYPER114_EL0", + "AMEVTYPER115_EL0", + "AMEVTYPER11_EL0", + "AMEVTYPER12_EL0", + "AMEVTYPER13_EL0", + "AMEVTYPER14_EL0", + "AMEVTYPER15_EL0", + "AMEVTYPER16_EL0", + "AMEVTYPER17_EL0", + "AMEVTYPER18_EL0", + "AMEVTYPER19_EL0", + "AMUSERENR_EL0", + "APDAKEYHI_EL1", + "APDAKEYLO_EL1", + "APDBKEYHI_EL1", + "APDBKEYLO_EL1", + "APGAKEYHI_EL1", + "APGAKEYLO_EL1", + "APIAKEYHI_EL1", + "APIAKEYLO_EL1", + "APIBKEYHI_EL1", + "APIBKEYLO_EL1", + "BRBCR_EL1", + "BRBCR_EL12", + "BRBCR_EL2", + "BRBFCR_EL1", + "BRBIDR0_EL1", + "BRBINF0_EL1", + "BRBINF10_EL1", + "BRBINF11_EL1", + "BRBINF12_EL1", + "BRBINF13_EL1", + "BRBINF14_EL1", + "BRBINF15_EL1", + "BRBINF16_EL1", + "BRBINF17_EL1", + "BRBINF18_EL1", + "BRBINF19_EL1", + "BRBINF1_EL1", + "BRBINF20_EL1", + "BRBINF21_EL1", + "BRBINF22_EL1", + "BRBINF23_EL1", + "BRBINF24_EL1", + "BRBINF25_EL1", + "BRBINF26_EL1", + "BRBINF27_EL1", + "BRBINF28_EL1", + "BRBINF29_EL1", + "BRBINF2_EL1", + "BRBINF30_EL1", + "BRBINF31_EL1", + "BRBINF3_EL1", + "BRBINF4_EL1", + "BRBINF5_EL1", + "BRBINF6_EL1", + "BRBINF7_EL1", + "BRBINF8_EL1", + "BRBINF9_EL1", + "BRBINFINJ_EL1", + "BRBSRC0_EL1", + "BRBSRC10_EL1", + "BRBSRC11_EL1", + "BRBSRC12_EL1", + "BRBSRC13_EL1", + "BRBSRC14_EL1", + "BRBSRC15_EL1", + "BRBSRC16_EL1", + "BRBSRC17_EL1", + "BRBSRC18_EL1", + "BRBSRC19_EL1", + "BRBSRC1_EL1", + "BRBSRC20_EL1", + "BRBSRC21_EL1", + "BRBSRC22_EL1", + "BRBSRC23_EL1", + "BRBSRC24_EL1", + "BRBSRC25_EL1", + "BRBSRC26_EL1", + "BRBSRC27_EL1", + "BRBSRC28_EL1", + "BRBSRC29_EL1", + "BRBSRC2_EL1", + "BRBSRC30_EL1", + "BRBSRC31_EL1", + "BRBSRC3_EL1", + "BRBSRC4_EL1", + "BRBSRC5_EL1", + "BRBSRC6_EL1", + "BRBSRC7_EL1", + "BRBSRC8_EL1", + "BRBSRC9_EL1", + "BRBSRCINJ_EL1", + "BRBTGT0_EL1", + "BRBTGT10_EL1", + "BRBTGT11_EL1", + "BRBTGT12_EL1", + "BRBTGT13_EL1", + "BRBTGT14_EL1", + "BRBTGT15_EL1", + "BRBTGT16_EL1", + "BRBTGT17_EL1", + "BRBTGT18_EL1", + "BRBTGT19_EL1", + "BRBTGT1_EL1", + "BRBTGT20_EL1", + "BRBTGT21_EL1", + "BRBTGT22_EL1", + "BRBTGT23_EL1", + "BRBTGT24_EL1", + "BRBTGT25_EL1", + "BRBTGT26_EL1", + "BRBTGT27_EL1", + "BRBTGT28_EL1", + "BRBTGT29_EL1", + "BRBTGT2_EL1", + "BRBTGT30_EL1", + "BRBTGT31_EL1", + "BRBTGT3_EL1", + "BRBTGT4_EL1", + "BRBTGT5_EL1", + "BRBTGT6_EL1", + "BRBTGT7_EL1", + "BRBTGT8_EL1", + "BRBTGT9_EL1", + "BRBTGTINJ_EL1", + "BRBTS_EL1", + "CCSIDR2_EL1", + "CCSIDR_EL1", + "CLIDR_EL1", + "CNTFRQ_EL0", + "CNTHCTL_EL2", + "CNTHPS_CTL_EL2", + "CNTHPS_CVAL_EL2", + "CNTHPS_TVAL_EL2", + "CNTHP_CTL_EL2", + "CNTHP_CVAL_EL2", + "CNTHP_TVAL_EL2", + "CNTHVS_CTL_EL2", + "CNTHVS_CVAL_EL2", + "CNTHVS_TVAL_EL2", + "CNTHV_CTL_EL2", + "CNTHV_CVAL_EL2", + "CNTHV_TVAL_EL2", + "CNTISCALE_EL2", + "CNTKCTL_EL1", + "CNTKCTL_EL12", + "CNTPCTSS_EL0", + "CNTPCT_EL0", + "CNTPOFF_EL2", + "CNTPS_CTL_EL1", + "CNTPS_CVAL_EL1", + "CNTPS_TVAL_EL1", + "CNTP_CTL_EL0", + "CNTP_CTL_EL02", + "CNTP_CVAL_EL0", + "CNTP_CVAL_EL02", + "CNTP_TVAL_EL0", + "CNTP_TVAL_EL02", + "CNTSCALE_EL2", + "CNTVCTSS_EL0", + "CNTVCT_EL0", + "CNTVFRQ_EL2", + "CNTVOFF_EL2", + "CNTV_CTL_EL0", + "CNTV_CTL_EL02", + "CNTV_CVAL_EL0", + "CNTV_CVAL_EL02", + "CNTV_TVAL_EL0", + "CNTV_TVAL_EL02", + "CONTEXTIDR_EL1", + "CONTEXTIDR_EL12", + "CONTEXTIDR_EL2", + "CPACR_EL1", + "CPACR_EL12", + "CPM_IOACC_CTL_EL3", + "CPTR_EL2", + "CPTR_EL3", + "CSSELR_EL1", + "CTR_EL0", + "CURRENTEL", + "DACR32_EL2", + "DAIF", + "DBGAUTHSTATUS_EL1", + "DBGBCR0_EL1", + "DBGBCR10_EL1", + "DBGBCR11_EL1", + "DBGBCR12_EL1", + "DBGBCR13_EL1", + "DBGBCR14_EL1", + "DBGBCR15_EL1", + "DBGBCR1_EL1", + "DBGBCR2_EL1", + "DBGBCR3_EL1", + "DBGBCR4_EL1", + "DBGBCR5_EL1", + "DBGBCR6_EL1", + "DBGBCR7_EL1", + "DBGBCR8_EL1", + "DBGBCR9_EL1", + "DBGBVR0_EL1", + "DBGBVR10_EL1", + "DBGBVR11_EL1", + "DBGBVR12_EL1", + "DBGBVR13_EL1", + "DBGBVR14_EL1", + "DBGBVR15_EL1", + "DBGBVR1_EL1", + "DBGBVR2_EL1", + "DBGBVR3_EL1", + "DBGBVR4_EL1", + "DBGBVR5_EL1", + "DBGBVR6_EL1", + "DBGBVR7_EL1", + "DBGBVR8_EL1", + "DBGBVR9_EL1", + "DBGCLAIMCLR_EL1", + "DBGCLAIMSET_EL1", + "DBGDTRRX_EL0", + "DBGDTRTX_EL0", + "DBGDTR_EL0", + "DBGPRCR_EL1", + "DBGVCR32_EL2", + "DBGWCR0_EL1", + "DBGWCR10_EL1", + "DBGWCR11_EL1", + "DBGWCR12_EL1", + "DBGWCR13_EL1", + "DBGWCR14_EL1", + "DBGWCR15_EL1", + "DBGWCR1_EL1", + "DBGWCR2_EL1", + "DBGWCR3_EL1", + "DBGWCR4_EL1", + "DBGWCR5_EL1", + "DBGWCR6_EL1", + "DBGWCR7_EL1", + "DBGWCR8_EL1", + "DBGWCR9_EL1", + "DBGWVR0_EL1", + "DBGWVR10_EL1", + "DBGWVR11_EL1", + "DBGWVR12_EL1", + "DBGWVR13_EL1", + "DBGWVR14_EL1", + "DBGWVR15_EL1", + "DBGWVR1_EL1", + "DBGWVR2_EL1", + "DBGWVR3_EL1", + "DBGWVR4_EL1", + "DBGWVR5_EL1", + "DBGWVR6_EL1", + "DBGWVR7_EL1", + "DBGWVR8_EL1", + "DBGWVR9_EL1", + "DCZID_EL0", + "DISR_EL1", + "DIT", + "DLR_EL0", + "DSPSR_EL0", + "ELR_EL1", + "ELR_EL12", + "ELR_EL2", + "ELR_EL3", + "ERRIDR_EL1", + "ERRSELR_EL1", + "ERXADDR_EL1", + "ERXCTLR_EL1", + "ERXFR_EL1", + "ERXMISC0_EL1", + "ERXMISC1_EL1", + "ERXMISC2_EL1", + "ERXMISC3_EL1", + "ERXPFGCDN_EL1", + "ERXPFGCTL_EL1", + "ERXPFGF_EL1", + "ERXSTATUS_EL1", + "ESR_EL1", + "ESR_EL12", + "ESR_EL2", + "ESR_EL3", + "FAR_EL1", + "FAR_EL12", + "FAR_EL2", + "FAR_EL3", + "FPCR", + "FPEXC32_EL2", + "FPSR", + "GCR_EL1", + "GMID_EL1", + "HACR_EL2", + "HCRX_EL2", + "HCR_EL2", + "HDFGRTR_EL2", + "HDFGWTR_EL2", + "HFGITR_EL2", + "HFGRTR_EL2", + "HFGWTR_EL2", + "HPFAR_EL2", + "HSTR_EL2", + "ICC_AP0R0_EL1", + "ICC_AP0R1_EL1", + "ICC_AP0R2_EL1", + "ICC_AP0R3_EL1", + "ICC_AP1R0_EL1", + "ICC_AP1R1_EL1", + "ICC_AP1R2_EL1", + "ICC_AP1R3_EL1", + "ICC_ASGI1R_EL1", + "ICC_BPR0_EL1", + "ICC_BPR1_EL1", + "ICC_CTLR_EL1", + "ICC_CTLR_EL3", + "ICC_DIR_EL1", + "ICC_EOIR0_EL1", + "ICC_EOIR1_EL1", + "ICC_HPPIR0_EL1", + "ICC_HPPIR1_EL1", + "ICC_IAR0_EL1", + "ICC_IAR1_EL1", + "ICC_IGRPEN0_EL1", + "ICC_IGRPEN1_EL1", + "ICC_IGRPEN1_EL3", + "ICC_PMR_EL1", + "ICC_RPR_EL1", + "ICC_SGI0R_EL1", + "ICC_SGI1R_EL1", + "ICC_SRE_EL1", + "ICC_SRE_EL2", + "ICC_SRE_EL3", + "ICH_AP0R0_EL2", + "ICH_AP0R1_EL2", + "ICH_AP0R2_EL2", + "ICH_AP0R3_EL2", + "ICH_AP1R0_EL2", + "ICH_AP1R1_EL2", + "ICH_AP1R2_EL2", + "ICH_AP1R3_EL2", + "ICH_EISR_EL2", + "ICH_ELRSR_EL2", + "ICH_HCR_EL2", + "ICH_LR0_EL2", + "ICH_LR10_EL2", + "ICH_LR11_EL2", + "ICH_LR12_EL2", + "ICH_LR13_EL2", + "ICH_LR14_EL2", + "ICH_LR15_EL2", + "ICH_LR1_EL2", + "ICH_LR2_EL2", + "ICH_LR3_EL2", + "ICH_LR4_EL2", + "ICH_LR5_EL2", + "ICH_LR6_EL2", + "ICH_LR7_EL2", + "ICH_LR8_EL2", + "ICH_LR9_EL2", + "ICH_MISR_EL2", + "ICH_VMCR_EL2", + "ICH_VTR_EL2", + "ID_AA64AFR0_EL1", + "ID_AA64AFR1_EL1", + "ID_AA64DFR0_EL1", + "ID_AA64DFR1_EL1", + "ID_AA64ISAR0_EL1", + "ID_AA64ISAR1_EL1", + "ID_AA64ISAR2_EL1", + "ID_AA64MMFR0_EL1", + "ID_AA64MMFR1_EL1", + "ID_AA64MMFR2_EL1", + "ID_AA64PFR0_EL1", + "ID_AA64PFR1_EL1", + "ID_AA64ZFR0_EL1", + "ID_AFR0_EL1", + "ID_DFR0_EL1", + "ID_ISAR0_EL1", + "ID_ISAR1_EL1", + "ID_ISAR2_EL1", + "ID_ISAR3_EL1", + "ID_ISAR4_EL1", + "ID_ISAR5_EL1", + "ID_ISAR6_EL1", + "ID_MMFR0_EL1", + "ID_MMFR1_EL1", + "ID_MMFR2_EL1", + "ID_MMFR3_EL1", + "ID_MMFR4_EL1", + "ID_MMFR5_EL1", + "ID_PFR0_EL1", + "ID_PFR1_EL1", + "ID_PFR2_EL1", + "IFSR32_EL2", + "ISR_EL1", + "LORC_EL1", + "LOREA_EL1", + "LORID_EL1", + "LORN_EL1", + "LORSA_EL1", + "MAIR_EL1", + "MAIR_EL12", + "MAIR_EL2", + "MAIR_EL3", + "MDCCINT_EL1", + "MDCCSR_EL0", + "MDCR_EL2", + "MDCR_EL3", + "MDRAR_EL1", + "MDSCR_EL1", + "MIDR_EL1", + "MPAM0_EL1", + "MPAM1_EL1", + "MPAM1_EL12", + "MPAM2_EL2", + "MPAM3_EL3", + "MPAMHCR_EL2", + "MPAMIDR_EL1", + "MPAMVPM0_EL2", + "MPAMVPM1_EL2", + "MPAMVPM2_EL2", + "MPAMVPM3_EL2", + "MPAMVPM4_EL2", + "MPAMVPM5_EL2", + "MPAMVPM6_EL2", + "MPAMVPM7_EL2", + "MPAMVPMV_EL2", + "MPIDR_EL1", + "MVFR0_EL1", + "MVFR1_EL1", + "MVFR2_EL1", + "NZCV", + "OSDLR_EL1", + "OSDTRRX_EL1", + "OSDTRTX_EL1", + "OSECCR_EL1", + "OSLAR_EL1", + "OSLSR_EL1", + "PAN", + "PAR_EL1", + "PMBIDR_EL1", + "PMBLIMITR_EL1", + "PMBPTR_EL1", + "PMBSR_EL1", + "PMCCFILTR_EL0", + "PMCCNTR_EL0", + "PMCEID0_EL0", + "PMCEID1_EL0", + "PMCNTENCLR_EL0", + "PMCNTENSET_EL0", + "PMCR_EL0", + "PMEVCNTR0_EL0", + "PMEVCNTR10_EL0", + "PMEVCNTR11_EL0", + "PMEVCNTR12_EL0", + "PMEVCNTR13_EL0", + "PMEVCNTR14_EL0", + "PMEVCNTR15_EL0", + "PMEVCNTR16_EL0", + "PMEVCNTR17_EL0", + "PMEVCNTR18_EL0", + "PMEVCNTR19_EL0", + "PMEVCNTR1_EL0", + "PMEVCNTR20_EL0", + "PMEVCNTR21_EL0", + "PMEVCNTR22_EL0", + "PMEVCNTR23_EL0", + "PMEVCNTR24_EL0", + "PMEVCNTR25_EL0", + "PMEVCNTR26_EL0", + "PMEVCNTR27_EL0", + "PMEVCNTR28_EL0", + "PMEVCNTR29_EL0", + "PMEVCNTR2_EL0", + "PMEVCNTR30_EL0", + "PMEVCNTR3_EL0", + "PMEVCNTR4_EL0", + "PMEVCNTR5_EL0", + "PMEVCNTR6_EL0", + "PMEVCNTR7_EL0", + "PMEVCNTR8_EL0", + "PMEVCNTR9_EL0", + "PMEVTYPER0_EL0", + "PMEVTYPER10_EL0", + "PMEVTYPER11_EL0", + "PMEVTYPER12_EL0", + "PMEVTYPER13_EL0", + "PMEVTYPER14_EL0", + "PMEVTYPER15_EL0", + "PMEVTYPER16_EL0", + "PMEVTYPER17_EL0", + "PMEVTYPER18_EL0", + "PMEVTYPER19_EL0", + "PMEVTYPER1_EL0", + "PMEVTYPER20_EL0", + "PMEVTYPER21_EL0", + "PMEVTYPER22_EL0", + "PMEVTYPER23_EL0", + "PMEVTYPER24_EL0", + "PMEVTYPER25_EL0", + "PMEVTYPER26_EL0", + "PMEVTYPER27_EL0", + "PMEVTYPER28_EL0", + "PMEVTYPER29_EL0", + "PMEVTYPER2_EL0", + "PMEVTYPER30_EL0", + "PMEVTYPER3_EL0", + "PMEVTYPER4_EL0", + "PMEVTYPER5_EL0", + "PMEVTYPER6_EL0", + "PMEVTYPER7_EL0", + "PMEVTYPER8_EL0", + "PMEVTYPER9_EL0", + "PMINTENCLR_EL1", + "PMINTENSET_EL1", + "PMMIR_EL1", + "PMOVSCLR_EL0", + "PMOVSSET_EL0", + "PMSCR_EL1", + "PMSCR_EL12", + "PMSCR_EL2", + "PMSELR_EL0", + "PMSEVFR_EL1", + "PMSFCR_EL1", + "PMSICR_EL1", + "PMSIDR_EL1", + "PMSIRR_EL1", + "PMSLATFR_EL1", + "PMSNEVFR_EL1", + "PMSWINC_EL0", + "PMUSERENR_EL0", + "PMXEVCNTR_EL0", + "PMXEVTYPER_EL0", + "REVIDR_EL1", + "RGSR_EL1", + "RMR_EL1", + "RMR_EL2", + "RMR_EL3", + "RNDR", + "RNDRRS", + "RVBAR_EL1", + "RVBAR_EL2", + "RVBAR_EL3", + "SCR_EL3", + "SCTLR_EL1", + "SCTLR_EL12", + "SCTLR_EL2", + "SCTLR_EL3", + "SCXTNUM_EL0", + "SCXTNUM_EL1", + "SCXTNUM_EL12", + "SCXTNUM_EL2", + "SCXTNUM_EL3", + "SDER32_EL2", + "SDER32_EL3", + "SPSEL", + "SPSR_ABT", + "SPSR_EL1", + "SPSR_EL12", + "SPSR_EL2", + "SPSR_EL3", + "SPSR_FIQ", + "SPSR_IRQ", + "SPSR_UND", + "SP_EL0", + "SP_EL1", + "SP_EL2", + "SSBS", + "TCO", + "TCR_EL1", + "TCR_EL12", + "TCR_EL2", + "TCR_EL3", + "TEECR32_EL1", + "TEEHBR32_EL1", + "TFSRE0_EL1", + "TFSR_EL1", + "TFSR_EL12", + "TFSR_EL2", + "TFSR_EL3", + "TPIDRRO_EL0", + "TPIDR_EL0", + "TPIDR_EL1", + "TPIDR_EL2", + "TPIDR_EL3", + "TRBBASER_EL1", + "TRBIDR_EL1", + "TRBLIMITR_EL1", + "TRBMAR_EL1", + "TRBPTR_EL1", + "TRBSR_EL1", + "TRBTRG_EL1", + "TRCACATR0", + "TRCACATR1", + "TRCACATR10", + "TRCACATR11", + "TRCACATR12", + "TRCACATR13", + "TRCACATR14", + "TRCACATR15", + "TRCACATR2", + "TRCACATR3", + "TRCACATR4", + "TRCACATR5", + "TRCACATR6", + "TRCACATR7", + "TRCACATR8", + "TRCACATR9", + "TRCACVR0", + "TRCACVR1", + "TRCACVR10", + "TRCACVR11", + "TRCACVR12", + "TRCACVR13", + "TRCACVR14", + "TRCACVR15", + "TRCACVR2", + "TRCACVR3", + "TRCACVR4", + "TRCACVR5", + "TRCACVR6", + "TRCACVR7", + "TRCACVR8", + "TRCACVR9", + "TRCAUTHSTATUS", + "TRCAUXCTLR", + "TRCBBCTLR", + "TRCCCCTLR", + "TRCCIDCCTLR0", + "TRCCIDCCTLR1", + "TRCCIDCVR0", + "TRCCIDCVR1", + "TRCCIDCVR2", + "TRCCIDCVR3", + "TRCCIDCVR4", + "TRCCIDCVR5", + "TRCCIDCVR6", + "TRCCIDCVR7", + "TRCCIDR0", + "TRCCIDR1", + "TRCCIDR2", + "TRCCIDR3", + "TRCCLAIMCLR", + "TRCCLAIMSET", + "TRCCNTCTLR0", + "TRCCNTCTLR1", + "TRCCNTCTLR2", + "TRCCNTCTLR3", + "TRCCNTRLDVR0", + "TRCCNTRLDVR1", + "TRCCNTRLDVR2", + "TRCCNTRLDVR3", + "TRCCNTVR0", + "TRCCNTVR1", + "TRCCNTVR2", + "TRCCNTVR3", + "TRCCONFIGR", + "TRCDEVAFF0", + "TRCDEVAFF1", + "TRCDEVARCH", + "TRCDEVID", + "TRCDEVTYPE", + "TRCDVCMR0", + "TRCDVCMR1", + "TRCDVCMR2", + "TRCDVCMR3", + "TRCDVCMR4", + "TRCDVCMR5", + "TRCDVCMR6", + "TRCDVCMR7", + "TRCDVCVR0", + "TRCDVCVR1", + "TRCDVCVR2", + "TRCDVCVR3", + "TRCDVCVR4", + "TRCDVCVR5", + "TRCDVCVR6", + "TRCDVCVR7", + "TRCEVENTCTL0R", + "TRCEVENTCTL1R", + "TRCEXTINSELR", + "TRCEXTINSELR0", + "TRCEXTINSELR1", + "TRCEXTINSELR2", + "TRCEXTINSELR3", + "TRCIDR0", + "TRCIDR1", + "TRCIDR10", + "TRCIDR11", + "TRCIDR12", + "TRCIDR13", + "TRCIDR2", + "TRCIDR3", + "TRCIDR4", + "TRCIDR5", + "TRCIDR6", + "TRCIDR7", + "TRCIDR8", + "TRCIDR9", + "TRCIMSPEC0", + "TRCIMSPEC1", + "TRCIMSPEC2", + "TRCIMSPEC3", + "TRCIMSPEC4", + "TRCIMSPEC5", + "TRCIMSPEC6", + "TRCIMSPEC7", + "TRCITCTRL", + "TRCLAR", + "TRCLSR", + "TRCOSLAR", + "TRCOSLSR", + "TRCPDCR", + "TRCPDSR", + "TRCPIDR0", + "TRCPIDR1", + "TRCPIDR2", + "TRCPIDR3", + "TRCPIDR4", + "TRCPIDR5", + "TRCPIDR6", + "TRCPIDR7", + "TRCPRGCTLR", + "TRCPROCSELR", + "TRCQCTLR", + "TRCRSCTLR10", + "TRCRSCTLR11", + "TRCRSCTLR12", + "TRCRSCTLR13", + "TRCRSCTLR14", + "TRCRSCTLR15", + "TRCRSCTLR16", + "TRCRSCTLR17", + "TRCRSCTLR18", + "TRCRSCTLR19", + "TRCRSCTLR2", + "TRCRSCTLR20", + "TRCRSCTLR21", + "TRCRSCTLR22", + "TRCRSCTLR23", + "TRCRSCTLR24", + "TRCRSCTLR25", + "TRCRSCTLR26", + "TRCRSCTLR27", + "TRCRSCTLR28", + "TRCRSCTLR29", + "TRCRSCTLR3", + "TRCRSCTLR30", + "TRCRSCTLR31", + "TRCRSCTLR4", + "TRCRSCTLR5", + "TRCRSCTLR6", + "TRCRSCTLR7", + "TRCRSCTLR8", + "TRCRSCTLR9", + "TRCRSR", + "TRCSEQEVR0", + "TRCSEQEVR1", + "TRCSEQEVR2", + "TRCSEQRSTEVR", + "TRCSEQSTR", + "TRCSSCCR0", + "TRCSSCCR1", + "TRCSSCCR2", + "TRCSSCCR3", + "TRCSSCCR4", + "TRCSSCCR5", + "TRCSSCCR6", + "TRCSSCCR7", + "TRCSSCSR0", + "TRCSSCSR1", + "TRCSSCSR2", + "TRCSSCSR3", + "TRCSSCSR4", + "TRCSSCSR5", + "TRCSSCSR6", + "TRCSSCSR7", + "TRCSSPCICR0", + "TRCSSPCICR1", + "TRCSSPCICR2", + "TRCSSPCICR3", + "TRCSSPCICR4", + "TRCSSPCICR5", + "TRCSSPCICR6", + "TRCSSPCICR7", + "TRCSTALLCTLR", + "TRCSTATR", + "TRCSYNCPR", + "TRCTRACEIDR", + "TRCTSCTLR", + "TRCVDARCCTLR", + "TRCVDCTLR", + "TRCVDSACCTLR", + "TRCVICTLR", + "TRCVIIECTLR", + "TRCVIPCSSCTLR", + "TRCVISSCTLR", + "TRCVMIDCCTLR0", + "TRCVMIDCCTLR1", + "TRCVMIDCVR0", + "TRCVMIDCVR1", + "TRCVMIDCVR2", + "TRCVMIDCVR3", + "TRCVMIDCVR4", + "TRCVMIDCVR5", + "TRCVMIDCVR6", + "TRCVMIDCVR7", + "TRFCR_EL1", + "TRFCR_EL12", + "TRFCR_EL2", + "TTBR0_EL1", + "TTBR0_EL12", + "TTBR0_EL2", + "TTBR0_EL3", + "TTBR1_EL1", + "TTBR1_EL12", + "TTBR1_EL2", + "UAO", + "VBAR_EL1", + "VBAR_EL12", + "VBAR_EL2", + "VBAR_EL3", + "VDISR_EL2", + "VMPIDR_EL2", + "VNCR_EL2", + "VPIDR_EL2", + "VSESR_EL2", + "VSTCR_EL2", + "VSTTBR_EL2", + "VTCR_EL2", + "VTTBR_EL2", + "ZCR_EL1", + "ZCR_EL12", + "ZCR_EL2", + "ZCR_EL3", + }; + return llvm::find(ValidRegs, RegName.upper()) != std::end(ValidRegs); +} diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3147,7 +3147,7 @@ << "for X86, valid arguments to '-mstack-protector-guard-reg=' are:fs gs"; return; } - if (EffectiveTriple.isAArch64() && Value != "sp_el0") { + if (EffectiveTriple.isAArch64() && !aarch64::isValidSysReg(Value)) { D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Value; return; } diff --git a/clang/test/Driver/stack-protector-guard.c b/clang/test/Driver/stack-protector-guard.c --- a/clang/test/Driver/stack-protector-guard.c +++ b/clang/test/Driver/stack-protector-guard.c @@ -46,6 +46,10 @@ // RUN: -mstack-protector-guard-reg=sp_el0 \ // RUN: -mstack-protector-guard-offset=0 %s 2>&1 | \ // RUN: FileCheck -check-prefix=CHECK-AARCH64 %s +// RUN: %clang -### -target aarch64-linux-gnu -mstack-protector-guard=sysreg \ +// RUN: -mstack-protector-guard-reg=sp_el2 \ +// RUN: -mstack-protector-guard-offset=0 %s 2>&1 | \ +// RUN: FileCheck -check-prefix=CHECK-AARCH64-SP_EL2 %s // RUN: %clang -### -target aarch64-linux-gnu \ // RUN: -mstack-protector-guard=tls %s 2>&1 | \ // RUN: FileCheck -check-prefix=INVALID-VALUE-AARCH64 %s @@ -55,5 +59,6 @@ // RUN: FileCheck -check-prefix=INVALID-REG-AARCH64 %s // CHECK-AARCH64: "-cc1" {{.*}}"-mstack-protector-guard=sysreg" "-mstack-protector-guard-offset=0" "-mstack-protector-guard-reg=sp_el0" -// INVALID-VALUE-AARCH64: error: invalid value 'tls' in 'mstack-protector-guard=','valid arguments to '-mstack-protector-guard=' are:sysreg global' +// CHECK-AARCH64-SP_EL2: "-cc1" {{.*}}"-mstack-protector-guard=sysreg" "-mstack-protector-guard-offset=0" "-mstack-protector-guard-reg=sp_el2" +// INVALID-VALUE-AARCH64: error: invalid value 'tls' in 'mstack-protector-guard=', valid arguments to '-mstack-protector-guard=' are:sysreg global // INVALID-REG-AARCH64: error: invalid value 'foo' in 'mstack-protector-guard-reg='