|
@@ -330,6 +330,17 @@ static StringRef getCodeModel(ArgList &Args, DiagnosticsEngine &Diags) {
|
|
|
return "default";
|
|
|
}
|
|
|
|
|
|
+static StringRef getRelocModel(ArgList &Args, DiagnosticsEngine &Diags) {
|
|
|
+ if (Arg *A = Args.getLastArg(OPT_mrelocation_model)) {
|
|
|
+ StringRef Value = A->getValue();
|
|
|
+ if (Value == "static" || Value == "pic" || Value == "ropi" ||
|
|
|
+ Value == "rwpi" || Value == "ropi-rwpi" || Value == "dynamic-no-pic")
|
|
|
+ return Value;
|
|
|
+ Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Value;
|
|
|
+ }
|
|
|
+ return "pic";
|
|
|
+}
|
|
|
+
|
|
|
/// \brief Create a new Regex instance out of the string value in \p RpassArg.
|
|
|
/// It returns a pointer to the newly generated Regex instance.
|
|
|
static std::shared_ptr<llvm::Regex>
|
|
@@ -615,7 +626,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|
|
Args.hasArg(OPT_cl_unsafe_math_optimizations) ||
|
|
|
Args.hasArg(OPT_cl_fast_relaxed_math);
|
|
|
Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);
|
|
|
- Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic");
|
|
|
+ Opts.RelocationModel = getRelocModel(Args, Diags);
|
|
|
Opts.ThreadModel = Args.getLastArgValue(OPT_mthread_model, "posix");
|
|
|
if (Opts.ThreadModel != "posix" && Opts.ThreadModel != "single")
|
|
|
Diags.Report(diag::err_drv_invalid_value)
|