diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 81d47b2517d02..27957b10925f7 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2522,7 +2522,9 @@ def static_openmp: Flag<["-"], "static-openmp">, HelpText<"Use the static host OpenMP runtime while linking.">; def fopenmp_new_driver : Flag<["-"], "fopenmp-new-driver">, Flags<[CC1Option]>, Group, HelpText<"Use the new driver for OpenMP offloading.">; -def fno_optimize_sibling_calls : Flag<["-"], "fno-optimize-sibling-calls">, Group; +def fno_optimize_sibling_calls : Flag<["-"], "fno-optimize-sibling-calls">, Group, Flags<[CC1Option]>, + HelpText<"Disable tail call optimization, keeping the call stack accurate">, + MarshallingInfoFlag>; def foptimize_sibling_calls : Flag<["-"], "foptimize-sibling-calls">, Group; defm escaping_block_tail_calls : BoolFOption<"escaping-block-tail-calls", CodeGenOpts<"NoEscapingBlockTailCalls">, DefaultFalse, @@ -5201,9 +5203,6 @@ def mframe_pointer_EQ : Joined<["-"], "mframe-pointer=">, HelpText<"Specify which frame pointers to retain.">, Values<"all,non-leaf,none">, NormalizedValuesScope<"CodeGenOptions::FramePointerKind">, NormalizedValues<["All", "NonLeaf", "None"]>, MarshallingInfoEnum, "None">; -def mdisable_tail_calls : Flag<["-"], "mdisable-tail-calls">, - HelpText<"Disable tail call optimization, keeping the call stack accurate">, - MarshallingInfoFlag>; def menable_no_infinities : Flag<["-"], "menable-no-infs">, HelpText<"Allow optimization to assume there are no infinities.">, MarshallingInfoFlag>, ImpliedByAnyOf<[ffinite_math_only.KeyPath]>; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 4ddd622015efd..9c0372b1dd3db 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4767,9 +4767,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, D.Diag(diag::err_drv_unsupported_embed_bitcode) << A->getSpelling(); // Render the CodeGen options that need to be passed. - if (!Args.hasFlag(options::OPT_foptimize_sibling_calls, - options::OPT_fno_optimize_sibling_calls, true)) - CmdArgs.push_back("-mdisable-tail-calls"); + Args.addOptOutFlag(CmdArgs, options::OPT_foptimize_sibling_calls, + options::OPT_fno_optimize_sibling_calls); RenderFloatingPointOptions(TC, D, isOptimizationLevelFast(Args), Args, CmdArgs, JA); @@ -5150,9 +5149,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, options::OPT_fno_strict_vtable_pointers); Args.addOptInFlag(CmdArgs, options::OPT_fforce_emit_vtables, options::OPT_fno_force_emit_vtables); - if (!Args.hasFlag(options::OPT_foptimize_sibling_calls, - options::OPT_fno_optimize_sibling_calls, true)) - CmdArgs.push_back("-mdisable-tail-calls"); + Args.addOptOutFlag(CmdArgs, options::OPT_foptimize_sibling_calls, + options::OPT_fno_optimize_sibling_calls); Args.addOptOutFlag(CmdArgs, options::OPT_fescaping_block_tail_calls, options::OPT_fno_escaping_block_tail_calls); diff --git a/clang/test/CodeGen/attr-disable-tail-calls.c b/clang/test/CodeGen/attr-disable-tail-calls.c index 83b61dc627042..1fea56b2b0ecc 100644 --- a/clang/test/CodeGen/attr-disable-tail-calls.c +++ b/clang/test/CodeGen/attr-disable-tail-calls.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple x86_64-apple-macosx10.7.0 %s -emit-llvm -mdisable-tail-calls -o - | FileCheck %s -check-prefix=DISABLE +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.7.0 %s -emit-llvm -fno-optimize-sibling-calls -o - | FileCheck %s -check-prefix=DISABLE // RUN: %clang_cc1 -triple x86_64-apple-macosx10.7.0 %s -emit-llvm -o - | FileCheck %s -check-prefix=ENABLE // DISABLE: define{{.*}} i32 @f1() [[ATTRTRUE:#[0-9]+]] { diff --git a/clang/test/CodeGen/disable-tail-calls.c b/clang/test/CodeGen/disable-tail-calls.c index 34dd0ed1bebef..e53c065072a46 100644 --- a/clang/test/CodeGen/disable-tail-calls.c +++ b/clang/test/CodeGen/disable-tail-calls.c @@ -1,16 +1,16 @@ -// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-macosx10.9.0 -emit-llvm -O1 -mdisable-tail-calls -o - < %s | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9.0 -emit-llvm -O2 -fno-optimize-sibling-calls -o - < %s | FileCheck %s typedef struct List { struct List *next; int data; } List; -// CHECK-LABEL: define{{.*}} %struct.List* @find +// CHECK-LABEL: define{{.*}} ptr @find( List *find(List *head, int data) { if (!head) return 0; if (head->data == data) return head; - // CHECK: call %struct.List* @find + // CHECK: call ptr @find( return find(head->next, data); } diff --git a/clang/test/Driver/no-sibling-calls.c b/clang/test/Driver/foptimize-sibling-calls.c similarity index 69% rename from clang/test/Driver/no-sibling-calls.c rename to clang/test/Driver/foptimize-sibling-calls.c index c24899013f18d..3cb58ec8bca99 100644 --- a/clang/test/Driver/no-sibling-calls.c +++ b/clang/test/Driver/foptimize-sibling-calls.c @@ -1,8 +1,7 @@ // RUN: %clang -### %s -fno-optimize-sibling-calls 2> %t // RUN: FileCheck --check-prefix=CHECK-NOSC < %t %s -// CHECK-NOSC: "-mdisable-tail-calls" +// CHECK-NOSC: "-fno-optimize-sibling-calls" // RUN: %clang -### -foptimize-sibling-calls %s 2> %t // RUN: FileCheck --check-prefix=CHECK-OSC < %t %s -// CHECK-OSC-NOT: "-mdisable-tail-calls" - +// CHECK-OSC-NOT: "-fno-optimize-sibling-calls"