diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Driver/Options.def | 1 | ||||
| -rw-r--r-- | clang/include/clang/Driver/ToolChain.h | 11 | ||||
| -rw-r--r-- | clang/lib/Driver/ToolChains.h | 13 | ||||
| -rw-r--r-- | clang/lib/Driver/Tools.cpp | 42 | ||||
| -rw-r--r-- | clang/test/CodeGen/stack-protector.c | 18 | ||||
| -rw-r--r-- | 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 78f1ff6eadf..af943335eb8 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 b7630d8afdb..df651a6c3d0 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 6088d9617cf..fcd96f1e5c8 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 bc6ad1413a6..9cfdfdc67ba 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 c150759f12b..c29d1f7f33d 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 ff037369879..b18f14758db 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  | 

