Skip to content

Commit 8e14c6c

Browse files
authored
[flang] Support -mabi=vec-extabi and -mabi=vec-default on AIX (#113215)
This option is to enable the AIX extended and default vector ABIs.
1 parent 9e37cbb commit 8e14c6c

File tree

7 files changed

+76
-3
lines changed

7 files changed

+76
-3
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4678,7 +4678,8 @@ def malign_loops_EQ : Joined<["-"], "malign-loops=">, Group<clang_ignored_m_Grou
46784678
def malign_jumps_EQ : Joined<["-"], "malign-jumps=">, Group<clang_ignored_m_Group>;
46794679

46804680
let Flags = [TargetSpecific] in {
4681-
def mabi_EQ : Joined<["-"], "mabi=">, Group<m_Group>;
4681+
def mabi_EQ : Joined<["-"], "mabi=">, Group<m_Group>,
4682+
Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>;
46824683
def malign_branch_EQ : CommaJoined<["-"], "malign-branch=">, Group<m_Group>,
46834684
HelpText<"Specify types of branches to align">;
46844685
def malign_branch_boundary_EQ : Joined<["-"], "malign-branch-boundary=">, Group<m_Group>,
@@ -7363,6 +7364,7 @@ def mabi_EQ_ieeelongdouble : Flag<["-"], "mabi=ieeelongdouble">,
73637364
HelpText<"Use IEEE 754 quadruple-precision for long double">,
73647365
MarshallingInfoFlag<LangOpts<"PPCIEEELongDouble">>;
73657366
def mabi_EQ_vec_extabi : Flag<["-"], "mabi=vec-extabi">,
7367+
Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
73667368
HelpText<"Enable the extended Altivec ABI on AIX. Use volatile and nonvolatile vector registers">,
73677369
MarshallingInfoFlag<LangOpts<"EnableAIXExtendedAltivecABI">>;
73687370
def mfloat_abi : Separate<["-"], "mfloat-abi">,

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,32 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args,
203203
}
204204
}
205205

206+
void Flang::AddPPCTargetArgs(const ArgList &Args,
207+
ArgStringList &CmdArgs) const {
208+
const Driver &D = getToolChain().getDriver();
209+
bool VecExtabi = false;
210+
211+
if (const Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
212+
StringRef V = A->getValue();
213+
if (V == "vec-extabi")
214+
VecExtabi = true;
215+
else if (V == "vec-default")
216+
VecExtabi = false;
217+
else
218+
D.Diag(diag::err_drv_unsupported_option_argument)
219+
<< A->getSpelling() << V;
220+
}
221+
222+
const llvm::Triple &T = getToolChain().getTriple();
223+
if (VecExtabi) {
224+
if (!T.isOSAIX()) {
225+
D.Diag(diag::err_drv_unsupported_opt_for_target)
226+
<< "-mabi=vec-extabi" << T.str();
227+
}
228+
CmdArgs.push_back("-mabi=vec-extabi");
229+
}
230+
}
231+
206232
void Flang::AddRISCVTargetArgs(const ArgList &Args,
207233
ArgStringList &CmdArgs) const {
208234
const llvm::Triple &Triple = getToolChain().getTriple();
@@ -383,6 +409,11 @@ void Flang::addTargetOptions(const ArgList &Args,
383409
getTargetFeatures(D, Triple, Args, CmdArgs, /*ForAs*/ false);
384410
AddX86_64TargetArgs(Args, CmdArgs);
385411
break;
412+
case llvm::Triple::ppc:
413+
case llvm::Triple::ppc64:
414+
case llvm::Triple::ppc64le:
415+
AddPPCTargetArgs(Args, CmdArgs);
416+
break;
386417
}
387418

388419
if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {

clang/lib/Driver/ToolChains/Flang.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ class LLVM_LIBRARY_VISIBILITY Flang : public Tool {
8484
void AddX86_64TargetArgs(const llvm::opt::ArgList &Args,
8585
llvm::opt::ArgStringList &CmdArgs) const;
8686

87+
/// Add specific options for PPC target.
88+
///
89+
/// \param [in] Args The list of input driver arguments
90+
/// \param [out] CmdArgs The list of output command arguments
91+
void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
92+
llvm::opt::ArgStringList &CmdArgs) const;
93+
8794
/// Extract offload options from the driver arguments and add them to
8895
/// the command arguments.
8996
/// \param [in] C The current compilation for the driver invocation

flang/include/flang/Frontend/TargetOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ class TargetOptions {
4444

4545
/// The integer KINDs disabled for this target
4646
std::vector<int> disabledIntegerKinds;
47+
48+
/// Extended Altivec ABI on AIX
49+
bool EnableAIXExtendedAltivecABI;
4750
};
4851

4952
} // end namespace Fortran::frontend

flang/lib/Frontend/CompilerInstance.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,6 @@ bool CompilerInstance::setUpTargetMachine() {
313313
<< error;
314314
return false;
315315
}
316-
317316
// Create `TargetMachine`
318317
const auto &CGOpts = getInvocation().getCodeGenOpts();
319318
std::optional<llvm::CodeGenOptLevel> OptLevelOrNone =
@@ -322,9 +321,13 @@ bool CompilerInstance::setUpTargetMachine() {
322321
llvm::CodeGenOptLevel OptLevel = *OptLevelOrNone;
323322
std::string featuresStr = getTargetFeatures();
324323
std::optional<llvm::CodeModel::Model> cm = getCodeModel(CGOpts.CodeModel);
324+
325+
llvm::TargetOptions tOpts = llvm::TargetOptions();
326+
tOpts.EnableAIXExtendedAltivecABI = targetOpts.EnableAIXExtendedAltivecABI;
327+
325328
targetMachine.reset(theTarget->createTargetMachine(
326329
theTriple, /*CPU=*/targetOpts.cpu,
327-
/*Features=*/featuresStr, llvm::TargetOptions(),
330+
/*Features=*/featuresStr, /*Options=*/tOpts,
328331
/*Reloc::Model=*/CGOpts.getRelocationModel(),
329332
/*CodeModel::Model=*/cm, OptLevel));
330333
assert(targetMachine && "Failed to create TargetMachine");

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,16 @@ static void parseTargetArgs(TargetOptions &opts, llvm::opt::ArgList &args) {
457457

458458
if (args.hasArg(clang::driver::options::OPT_fdisable_integer_16))
459459
opts.disabledIntegerKinds.push_back(16);
460+
461+
if (const llvm::opt::Arg *a =
462+
args.getLastArg(clang::driver::options::OPT_mabi_EQ)) {
463+
llvm::StringRef V = a->getValue();
464+
if (V == "vec-extabi") {
465+
opts.EnableAIXExtendedAltivecABI = true;
466+
} else if (V == "vec-default") {
467+
opts.EnableAIXExtendedAltivecABI = false;
468+
}
469+
}
460470
}
461471
// Tweak the frontend configuration based on the frontend action
462472
static void setUpFrontendBasedOnAction(FrontendOptions &opts) {

flang/test/Driver/mabi.f90

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
! RUN: not %flang -### -c --target=powerpc64le-unknown-linux -mabi=vec-extabi %s 2>&1 | FileCheck --check-prefix=INVALID1 %s
2+
! RUN: not %flang -### -c --target=x86_64-unknown-linux -mabi=vec-extabi %s 2>&1 | FileCheck --check-prefix=INVALID2 %s
3+
! RUN: not %flang -### -c --target=powerpc-unknown-aix -mabi=abc %s 2>&1 | FileCheck --check-prefix=INVALID3 %s
4+
! RUN: %flang -### -c -target powerpc-unknown-aix %s 2>&1 | FileCheck --implicit-check-not=vec-extabi %s
5+
! RUN: %flang -### -c -target powerpc-unknown-aix -mabi=vec-default %s 2>&1 | FileCheck --implicit-check-not=vec-extabi %s
6+
! RUN: %flang -### -c -target powerpc-unknown-aix -mabi=vec-extabi %s 2>&1 | FileCheck --check-prefix=EXTABI %s
7+
8+
! REQUIRES: target=powerpc{{.*}}
9+
10+
! INVALID1: error: unsupported option '-mabi=vec-extabi' for target '{{.*}}'
11+
! INVALID2: error: unsupported option '-mabi=' for target '{{.*}}'
12+
! INVALID3: error: unsupported argument 'abc' to option '-mabi='
13+
14+
! EXTABI: "-fc1"
15+
! EXTABI-SAME: "-mabi=vec-extabi"
16+
17+

0 commit comments

Comments
 (0)