From d60b3cecb42968cd7389fca29c36393dc54e8088 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Mon, 3 Feb 2014 11:11:37 +0000 Subject: [PATCH] Fix handling of -fno-function-sections, -fno-data-sections in clang driver. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@200685 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/Tools.cpp | 11 ++++-- test/Driver/function-sections.c | 62 +++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 test/Driver/function-sections.c diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 10194b1dda..3a8a287757 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -2653,8 +2653,15 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-generate-type-units"); } - Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections); - Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections); + if (Args.hasFlag(options::OPT_ffunction_sections, + options::OPT_fno_function_sections, false)) { + CmdArgs.push_back("-ffunction-sections"); + } + + if (Args.hasFlag(options::OPT_fdata_sections, + options::OPT_fno_data_sections, false)) { + CmdArgs.push_back("-fdata-sections"); + } Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions); diff --git a/test/Driver/function-sections.c b/test/Driver/function-sections.c new file mode 100644 index 0000000000..fe6d303e3e --- /dev/null +++ b/test/Driver/function-sections.c @@ -0,0 +1,62 @@ +// Test handling of -f(no-)function-sections and -f(no-)data-sections +// +// CHECK-FS: -ffunction-sections +// CHECK-NOFS-NOT: -ffunction-sections +// CHECK-DS: -fdata-sections +// CHECK-NODS-NOT: -fdata-sections + +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: | FileCheck --check-prefix=CHECK-NOFS --check-prefix=CHECK-NODS %s + +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: -ffunction-sections \ +// RUN: | FileCheck --check-prefix=CHECK-FS %s + +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: -fno-function-sections \ +// RUN: | FileCheck --check-prefix=CHECK-NOFS %s + +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: -ffunction-sections -fno-function-sections \ +// RUN: | FileCheck --check-prefix=CHECK-NOFS %s + +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: -fno-function-sections -ffunction-sections \ +// RUN: | FileCheck --check-prefix=CHECK-FS %s + +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: -ffunction-sections -fno-function-sections -ffunction-sections \ +// RUN: | FileCheck --check-prefix=CHECK-FS %s + + +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: -fdata-sections \ +// RUN: | FileCheck --check-prefix=CHECK-DS %s + +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: -fno-data-sections \ +// RUN: | FileCheck --check-prefix=CHECK-NODS %s + +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: -fdata-sections -fno-data-sections \ +// RUN: | FileCheck --check-prefix=CHECK-NODS %s + +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: -fno-data-sections -fdata-sections \ +// RUN: | FileCheck --check-prefix=CHECK-DS %s + +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: -fdata-sections -fno-data-sections -fdata-sections \ +// RUN: | FileCheck --check-prefix=CHECK-DS %s + -- 2.40.0