diff options
-rw-r--r-- | include/clang/Driver/Options.def | 4 | ||||
-rw-r--r-- | lib/Driver/Tools.cpp | 41 | ||||
-rw-r--r-- | test/Driver/arm-darwin-builtin.c | 12 |
3 files changed, 56 insertions, 1 deletions
diff --git a/include/clang/Driver/Options.def b/include/clang/Driver/Options.def index 60f5080475..bf28164f46 100644 --- a/include/clang/Driver/Options.def +++ b/include/clang/Driver/Options.def @@ -370,6 +370,8 @@ OPTION("-fast", fast, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fasynchronous-unwind-tables", fasynchronous_unwind_tables, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fblocks", fblocks, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fbootclasspath=", fbootclasspath_EQ, Joined, f_Group, INVALID, "", 0, 0, 0) +OPTION("-fbuiltin-strcat", fbuiltin_strcat, Flag, f_Group, INVALID, "", 0, 0, 0) +OPTION("-fbuiltin-strcpy", fbuiltin_strcpy, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fbuiltin", fbuiltin, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fclasspath=", fclasspath_EQ, Joined, f_Group, INVALID, "", 0, 0, 0) OPTION("-fcolor-diagnostics", fcolor_diagnostics, Flag, f_Group, INVALID, "", 0, 0, 0) @@ -410,6 +412,8 @@ OPTION("-fnested-functions", fnested_functions, Flag, f_Group, INVALID, "", 0, 0 OPTION("-fnext-runtime", fnext_runtime, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fno-asynchronous-unwind-tables", fno_asynchronous_unwind_tables, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fno-blocks", fno_blocks, Flag, f_Group, INVALID, "", 0, 0, 0) +OPTION("-fno-builtin-strcat", fno_builtin_strcat, Flag, f_Group, INVALID, "", 0, 0, 0) +OPTION("-fno-builtin-strcpy", fno_builtin_strcpy, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fno-builtin", fno_builtin, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fno-caret-diagnostics", fno_caret_diagnostics, Flag, f_Group, INVALID, "", 0, 0, 0) OPTION("-fno-color-diagnostics", fno_color_diagnostics, Flag, f_Group, INVALID, "", 0, 0, 0) diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 7b0559e120..c52ae96e51 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -662,6 +662,16 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); } + // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. + if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin && + (getToolChain().getTriple().getArch() == llvm::Triple::arm || + getToolChain().getTriple().getArch() == llvm::Triple::thumb)) { + if (!Args.hasArg(options::OPT_fbuiltin_strcat)) + CmdArgs.push_back("-fno-builtin-strcat"); + if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) + CmdArgs.push_back("-fno-builtin-strcpy"); + } + if (Arg *A = Args.getLastArg(options::OPT_traditional, options::OPT_traditional_cpp)) D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); @@ -919,6 +929,14 @@ void darwin::CC1::AddCC1Args(const ArgList &Args, !Args.hasArg(options::OPT_mdynamic_no_pic)) CmdArgs.push_back("-fPIC"); + if (getToolChain().getTriple().getArch() == llvm::Triple::arm || + getToolChain().getTriple().getArch() == llvm::Triple::thumb) { + if (!Args.hasArg(options::OPT_fbuiltin_strcat)) + CmdArgs.push_back("-fno-builtin-strcat"); + if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) + CmdArgs.push_back("-fno-builtin-strcpy"); + } + // gcc has some code here to deal with when no -mmacosx-version-min // and no -miphoneos-version-min is present, but this never happens // due to tool chain specific argument translation. @@ -991,7 +1009,28 @@ void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, Args.AddLastArg(CmdArgs, options::OPT_p); // The driver treats -fsyntax-only specially. - Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); + if (getToolChain().getTriple().getArch() == llvm::Triple::arm || + getToolChain().getTriple().getArch() == llvm::Triple::thumb) { + // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are + // used to inhibit the default -fno-builtin-str{cat,cpy}. + // + // FIXME: Should we grow a better way to deal with "removing" args? + // + // FIXME: Use iterator. + for (ArgList::const_iterator it = Args.begin(), + ie = Args.end(); it != ie; ++it) { + const Arg *A = *it; + if (A->getOption().matches(options::OPT_f_Group) || + A->getOption().matches(options::OPT_fsyntax_only)) { + if (!A->getOption().matches(options::OPT_fbuiltin_strcat) && + !A->getOption().matches(options::OPT_fbuiltin_strcpy)) { + A->claim(); + A->render(Args, CmdArgs); + } + } + } + } else + Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); Args.AddAllArgs(CmdArgs, options::OPT_undef); if (Args.hasArg(options::OPT_Qn)) diff --git a/test/Driver/arm-darwin-builtin.c b/test/Driver/arm-darwin-builtin.c new file mode 100644 index 0000000000..f79a167f01 --- /dev/null +++ b/test/Driver/arm-darwin-builtin.c @@ -0,0 +1,12 @@ +// RUN: clang -ccc-host-triple x86_64-apple-darwin9 -arch arm -### -fsyntax-only %s 2> %t && +// RUN: grep -- "-fno-builtin-strcat" %t && +// RUN: grep -- "-fno-builtin-strcpy" %t && + +// RUN: clang -ccc-host-triple x86_64-apple-darwin9 -arch arm -### -fsyntax-only %s -fbuiltin-strcat -fbuiltin-strcpy 2> %t && +// RUN: not grep -- "-fno-builtin-strcat" %t && +// RUN: not grep -- "-fno-builtin-strcpy" %t && + +// RUN: clang -ccc-no-clang -ccc-host-triple x86_64-apple-darwin9 -arch arm -### -fsyntax-only %s -fbuiltin-strcat -fbuiltin-strcpy 2> %t && +// RUN: not grep -- "-fno-builtin-strcat" %t && +// RUN: not grep -- "-fno-builtin-strcpy" %t + |