forked from OSchip/llvm-project
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
llvm-svn: 179092
This commit is contained in:
parent
69967c2835
commit
090301e009
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue