Skip to content

Commit c92f29b

Browse files
committed
[AIX] Add mabi=vec-extabi options to enable the AIX extended and default vector ABIs.
Added support for the options mabi=vec-extabi and mabi=vec-default which are analogous to qvecnvol and qnovecnvol when using XL on AIX. The extended Altivec ABI on AIX is enabled using mabi=vec-extabi in clang and vec-extabi in llc. Reviewed By: Xiangling_L, DiggerLin Differential Revision: https://reviews.llvm.org/D89684
1 parent 21b346b commit c92f29b

File tree

17 files changed

+133
-1
lines changed

17 files changed

+133
-1
lines changed

‎clang/docs/ClangCommandLineReference.rst‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2885,6 +2885,10 @@ Only supported on X86 and RISC-V. Otherwise accepted for compatibility with GCC.
28852885

28862886
.. option:: -municode<arg>
28872887

2888+
.. option:: -mabi=vec-extabi, -mabi=vec-default
2889+
2890+
Only supported on AIX. Specify usage of the extended vector ABI on AIX and of non-volatile vector registers. Defaults to '-mabi=default' when Altivec is enabled.
2891+
28882892
.. option:: -mvx, -mno-vx
28892893

28902894
.. option:: -mwarn-nonportable-cfstrings, -mno-warn-nonportable-cfstrings

‎clang/include/clang/Basic/CodeGenOptions.def‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ CODEGENOPT(UniqueSectionNames, 1, 1) ///< Set for -funique-section-names.
4949
CODEGENOPT(UniqueBasicBlockSectionNames, 1, 1) ///< Set for -funique-basic-block-section-names,
5050
///< Produce unique section names with
5151
///< basic block sections.
52+
CODEGENOPT(EnableAIXExtendedAltivecABI, 1, 0) ///< Set for -mabi=vec-extabi. Enables the extended Altivec ABI on AIX.
5253
ENUM_CODEGENOPT(FramePointer, FramePointerKind, 2, FramePointerKind::None) /// frame-pointer: all,non-leaf,none
5354

5455
CODEGENOPT(DisableFree , 1, 0) ///< Don't free memory.

‎clang/include/clang/Basic/DiagnosticDriverKinds.td‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,4 +531,9 @@ def err_drv_invalid_object_mode : Error<"OBJECT_MODE setting %0 is not recognize
531531

532532
def err_drv_invalid_sve_vector_bits : Error<
533533
"'-msve-vector-bits' is not supported without SVE enabled">;
534+
535+
def err_aix_default_altivec_abi : Error<
536+
"The default Altivec ABI on AIX is not yet supported, use '-mabi=vec-extabi' for the extended Altivec ABI">;
537+
538+
def err_aix_altivec : Error<"'-mabi=vec-extabi' and '-mabi=vec-default' require '-maltivec'">;
534539
}

‎clang/include/clang/Basic/LangOptions.def‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ VALUE_LANGOPT(AlignDouble , 1, 0, "Controls if doubles should be alig
183183
VALUE_LANGOPT(DoubleSize , 32, 0, "width of double")
184184
VALUE_LANGOPT(LongDoubleSize , 32, 0, "width of long double")
185185
LANGOPT(PPCIEEELongDouble , 1, 0, "use IEEE 754 quadruple-precision for long double")
186+
LANGOPT(EnableAIXExtendedAltivecABI , 1, 0, "__EXTABI__ predefined macro")
186187
COMPATIBLE_VALUE_LANGOPT(PICLevel , 2, 0, "__PIC__ level")
187188
COMPATIBLE_VALUE_LANGOPT(PIE , 1, 0, "is pie")
188189
LANGOPT(ROPI , 1, 0, "Read-only position independence")

‎clang/include/clang/Driver/Options.td‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2564,6 +2564,10 @@ def mpcrel: Flag<["-"], "mpcrel">, Group<m_ppc_Features_Group>;
25642564
def mno_pcrel: Flag<["-"], "mno-pcrel">, Group<m_ppc_Features_Group>;
25652565
def mspe : Flag<["-"], "mspe">, Group<m_ppc_Features_Group>;
25662566
def mno_spe : Flag<["-"], "mno-spe">, Group<m_ppc_Features_Group>;
2567+
def mabi_EQ_vec_extabi : Flag<["-"], "mabi=vec-extabi">, Group<m_Group>, Flags<[CC1Option]>,
2568+
HelpText<"Enable the extended Altivec ABI on AIX (AIX only). Uses volatile and nonvolatile vector registers">;
2569+
def mabi_EQ_vec_default : Flag<["-"], "mabi=vec-default">, Group<m_Group>, Flags<[CC1Option]>,
2570+
HelpText<"Enable the default Altivec ABI on AIX (AIX only). Uses only volatile vector registers.">;
25672571
def mvsx : Flag<["-"], "mvsx">, Group<m_ppc_Features_Group>;
25682572
def mno_vsx : Flag<["-"], "mno-vsx">, Group<m_ppc_Features_Group>;
25692573
def msecure_plt : Flag<["-"], "msecure-plt">, Group<m_ppc_Features_Group>;

‎clang/lib/Basic/Targets/OSTargets.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,9 @@ class AIXTargetInfo : public OSTargetInfo<Target> {
674674

675675
Builder.defineMacro("_AIX");
676676

677+
if (Opts.EnableAIXExtendedAltivecABI)
678+
Builder.defineMacro("__EXTABI__");
679+
677680
unsigned Major, Minor, Micro;
678681
Triple.getOSVersion(Major, Minor, Micro);
679682

‎clang/lib/CodeGen/BackendUtil.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,7 @@ static bool initTargetOptions(DiagnosticsEngine &Diags,
554554
Options.EmitAddrsig = CodeGenOpts.Addrsig;
555555
Options.ForceDwarfFrameSection = CodeGenOpts.ForceDwarfFrameSection;
556556
Options.EmitCallSiteInfo = CodeGenOpts.EmitCallSiteInfo;
557+
Options.EnableAIXExtendedAltivecABI = CodeGenOpts.EnableAIXExtendedAltivecABI;
557558
Options.ValueTrackingVariableLocations =
558559
CodeGenOpts.ValueTrackingVariableLocations;
559560
Options.XRayOmitFunctionIndex = CodeGenOpts.XRayOmitFunctionIndex;

‎clang/lib/Driver/ToolChains/Clang.cpp‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4612,6 +4612,23 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
46124612
}
46134613
}
46144614

4615+
if (Triple.isOSAIX() && Args.hasArg(options::OPT_maltivec)) {
4616+
if (Args.hasArg(options::OPT_mabi_EQ_vec_extabi)) {
4617+
CmdArgs.push_back("-mabi=vec-extabi");
4618+
} else {
4619+
D.Diag(diag::err_aix_default_altivec_abi);
4620+
}
4621+
}
4622+
4623+
if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ_vec_extabi,
4624+
options::OPT_mabi_EQ_vec_default)) {
4625+
if (!Triple.isOSAIX())
4626+
D.Diag(diag::err_drv_unsupported_opt_for_target)
4627+
<< A->getSpelling() << RawTriple.str();
4628+
if (!Args.hasArg(options::OPT_maltivec))
4629+
D.Diag(diag::err_aix_altivec);
4630+
}
4631+
46154632
if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
46164633
StringRef v = A->getValue();
46174634
CmdArgs.push_back("-mllvm");

‎clang/lib/Frontend/CompilerInvocation.cpp‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,6 +1434,22 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
14341434
!Args.hasArg(OPT_fvisibility)))
14351435
Opts.IgnoreXCOFFVisibility = 1;
14361436

1437+
if (Arg *A =
1438+
Args.getLastArg(OPT_mabi_EQ_vec_default, OPT_mabi_EQ_vec_extabi)) {
1439+
if (!T.isOSAIX())
1440+
Diags.Report(diag::err_drv_unsupported_opt_for_target)
1441+
<< A->getSpelling() << T.str();
1442+
1443+
const Option &O = A->getOption();
1444+
if (O.matches(OPT_mabi_EQ_vec_default))
1445+
Diags.Report(diag::err_aix_default_altivec_abi)
1446+
<< A->getSpelling() << T.str();
1447+
else {
1448+
assert(O.matches(OPT_mabi_EQ_vec_extabi));
1449+
Opts.EnableAIXExtendedAltivecABI = 1;
1450+
}
1451+
}
1452+
14371453
Opts.DependentLibraries = Args.getAllArgValues(OPT_dependent_lib);
14381454
Opts.LinkerOptions = Args.getAllArgValues(OPT_linker_option);
14391455
bool NeedLocTracking = false;
@@ -3068,6 +3084,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
30683084
? 128
30693085
: Args.hasArg(OPT_mlong_double_64) ? 64 : 0;
30703086
Opts.PPCIEEELongDouble = Args.hasArg(OPT_mabi_EQ_ieeelongdouble);
3087+
Opts.EnableAIXExtendedAltivecABI = Args.hasArg(OPT_mabi_EQ_vec_extabi);
30713088
Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
30723089
Opts.ROPI = Args.hasArg(OPT_fropi);
30733090
Opts.RWPI = Args.hasArg(OPT_frwpi);

‎clang/test/CodeGen/altivec.c‎

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
// RUN: %clang_cc1 -target-feature +altivec -triple powerpc-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2-
2+
// RUN: %clang_cc1 -target-feature +altivec -mabi=vec-extabi -triple powerpc-unknown-aix -emit-llvm %s -o - | FileCheck %s
3+
// RUN: %clang_cc1 -target-feature +altivec -mabi=vec-extabi -triple powerpc64-unknown-aix -emit-llvm %s -o - | FileCheck %s
4+
// RUN: not %clang_cc1 -target-feature +altivec -mabi=vec-default -triple powerpc-unknown-aix -emit-llvm %s 2>&1 | FileCheck %s --check-prefix=AIX-ERROR
5+
// RUN: not %clang_cc1 -target-feature +altivec -mabi=vec-default -triple powerpc64-unknown-aix -emit-llvm %s 2>&1 | FileCheck %s --check-prefix=AIX-ERROR
6+
7+
// RUN: %clang -S -emit-llvm -maltivec -mabi=vec-extabi -target powerpc-unknown-aix %s -o - | FileCheck %s
8+
// RUN: not %clang -S -emit-llvm -maltivec -target powerpc-unknown-aix %s 2>&1 | FileCheck %s --check-prefix=AIX-ERROR
9+
// RUN: not %clang -S -emit-llvm -maltivec -target powerpc64-unknown-aix %s 2>&1 | FileCheck %s --check-prefix=AIX-ERROR
10+
// RUN: not %clang -S -emit-llvm -mabi=vec-default -target powerpc-unknown-aix %s 2>&1 | FileCheck %s --check-prefix=AIX-ATVER
11+
// RUN: not %clang -S -emit-llvm -mabi=vec-extabi -target powerpc-unknown-aix %s 2>&1 | FileCheck %s --check-prefix=AIX-ATVER
12+
// RUN: %clang -S -emit-llvm -maltivec -mabi=vec-extabi -target powerpc64-unknown-aix %s -o - | FileCheck %s
13+
// RUN: not %clang -S -emit-llvm -mabi=vec-default -target powerpc64-unknown-aix %s 2>&1 | FileCheck %s --check-prefix=AIX-ATVER
14+
// RUN: not %clang -S -emit-llvm -mabi=vec-extabi -target powerpc64-unknown-aix %s 2>&1 | FileCheck %s --check-prefix=AIX-ATVER
15+
// RUN: not %clang -S -mabi=vec-default -target powerpc-unknown-aix %s 2>&1 | FileCheck %s --check-prefix=AIX-ATVER
16+
// RUN: not %clang -S -mabi=vec-extabi -target powerpc-unknown-aix %s 2>&1 | FileCheck %s --check-prefix=AIX-ATVER
17+
// RUN: not %clang -S -mabi=vec-default -target powerpc64-unknown-aix %s 2>&1 | FileCheck %s --check-prefix=AIX-ATVER
18+
// RUN: not %clang -S -mabi=vec-extabi -target powerpc64-unknown-aix %s 2>&1 | FileCheck %s --check-prefix=AIX-ATVER
319
// Check initialization
420

521
vector int test0 = (vector int)(1); // CHECK: @test0 = global <4 x i32> <i32 1, i32 1, i32 1, i32 1>
@@ -38,3 +54,6 @@ void test3() {
3854
vector float vf;
3955
vf++; // CHECK: fadd <4 x float> {{.*}} <float 1.000000e+{{0+}}, float 1.000000e+{{0+}}, float 1.000000e+{{0+}}, float 1.000000e+{{0+}}>
4056
}
57+
58+
// AIX-ERROR: error: The default Altivec ABI on AIX is not yet supported, use '-mabi=vec-extabi' for the extended Altivec ABI
59+
// AIX-ATVER: error: '-mabi=vec-extabi' and '-mabi=vec-default' require '-maltivec'

0 commit comments

Comments
 (0)