aboutsummaryrefslogtreecommitdiff
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/BackendUtil.cpp1
-rw-r--r--clang/lib/Driver/ToolChains/AIX.cpp11
-rw-r--r--clang/lib/Driver/ToolChains/Clang.cpp13
-rw-r--r--clang/lib/Driver/ToolChains/CommonArgs.cpp20
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp22
5 files changed, 67 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp
index a0cf260..4e80c58 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -435,6 +435,7 @@ static bool initTargetOptions(DiagnosticsEngine &Diags,
Options.ObjectFilenameForDebug = CodeGenOpts.ObjectFilenameForDebug;
Options.Hotpatch = CodeGenOpts.HotPatch;
Options.JMCInstrument = CodeGenOpts.JMCInstrument;
+ Options.XCOFFReadOnlyPointers = CodeGenOpts.XCOFFReadOnlyPointers;
switch (CodeGenOpts.getSwiftAsyncFramePointer()) {
case CodeGenOptions::SwiftAsyncFramePointerKind::Auto:
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp
index 0ac261b..46ad8231 100644
--- a/clang/lib/Driver/ToolChains/AIX.cpp
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -122,6 +122,17 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-bnoentry");
}
+ if (Args.hasFlag(options::OPT_mxcoff_roptr, options::OPT_mno_xcoff_roptr,
+ false)) {
+ if (Args.hasArg(options::OPT_shared))
+ D.Diag(diag::err_roptr_cannot_build_shared);
+
+ // The `-mxcoff-roptr` option places constants in RO sections as much as
+ // possible. Then `-bforceimprw` changes such sections to RW if they contain
+ // imported symbols that need to be resolved.
+ CmdArgs.push_back("-bforceimprw");
+ }
+
// PGO instrumentation generates symbols belonging to special sections, and
// the linker needs to place all symbols in a particular section together in
// memory; the AIX linker does that under an option.
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 189cbd1..31f2881b 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -5241,6 +5241,19 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
<< A->getSpelling() << RawTriple.str();
}
+ if (Args.hasArg(options::OPT_mxcoff_roptr) ||
+ Args.hasArg(options::OPT_mno_xcoff_roptr)) {
+ bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
+ options::OPT_mno_xcoff_roptr, false);
+ StringRef OptStr = HasRoptr ? "-mxcoff-roptr" : "-mno-xcoff-roptr";
+ if (!Triple.isOSAIX())
+ D.Diag(diag::err_drv_unsupported_opt_for_target)
+ << OptStr << RawTriple.str();
+
+ if (HasRoptr)
+ CmdArgs.push_back("-mxcoff-roptr");
+ }
+
if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
StringRef V = A->getValue(), V1 = V;
unsigned Size;
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 7131c26..4a11be7 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -749,6 +749,26 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
CmdArgs.push_back(
Args.MakeArgString(Twine(PluginOptPrefix) + "-data-sections=0"));
+ if (Args.hasArg(options::OPT_mxcoff_roptr) ||
+ Args.hasArg(options::OPT_mno_xcoff_roptr)) {
+ bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
+ options::OPT_mno_xcoff_roptr, false);
+ StringRef OptStr = HasRoptr ? "-mxcoff-roptr" : "-mno-xcoff-roptr";
+
+ if (!IsOSAIX)
+ D.Diag(diag::err_drv_unsupported_opt_for_target)
+ << OptStr << ToolChain.getTriple().str();
+
+ if (HasRoptr) {
+ if (!Args.hasFlag(options::OPT_fdata_sections,
+ options::OPT_fno_data_sections, UseSeparateSections))
+ D.Diag(diag::err_roptr_requires_data_sections);
+
+ CmdArgs.push_back(
+ Args.MakeArgString(Twine(PluginOptPrefix) + "-mxcoff-roptr"));
+ }
+ }
+
// Pass an option to enable split machine functions.
if (auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
options::OPT_fno_split_machine_functions)) {
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index cbd2663..c111607 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -1560,6 +1560,9 @@ void CompilerInvocation::GenerateCodeGenArgs(
if (Opts.EnableAIXExtendedAltivecABI)
GenerateArg(Args, OPT_mabi_EQ_vec_extabi, SA);
+ if (Opts.XCOFFReadOnlyPointers)
+ GenerateArg(Args, OPT_mxcoff_roptr, SA);
+
if (!Opts.OptRecordPasses.empty())
GenerateArg(Args, OPT_opt_record_passes, Opts.OptRecordPasses, SA);
@@ -1933,6 +1936,25 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
}
}
+ if (Arg *A = Args.getLastArg(OPT_mxcoff_roptr)) {
+ if (!T.isOSAIX())
+ Diags.Report(diag::err_drv_unsupported_opt_for_target)
+ << A->getSpelling() << T.str();
+
+ // Since the storage mapping class is specified per csect,
+ // without using data sections, it is less effective to use read-only
+ // pointers. Using read-only pointers may cause other RO variables in the
+ // same csect to become RW when the linker acts upon `-bforceimprw`;
+ // therefore, we require that separate data sections
+ // are used when `-mxcoff-roptr` is in effect. We respect the setting of
+ // data-sections since we have not found reasons to do otherwise that
+ // overcome the user surprise of not respecting the setting.
+ if (!Args.hasFlag(OPT_fdata_sections, OPT_fno_data_sections, false))
+ Diags.Report(diag::err_roptr_requires_data_sections);
+
+ Opts.XCOFFReadOnlyPointers = true;
+ }
+
if (Arg *A = Args.getLastArg(OPT_mabi_EQ_quadword_atomics)) {
if (!T.isOSAIX() || T.isPPC32())
Diags.Report(diag::err_drv_unsupported_opt_for_target)