summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorgkoehler <gkoehler@openbsd.org>2020-03-04 18:44:38 +0000
committergkoehler <gkoehler@openbsd.org>2020-03-04 18:44:38 +0000
commit9c510017451e6e3b2caf02948cc3de82e92d6fd2 (patch)
treeba59363cac1ecfb98cd298bde684cc3488e0f4da /gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
parentadd 6.8 syspatch public key (diff)
downloadwireguard-openbsd-9c510017451e6e3b2caf02948cc3de82e92d6fd2.tar.xz
wireguard-openbsd-9c510017451e6e3b2caf02948cc3de82e92d6fd2.zip
Switch powerpc clang to -msvr4-struct-return, like gcc.
Add these options from gcc to clang: -maix-struct-return # return all structs in memory -msvr4-struct-return # return small structs in r3/r4 ok mortimer@ jca@ deraadt@
Diffstat (limited to 'gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r--gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp b/gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
index a7c9b352584..4509e4ff35a 100644
--- a/gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/gnu/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
@@ -1199,11 +1199,18 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
}
- if (Arg *A = Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return)) {
- if (A->getOption().matches(OPT_fpcc_struct_return)) {
+ // X86_32 has -fppc-struct-return and -freg-struct-return.
+ // PPC32 has -maix-struct-return and -msvr4-struct-return.
+ if (Arg *A =
+ Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
+ OPT_maix_struct_return, OPT_msvr4_struct_return)) {
+ const Option &O = A->getOption();
+ if (O.matches(OPT_fpcc_struct_return) ||
+ O.matches(OPT_maix_struct_return)) {
Opts.setStructReturnConvention(CodeGenOptions::SRCK_OnStack);
} else {
- assert(A->getOption().matches(OPT_freg_struct_return));
+ assert(O.matches(OPT_freg_struct_return) ||
+ O.matches(OPT_msvr4_struct_return));
Opts.setStructReturnConvention(CodeGenOptions::SRCK_InRegs);
}
}