[flang] Support -mabi=vec-extabi and -mabi=vec-default on AIX (#113215)
This option is to enable the AIX extended and default vector ABIs.
This commit is contained in:
parent
9e37cbb469
commit
8e14c6c172
@ -4678,7 +4678,8 @@ def malign_loops_EQ : Joined<["-"], "malign-loops=">, Group<clang_ignored_m_Grou
|
||||
def malign_jumps_EQ : Joined<["-"], "malign-jumps=">, Group<clang_ignored_m_Group>;
|
||||
|
||||
let Flags = [TargetSpecific] in {
|
||||
def mabi_EQ : Joined<["-"], "mabi=">, Group<m_Group>;
|
||||
def mabi_EQ : Joined<["-"], "mabi=">, Group<m_Group>,
|
||||
Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>;
|
||||
def malign_branch_EQ : CommaJoined<["-"], "malign-branch=">, Group<m_Group>,
|
||||
HelpText<"Specify types of branches to align">;
|
||||
def malign_branch_boundary_EQ : Joined<["-"], "malign-branch-boundary=">, Group<m_Group>,
|
||||
@ -7363,6 +7364,7 @@ def mabi_EQ_ieeelongdouble : Flag<["-"], "mabi=ieeelongdouble">,
|
||||
HelpText<"Use IEEE 754 quadruple-precision for long double">,
|
||||
MarshallingInfoFlag<LangOpts<"PPCIEEELongDouble">>;
|
||||
def mabi_EQ_vec_extabi : Flag<["-"], "mabi=vec-extabi">,
|
||||
Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
|
||||
HelpText<"Enable the extended Altivec ABI on AIX. Use volatile and nonvolatile vector registers">,
|
||||
MarshallingInfoFlag<LangOpts<"EnableAIXExtendedAltivecABI">>;
|
||||
def mfloat_abi : Separate<["-"], "mfloat-abi">,
|
||||
|
@ -203,6 +203,32 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args,
|
||||
}
|
||||
}
|
||||
|
||||
void Flang::AddPPCTargetArgs(const ArgList &Args,
|
||||
ArgStringList &CmdArgs) const {
|
||||
const Driver &D = getToolChain().getDriver();
|
||||
bool VecExtabi = false;
|
||||
|
||||
if (const Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
|
||||
StringRef V = A->getValue();
|
||||
if (V == "vec-extabi")
|
||||
VecExtabi = true;
|
||||
else if (V == "vec-default")
|
||||
VecExtabi = false;
|
||||
else
|
||||
D.Diag(diag::err_drv_unsupported_option_argument)
|
||||
<< A->getSpelling() << V;
|
||||
}
|
||||
|
||||
const llvm::Triple &T = getToolChain().getTriple();
|
||||
if (VecExtabi) {
|
||||
if (!T.isOSAIX()) {
|
||||
D.Diag(diag::err_drv_unsupported_opt_for_target)
|
||||
<< "-mabi=vec-extabi" << T.str();
|
||||
}
|
||||
CmdArgs.push_back("-mabi=vec-extabi");
|
||||
}
|
||||
}
|
||||
|
||||
void Flang::AddRISCVTargetArgs(const ArgList &Args,
|
||||
ArgStringList &CmdArgs) const {
|
||||
const llvm::Triple &Triple = getToolChain().getTriple();
|
||||
@ -383,6 +409,11 @@ void Flang::addTargetOptions(const ArgList &Args,
|
||||
getTargetFeatures(D, Triple, Args, CmdArgs, /*ForAs*/ false);
|
||||
AddX86_64TargetArgs(Args, CmdArgs);
|
||||
break;
|
||||
case llvm::Triple::ppc:
|
||||
case llvm::Triple::ppc64:
|
||||
case llvm::Triple::ppc64le:
|
||||
AddPPCTargetArgs(Args, CmdArgs);
|
||||
break;
|
||||
}
|
||||
|
||||
if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
|
||||
|
@ -84,6 +84,13 @@ private:
|
||||
void AddX86_64TargetArgs(const llvm::opt::ArgList &Args,
|
||||
llvm::opt::ArgStringList &CmdArgs) const;
|
||||
|
||||
/// Add specific options for PPC target.
|
||||
///
|
||||
/// \param [in] Args The list of input driver arguments
|
||||
/// \param [out] CmdArgs The list of output command arguments
|
||||
void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
|
||||
llvm::opt::ArgStringList &CmdArgs) const;
|
||||
|
||||
/// Extract offload options from the driver arguments and add them to
|
||||
/// the command arguments.
|
||||
/// \param [in] C The current compilation for the driver invocation
|
||||
|
@ -44,6 +44,9 @@ public:
|
||||
|
||||
/// The integer KINDs disabled for this target
|
||||
std::vector<int> disabledIntegerKinds;
|
||||
|
||||
/// Extended Altivec ABI on AIX
|
||||
bool EnableAIXExtendedAltivecABI;
|
||||
};
|
||||
|
||||
} // end namespace Fortran::frontend
|
||||
|
@ -313,7 +313,6 @@ bool CompilerInstance::setUpTargetMachine() {
|
||||
<< error;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create `TargetMachine`
|
||||
const auto &CGOpts = getInvocation().getCodeGenOpts();
|
||||
std::optional<llvm::CodeGenOptLevel> OptLevelOrNone =
|
||||
@ -322,9 +321,13 @@ bool CompilerInstance::setUpTargetMachine() {
|
||||
llvm::CodeGenOptLevel OptLevel = *OptLevelOrNone;
|
||||
std::string featuresStr = getTargetFeatures();
|
||||
std::optional<llvm::CodeModel::Model> cm = getCodeModel(CGOpts.CodeModel);
|
||||
|
||||
llvm::TargetOptions tOpts = llvm::TargetOptions();
|
||||
tOpts.EnableAIXExtendedAltivecABI = targetOpts.EnableAIXExtendedAltivecABI;
|
||||
|
||||
targetMachine.reset(theTarget->createTargetMachine(
|
||||
theTriple, /*CPU=*/targetOpts.cpu,
|
||||
/*Features=*/featuresStr, llvm::TargetOptions(),
|
||||
/*Features=*/featuresStr, /*Options=*/tOpts,
|
||||
/*Reloc::Model=*/CGOpts.getRelocationModel(),
|
||||
/*CodeModel::Model=*/cm, OptLevel));
|
||||
assert(targetMachine && "Failed to create TargetMachine");
|
||||
|
@ -457,6 +457,16 @@ static void parseTargetArgs(TargetOptions &opts, llvm::opt::ArgList &args) {
|
||||
|
||||
if (args.hasArg(clang::driver::options::OPT_fdisable_integer_16))
|
||||
opts.disabledIntegerKinds.push_back(16);
|
||||
|
||||
if (const llvm::opt::Arg *a =
|
||||
args.getLastArg(clang::driver::options::OPT_mabi_EQ)) {
|
||||
llvm::StringRef V = a->getValue();
|
||||
if (V == "vec-extabi") {
|
||||
opts.EnableAIXExtendedAltivecABI = true;
|
||||
} else if (V == "vec-default") {
|
||||
opts.EnableAIXExtendedAltivecABI = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Tweak the frontend configuration based on the frontend action
|
||||
static void setUpFrontendBasedOnAction(FrontendOptions &opts) {
|
||||
|
17
flang/test/Driver/mabi.f90
Normal file
17
flang/test/Driver/mabi.f90
Normal file
@ -0,0 +1,17 @@
|
||||
! RUN: not %flang -### -c --target=powerpc64le-unknown-linux -mabi=vec-extabi %s 2>&1 | FileCheck --check-prefix=INVALID1 %s
|
||||
! RUN: not %flang -### -c --target=x86_64-unknown-linux -mabi=vec-extabi %s 2>&1 | FileCheck --check-prefix=INVALID2 %s
|
||||
! RUN: not %flang -### -c --target=powerpc-unknown-aix -mabi=abc %s 2>&1 | FileCheck --check-prefix=INVALID3 %s
|
||||
! RUN: %flang -### -c -target powerpc-unknown-aix %s 2>&1 | FileCheck --implicit-check-not=vec-extabi %s
|
||||
! RUN: %flang -### -c -target powerpc-unknown-aix -mabi=vec-default %s 2>&1 | FileCheck --implicit-check-not=vec-extabi %s
|
||||
! RUN: %flang -### -c -target powerpc-unknown-aix -mabi=vec-extabi %s 2>&1 | FileCheck --check-prefix=EXTABI %s
|
||||
|
||||
! REQUIRES: target=powerpc{{.*}}
|
||||
|
||||
! INVALID1: error: unsupported option '-mabi=vec-extabi' for target '{{.*}}'
|
||||
! INVALID2: error: unsupported option '-mabi=' for target '{{.*}}'
|
||||
! INVALID3: error: unsupported argument 'abc' to option '-mabi='
|
||||
|
||||
! EXTABI: "-fc1"
|
||||
! EXTABI-SAME: "-mabi=vec-extabi"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user