From 4930e3357b0830ded8b903e518985f8ba8cb7a89 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Tue, 17 Nov 2009 08:07:36 +0000 Subject: [PATCH] Add -fblocks, -stack-protector, and -fobjc-nonfragile-abi defaulting to driver, instead of using getDefaultLangOptions. - Remove unused -fobjc-tight-layout while at it. llvm-svn: 89065 --- clang/include/clang/Driver/Options.def | 1 - clang/include/clang/Driver/ToolChain.h | 11 +++++++ clang/lib/Driver/ToolChains.h | 13 ++++++++ clang/lib/Driver/Tools.cpp | 42 ++++++++++++++------------ clang/test/CodeGen/stack-protector.c | 18 ++++------- clang/test/Driver/clang_f_opts.c | 1 - 6 files changed, 53 insertions(+), 33 deletions(-) diff --git a/clang/include/clang/Driver/Options.def b/clang/include/clang/Driver/Options.def index 78f1ff6eadf9..af943335eb8f 100644 --- a/clang/include/clang/Driver/Options.def +++ b/clang/include/clang/Driver/Options.def @@ -449,7 +449,6 @@ OPTION("-fobjc-gc", fobjc_gc, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fobjc-new-property", fobjc_new_property, Flag, clang_ignored_f_Group, INVALID, "", 0, 0, 0) OPTION("-fobjc-nonfragile-abi", fobjc_nonfragile_abi, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fobjc-sender-dependent-dispatch", fobjc_sender_dependent_dispatch, Flag, f_Group, INVALID, "", 0, 0, 0) -OPTION("-fobjc-tight-layout", fobjc_tight_layout, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fobjc", fobjc, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fomit-frame-pointer", fomit_frame_pointer, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fopenmp", fopenmp, Flag, f_Group, INVALID, "", 0, 0, 0) diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index b7630d8afdb8..df651a6c3d00 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -90,6 +90,17 @@ public: /// default. virtual bool IsMathErrnoDefault() const = 0; + /// IsBlocksDefault - Does this tool chain enable -fblocks by default. + virtual bool IsBlocksDefault() const { return false; } + + /// IsObjCNonFragileABIDefault - Does this tool chain set + /// -fobjc-nonfragile-abi by default. + virtual bool IsObjCNonFragileABIDefault() const { return false; } + + /// GetDefaultStackProtectorLevel - Get the default stack protector level for + /// this tool chain (0=off, 1=on, 2=all). + virtual unsigned GetDefaultStackProtectorLevel() const { return 0; } + /// IsUnwindTablesDefault - Does this tool chain use -funwind-tables /// by default. virtual bool IsUnwindTablesDefault() const = 0; diff --git a/clang/lib/Driver/ToolChains.h b/clang/lib/Driver/ToolChains.h index 6088d9617cf0..fcd96f1e5c8c 100644 --- a/clang/lib/Driver/ToolChains.h +++ b/clang/lib/Driver/ToolChains.h @@ -137,7 +137,20 @@ public: virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const; virtual bool IsMathErrnoDefault() const; + virtual bool IsBlocksDefault() const { + // Blocks default to on for 10.6 (darwin10) and beyond. + return (DarwinVersion[0] > 9); + } + virtual bool IsObjCNonFragileABIDefault() const { + // Non-fragile ABI default to on for 10.5 (darwin9) and beyond on x86-64. + return (DarwinVersion[0] >= 9 && + getTriple().getArch() == llvm::Triple::x86_64); + } virtual bool IsUnwindTablesDefault() const; + virtual unsigned GetDefaultStackProtectorLevel() const { + // Stack protectors default to on for 10.6 (darwin10) and beyond. + return (DarwinVersion[0] > 9) ? 1 : 0; + } virtual const char *GetDefaultRelocationModel() const; virtual const char *GetForcedPicModel() const; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index bc6ad1413a6f..9cfdfdc67baa 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -893,9 +893,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only); Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc); Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); - // FIXME: Should we remove this? - Args.AddLastArg(CmdArgs, options::OPT_fobjc_nonfragile_abi); - Args.AddLastArg(CmdArgs, options::OPT_fobjc_tight_layout); Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); Args.AddLastArg(CmdArgs, options::OPT_ftime_report); Args.AddLastArg(CmdArgs, options::OPT_ftrapv); @@ -904,33 +901,33 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, Args.AddLastArg(CmdArgs, options::OPT_pthread); - // Forward stack protector flags. + // -stack-protector=0 is default. + unsigned StackProtectorLevel = 0; if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, options::OPT_fstack_protector_all, options::OPT_fstack_protector)) { - if (A->getOption().matches(options::OPT_fno_stack_protector)) - CmdArgs.push_back("--stack-protector=0"); - else if (A->getOption().matches(options::OPT_fstack_protector)) - CmdArgs.push_back("--stack-protector=1"); - else - CmdArgs.push_back("--stack-protector=2"); + if (A->getOption().matches(options::OPT_fstack_protector)) + StackProtectorLevel = 1; + else if (A->getOption().matches(options::OPT_fstack_protector_all)) + StackProtectorLevel = 2; + } else + StackProtectorLevel = getToolChain().GetDefaultStackProtectorLevel(); + if (StackProtectorLevel) { + CmdArgs.push_back("-stack-protector"); + CmdArgs.push_back(Args.MakeArgString(llvm::Twine(StackProtectorLevel))); } // Forward -f options with positive and negative forms; we translate // these by hand. - // -fbuiltin is default, only pass non-default. + // -fbuiltin is default. if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin)) CmdArgs.push_back("-fbuiltin=0"); - // -fblocks default varies depending on platform and language; only - // pass if specified. - if (Arg *A = Args.getLastArg(options::OPT_fblocks, options::OPT_fno_blocks)) { - if (A->getOption().matches(options::OPT_fblocks)) - CmdArgs.push_back("-fblocks"); - else - CmdArgs.push_back("-fblocks=0"); - } + // -fblocks=0 is default. + if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks, + getToolChain().IsBlocksDefault())) + CmdArgs.push_back("-fblocks"); if (needsExceptions(Args, InputType, getToolChain().getTriple())) CmdArgs.push_back("-fexceptions"); @@ -959,6 +956,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, getToolChain().getTriple().getOS() == llvm::Triple::Darwin)) CmdArgs.push_back("-fgnu-runtime"); + // -fobjc-nonfragile-abi=0 is default. + if (types::isObjC(InputType)) { + if (Args.hasArg(options::OPT_fobjc_nonfragile_abi) || + getToolChain().IsObjCNonFragileABIDefault()) + CmdArgs.push_back("-fobjc-nonfragile-abi"); + } + // -fshort-wchar default varies depending on platform; only // pass if specified. if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar)) { diff --git a/clang/test/CodeGen/stack-protector.c b/clang/test/CodeGen/stack-protector.c index c150759f12bf..c29d1f7f33d9 100644 --- a/clang/test/CodeGen/stack-protector.c +++ b/clang/test/CodeGen/stack-protector.c @@ -1,15 +1,9 @@ -// RUN: clang-cc -triple i686-unknown-unknown -emit-llvm -o %t %s -// RUN: not grep 'ssp' %t -// RUN: clang-cc -triple i686-apple-darwin9 -emit-llvm -o %t %s -// RUN: not grep 'ssp' %t -// RUN: clang-cc -triple i686-apple-darwin10 -emit-llvm -o %t %s -// RUN: grep 'ssp' %t -// RUN: clang -fstack-protector-all -emit-llvm -S -o %t %s -// RUN: grep 'sspreq' %t -// RUN: clang -fstack-protector -emit-llvm -S -o %t %s -// RUN: grep 'ssp' %t -// RUN: clang -fno-stack-protector -emit-llvm -S -o %t %s -// RUN: not grep 'ssp' %t +// RUN: clang-cc -emit-llvm -o - %s -stack-protector=0 | FileCheck -check-prefix=NOSSP %s +// NOSSP: define void @test1(i8* %msg) nounwind { +// RUN: clang-cc -emit-llvm -o - %s -stack-protector=1 | FileCheck -check-prefix=WITHSSP %s +// WITHSSP: define void @test1(i8* %msg) nounwind ssp { +// RUN: clang-cc -emit-llvm -o - %s -stack-protector=2 | FileCheck -check-prefix=SSPREQ %s +// SSPREQ: define void @test1(i8* %msg) nounwind sspreq { int printf(const char * _Format, ...); diff --git a/clang/test/Driver/clang_f_opts.c b/clang/test/Driver/clang_f_opts.c index ff0373698796..b18f14758db1 100644 --- a/clang/test/Driver/clang_f_opts.c +++ b/clang/test/Driver/clang_f_opts.c @@ -3,7 +3,6 @@ // RUN: grep -F '"--fmath-errno=1"' %t // RUN: grep -F '"-fpascal-strings"' %t // RUN: clang -### -S -x c /dev/null -fblocks -fbuiltin -fmath-errno -fcommon -fpascal-strings -fno-blocks -fno-builtin -fno-math-errno -fno-common -fno-pascal-strings -fno-show-source-location -fshort-wchar %s 2> %t -// RUN: grep -F '"-fblocks=0"' %t // RUN: grep -F '"-fbuiltin=0"' %t // RUN: grep -F '"-fno-common"' %t // RUN: grep -F '"--fmath-errno=0"' %t -- GitLab