diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 11 | ||||
-rw-r--r-- | clang/test/Driver/function-sections.c | 62 |
2 files changed, 71 insertions, 2 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 10194b1dda7..3a8a2877579 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/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/clang/test/Driver/function-sections.c b/clang/test/Driver/function-sections.c new file mode 100644 index 00000000000..fe6d303e3ec --- /dev/null +++ b/clang/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 + |