From db68e5a1f239d7d6d2348fef7c492ee99a2b8bbc Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Tue, 9 Apr 2013 12:28:19 +0000 Subject: [PATCH] One more follow-up to r179082 - parse PIC/PIE arguments even on platfroms that force default PIC (like Darwin x86-64), otherwise specifying -fPIC will produce bogus unused argument warning git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179092 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/Tools.cpp | 27 ++++++++++++++------------- test/Driver/pic.c | 4 ++++ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index bf05285750..02ebc0448f 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1996,22 +1996,23 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, bool PIC = PIE || getToolChain().isPICDefault(); bool IsPICLevelTwo = PIC; + // For the PIC and PIE flag options, this logic is different from the + // legacy logic in very old versions of GCC, as that logic was just + // a bug no one had ever fixed. This logic is both more rational and + // consistent with GCC's new logic now that the bugs are fixed. The last + // argument relating to either PIC or PIE wins, and no other argument is + // used. If the last argument is any flavor of the '-fno-...' arguments, + // both PIC and PIE are disabled. Any PIE option implicitly enables PIC + // at the same level. + Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC, + options::OPT_fpic, options::OPT_fno_pic, + options::OPT_fPIE, options::OPT_fno_PIE, + options::OPT_fpie, options::OPT_fno_pie); // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness // is forced, then neither PIC nor PIE flags will have no effect. if (!getToolChain().isPICDefaultForced()) { - // For the PIC and PIE flag options, this logic is different from the - // legacy logic in very old versions of GCC, as that logic was just - // a bug no one had ever fixed. This logic is both more rational and - // consistent with GCC's new logic now that the bugs are fixed. The last - // argument relating to either PIC or PIE wins, and no other argument is - // used. If the last argument is any flavor of the '-fno-...' arguments, - // both PIC and PIE are disabled. Any PIE option implicitly enables PIC - // at the same level. - if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC, - options::OPT_fpic, options::OPT_fno_pic, - options::OPT_fPIE, options::OPT_fno_PIE, - options::OPT_fpie, options::OPT_fno_pie)) { - Option O = A->getOption(); + if (LastPICArg) { + Option O = LastPICArg->getOption(); if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) || O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) { PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie); diff --git a/test/Driver/pic.c b/test/Driver/pic.c index 8ba931954b..3faed2d18f 100644 --- a/test/Driver/pic.c +++ b/test/Driver/pic.c @@ -36,6 +36,8 @@ // // CHECK-NO-PIE-NOT: "-pie" // +// CHECK-NO-UNUSED-ARG-NOT: argument unused during compilation +// // RUN: %clang -c %s -target i386-unknown-unknown -### 2>&1 \ // RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC // RUN: %clang -c %s -target i386-unknown-unknown -fpic -### 2>&1 \ @@ -164,6 +166,8 @@ // RUN: | FileCheck %s --check-prefix=CHECK-PIC2 // RUN: %clang -c %s -target x86_64-apple-darwin -fPIE -### 2>&1 \ // RUN: | FileCheck %s --check-prefix=CHECK-PIC2 +// RUN: %clang -c %s -target x86_64-apple-darwin -fPIC -### 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-UNUSED-ARG // // Darwin gets even more special with '-mdynamic-no-pic'. This flag is only // valid on Darwin, and it's behavior is very strange but needs to remain -- 2.40.0