[cfe-commits] r168297 - in /cfe/trunk: include/clang/Basic/DiagnosticDriverKinds.td include/clang/Driver/ToolChain.h lib/Driver/ToolChains.cpp lib/Driver/ToolChains.h lib/Driver/Tools.cpp lib/Driver/WindowsToolChain.cpp test/Driver/pic.c

NAKAMURA Takumi geek4civic at gmail.com
Wed Nov 21 06:40:41 PST 2012


test/Driver/pic.c should follow r168297 in trunk, or it fails.

http://bb.pgr.jp/builders/clang-3stage-x86_64-linux/builds/1131

I have confirmed it works with "git cherry-pick r168297" again.

...Takumi

2012/11/21 32bitmicro <root at 32bitmicro.com>:
>
>> That's fine by me.
>>
>>  Chad
>
> Committed revision 168416
> Committed revision 168419
>
> r168297 did not merge cleanly and required pulling-in entire r168063.
> This is a non trivial change and needs to be reviewed.
>
> Pawel
>
>
>>
>>
>>
>> On Nov 20, 2012, at 7:05 PM, 32bitmicro <root at 32bitmicro.com> wrote:
>>
>>> Since branching there were other changes in these 2 files below.
>>> I am assuming you want all the revisions listed up to r168297.
>>> Just need a stamp :)
>>>
>>> Pawel
>>>
>>>
>>> cfe/lib/Driver/Tools.cpp
>>>
>>> r168217, r168168, r168063, r168024, r167846, r167799
>>>
>>> cfe/test/Driver/pic.c
>>> r167846
>>>
>>>
>>> Logs for changes between 3.2 branch and r168297.
>>>
>>>
>>> cfe/lib/Driver/Tools.cpp
>>>
>>> ------------------------------------------------------------------------
>>> r168217 | void | 2012-11-16 17:03:00 -0600 (Fri, 16 Nov 2012) | 1 line
>>>
>>> Revert r167799. It's not really correct, and it doesn't fix the problem
>>> that it
>>> was intended to fix.
>>> ------------------------------------------------------------------------
>>> r168168 | samsonov | 2012-11-16 06:53:14 -0600 (Fri, 16 Nov 2012) | 1 line
>>>
>>> UBSan: enable proper linking with UBsan runtime on Darwin. Turn on
>>> building ubsa
>>> n on OS X in 'make' build system. Patch by Jean-Daniel Dupas.
>>> ------------------------------------------------------------------------
>>> r168063 | fjahanian | 2012-11-15 13:02:45 -0600 (Thu, 15 Nov 2012) | 5 lines
>>>
>>> block extended signatur option. Change previous option
>>> to a cc1 -fencode-extended-block-signature and pass it
>>> to cc1 and recognize this option to produce extended block
>>> type signature. // rdar://12109031
>>>
>>> ------------------------------------------------------------------------
>>> r168024 | nicholas | 2012-11-14 23:36:36 -0600 (Wed, 14 Nov 2012) | 3 lines
>>>
>>> Revert r167567, restoring the ability of clang to run gcc in cases where it
>>> can't handle the input file type. This resulted in PR14338.
>>>
>>> r167846 | d0k | 2012-11-13 09:32:35 -0600 (Tue, 13 Nov 2012) | 9 lines
>>>
>>> This patch makes the behavior of clang consistent with the behavior of
>>> gcc 4.6 i
>>> n cases where both -fPIC and -fPIE is used.
>>>
>>> - Separately check if -fPIE was specified in the command line and define
>>> both __
>>> PIC__ and __PIE__ when -fPIE is used. We need to check this separately
>>> because -
>>> fPIE will infer -fPIC even if its not explicitly used.
>>> - Fixed existing tests.
>>> - Added new tests for cases where both -fPIC and -fPIE is used.
>>>
>>> Author: Tareq A. Siraj <tareq.a.siraj at intel.com>
>>> Fixes: PR13221
>>> Review: http://llvm-reviews.chandlerc.com/D94
>>>
>>> ------------------------------------------------------------------------
>>> r167799 | void | 2012-11-12 18:54:24 -0600 (Mon, 12 Nov 2012) | 6 lines
>>>
>>> Disable accelerator tables when compiling with LTO.
>>>
>>> LTO doesn't generate correct accelerator tables. This is due to the
>>> general lack
>>> correct of debug info for LTO. Disable it when using LTO.
>>> <rdar://problem/12401423>
>>>
>>>
>>>
>>>
>>> cfe/test/Driver/pic.c
>>>
>>> ------------------------------------------------------------------------
>>> r167846 | d0k | 2012-11-13 09:32:35 -0600 (Tue, 13 Nov 2012) | 9 lines
>>>
>>> This patch makes the behavior of clang consistent with the behavior of
>>> gcc 4.6 i
>>> n cases where both -fPIC and -fPIE is used.
>>>
>>> - Separately check if -fPIE was specified in the command line and define
>>> both __
>>> PIC__ and __PIE__ when -fPIE is used. We need to check this separately
>>> because -
>>> fPIE will infer -fPIC even if its not explicitly used.
>>> - Fixed existing tests.
>>> - Added new tests for cases where both -fPIC and -fPIE is used.
>>>
>>> Author: Tareq A. Siraj <tareq.a.siraj at intel.com>
>>> Fixes: PR13221
>>> Review: http://llvm-reviews.chandlerc.com/D94
>>>
>>>
>>>
>>>
>>>
>>> On 11/20/2012 3:55 PM, Chad Rosier wrote:
>>>> That works too! :)
>>>>
>>>>
>>>>
>>>> On Nov 20, 2012, at 5:30 PM, Chandler Carruth <chandlerc at gmail.com> wrote:
>>>>
>>>>> It should be Pawel who is doing that this release I think. =]
>>>>>
>>>>> On Tue, Nov 20, 2012 at 12:40 PM, Chad Rosier <mcrosier at apple.com> wrote:
>>>>>> Sounds good to me.  Bill, would you mind merging this to the branch?
>>>>>>
>>>>>> Chad
>>>>>>
>>>>>>
>>>>>> On Nov 20, 2012, at 5:39 AM, Chandler Carruth <chandlerc at gmail.com> wrote:
>>>>>>
>>>>>>> Chad, I suspect this should go into 3.2... Without it, ASan is often
>>>>>>> unable to link with PIE, and lots of other weird behavior is observed.
>>>>>>> The bad range of commits is pretty good, ever since the intel patch
>>>>>>> reworking this in the other direction.
>>>>>>>
>>>>>>> Pawel, Chad is the code owner for the driver.
>>>>>>>
>>>>>>> On Sun, Nov 18, 2012 at 7:52 PM, Chandler Carruth <chandlerc at gmail.com> wrote:
>>>>>>>> Author: chandlerc
>>>>>>>> Date: Sun Nov 18 21:52:03 2012
>>>>>>>> New Revision: 168297
>>>>>>>>
>>>>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=168297&view=rev
>>>>>>>> Log:
>>>>>>>> Completely re-work how the Clang driver interprets PIC and PIE options.
>>>>>>>>
>>>>>>>> There were numerous issues here that were all entangled, and so I've
>>>>>>>> tried to do a general simplification of the logic.
>>>>>>>> 1) The logic was mimicing actual GCC bugs, rather than "features". These
>>>>>>>> have been fixed in trunk GCC, and this fixes Clang as well. Notably,
>>>>>>>> the logic was always intended to be last-match-wins like any other
>>>>>>>> flag.
>>>>>>>> 2) The logic for handling '-mdynamic-no-pic' was preposterously unclear.
>>>>>>>> It also allowed the use of this flag on non-Darwin platforms where it
>>>>>>>> has no actual meaning. Now this option is handled directly based on
>>>>>>>> tests of how llvm-gcc behaves, and it is only supported on Darwin.
>>>>>>>> 3) The APIs for the Driver's ToolChains had the implementation ugliness
>>>>>>>> of dynamic-no-pic leaking through them. They also had the
>>>>>>>> implementation details of the LLVM relocation model flag names
>>>>>>>> leaking through.
>>>>>>>> 4) The actual results of passing these flags was incorrect on Darwin in
>>>>>>>> many cases. For example, Darwin *always* uses PIC level 2 if it uses
>>>>>>>> in PIC level, and Darwin *always* uses PIC on 64-bit regardless of
>>>>>>>> the flags specified, including -fPIE. Darwin never compiles in PIE
>>>>>>>> mode, but it can *link* in PIE mode.
>>>>>>>> 5) Also, PIC was not always being enabled even when PIE was. This isn't
>>>>>>>> a supported mode at all and may have caused some fallout in builds
>>>>>>>> with complex PIC and PIE interactions.
>>>>>>>>
>>>>>>>> The result is (I hope) cleaner and clearer for readers. I've also left
>>>>>>>> comments and tests about some of the truly strage behavior that is
>>>>>>>> observed on Darwin platforms. We have no real testing of Windows
>>>>>>>> platforms and PIC, but I don't have the tools handy to figure that out.
>>>>>>>> Hopefully others can beef up our testing here.
>>>>>>>>
>>>>>>>> Unfortunately, I can't test this for every platform. =/ If folks have
>>>>>>>> dependencies on these flags that aren't covered by tests, they may
>>>>>>>> break. I've audited and ensured that all the changes in behavior of the
>>>>>>>> existing tests are intentional and good. In particular I've tried to
>>>>>>>> make sure the Darwin behavior (which is more suprising than the Linux
>>>>>>>> behavior) also matches that of 'gcc' on my mac.
>>>>>>>>
>>>>>>>> Modified:
>>>>>>>>  cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
>>>>>>>>  cfe/trunk/include/clang/Driver/ToolChain.h
>>>>>>>>  cfe/trunk/lib/Driver/ToolChains.cpp
>>>>>>>>  cfe/trunk/lib/Driver/ToolChains.h
>>>>>>>>  cfe/trunk/lib/Driver/Tools.cpp
>>>>>>>>  cfe/trunk/lib/Driver/WindowsToolChain.cpp
>>>>>>>>  cfe/trunk/test/Driver/pic.c
>>>>>>>>
>>>>>>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
>>>>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=168297&r1=168296&r2=168297&view=diff
>>>>>>>> ==============================================================================
>>>>>>>> --- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original)
>>>>>>>> +++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Sun Nov 18 21:52:03 2012
>>>>>>>> @@ -11,6 +11,8 @@
>>>>>>>>
>>>>>>>> def err_drv_no_such_file : Error<"no such file or directory: '%0'">;
>>>>>>>> def err_drv_unsupported_opt : Error<"unsupported option '%0'">;
>>>>>>>> +def err_drv_unsupported_opt_for_target : Error<
>>>>>>>> +  "unsupported option '%0' for target '%1'">;
>>>>>>>> def err_drv_unsupported_option_argument : Error<
>>>>>>>> "unsupported argument '%1' to option '%0'">;
>>>>>>>> def err_drv_unknown_stdin_type : Error<
>>>>>>>>
>>>>>>>> Modified: cfe/trunk/include/clang/Driver/ToolChain.h
>>>>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ToolChain.h?rev=168297&r1=168296&r2=168297&view=diff
>>>>>>>> ==============================================================================
>>>>>>>> --- cfe/trunk/include/clang/Driver/ToolChain.h (original)
>>>>>>>> +++ cfe/trunk/include/clang/Driver/ToolChain.h Sun Nov 18 21:52:03 2012
>>>>>>>> @@ -176,14 +176,13 @@
>>>>>>>> /// by default.
>>>>>>>> virtual bool IsUnwindTablesDefault() const;
>>>>>>>>
>>>>>>>> -  /// GetDefaultRelocationModel - Return the LLVM name of the default
>>>>>>>> -  /// relocation model for this tool chain.
>>>>>>>> -  virtual const char *GetDefaultRelocationModel() const = 0;
>>>>>>>> -
>>>>>>>> -  /// GetForcedPicModel - Return the LLVM name of the forced PIC model
>>>>>>>> -  /// for this tool chain, or 0 if this tool chain does not force a
>>>>>>>> -  /// particular PIC mode.
>>>>>>>> -  virtual const char *GetForcedPicModel() const = 0;
>>>>>>>> +  /// \brief Test whether this toolchain defaults to PIC.
>>>>>>>> +  virtual bool isPICDefault() const = 0;
>>>>>>>> +
>>>>>>>> +  /// \brief Tests whether this toolchain forces its default for PIC or non-PIC.
>>>>>>>> +  /// If this returns true, any PIC related flags should be ignored and instead
>>>>>>>> +  /// the result of \c isPICDefault() is used exclusively.
>>>>>>>> +  virtual bool isPICDefaultForced() const = 0;
>>>>>>>>
>>>>>>>> /// SupportsProfiling - Does this tool chain support -pg.
>>>>>>>> virtual bool SupportsProfiling() const { return true; }
>>>>>>>>
>>>>>>>> Modified: cfe/trunk/lib/Driver/ToolChains.cpp
>>>>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=168297&r1=168296&r2=168297&view=diff
>>>>>>>> ==============================================================================
>>>>>>>> --- cfe/trunk/lib/Driver/ToolChains.cpp (original)
>>>>>>>> +++ cfe/trunk/lib/Driver/ToolChains.cpp Sun Nov 18 21:52:03 2012
>>>>>>>> @@ -886,14 +886,12 @@
>>>>>>>>         getTriple().getArch() == llvm::Triple::thumb);
>>>>>>>> }
>>>>>>>>
>>>>>>>> -const char *Darwin::GetDefaultRelocationModel() const {
>>>>>>>> -  return "pic";
>>>>>>>> +bool Darwin::isPICDefault() const {
>>>>>>>> +  return true;
>>>>>>>> }
>>>>>>>>
>>>>>>>> -const char *Darwin::GetForcedPicModel() const {
>>>>>>>> -  if (getArch() == llvm::Triple::x86_64)
>>>>>>>> -    return "pic";
>>>>>>>> -  return 0;
>>>>>>>> +bool Darwin::isPICDefaultForced() const {
>>>>>>>> +  return getArch() == llvm::Triple::x86_64;
>>>>>>>> }
>>>>>>>>
>>>>>>>> bool Darwin::SupportsProfiling() const {
>>>>>>>> @@ -1395,13 +1393,14 @@
>>>>>>>> return getArch() == llvm::Triple::x86_64;
>>>>>>>> }
>>>>>>>>
>>>>>>>> -const char *Generic_GCC::GetDefaultRelocationModel() const {
>>>>>>>> -  return "static";
>>>>>>>> +bool Generic_GCC::isPICDefault() const {
>>>>>>>> +  return false;
>>>>>>>> }
>>>>>>>>
>>>>>>>> -const char *Generic_GCC::GetForcedPicModel() const {
>>>>>>>> -  return 0;
>>>>>>>> +bool Generic_GCC::isPICDefaultForced() const {
>>>>>>>> +  return false;
>>>>>>>> }
>>>>>>>> +
>>>>>>>> /// Hexagon Toolchain
>>>>>>>>
>>>>>>>> Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple& Triple)
>>>>>>>> @@ -1455,14 +1454,13 @@
>>>>>>>> return *T;
>>>>>>>> }
>>>>>>>>
>>>>>>>> -const char *Hexagon_TC::GetDefaultRelocationModel() const {
>>>>>>>> -  return "static";
>>>>>>>> +bool Hexagon_TC::isPICDefault() const {
>>>>>>>> +  return false;
>>>>>>>> }
>>>>>>>>
>>>>>>>> -const char *Hexagon_TC::GetForcedPicModel() const {
>>>>>>>> -  return 0;
>>>>>>>> -} // End Hexagon
>>>>>>>> -
>>>>>>>> +bool Hexagon_TC::isPICDefaultForced() const {
>>>>>>>> +  return false;
>>>>>>>> +}
>>>>>>>>
>>>>>>>> /// TCEToolChain - A tool chain using the llvm bitcode tools to perform
>>>>>>>> /// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
>>>>>>>> @@ -1487,12 +1485,12 @@
>>>>>>>> return true;
>>>>>>>> }
>>>>>>>>
>>>>>>>> -const char *TCEToolChain::GetDefaultRelocationModel() const {
>>>>>>>> -  return "static";
>>>>>>>> +bool TCEToolChain::isPICDefault() const {
>>>>>>>> +  return false;
>>>>>>>> }
>>>>>>>>
>>>>>>>> -const char *TCEToolChain::GetForcedPicModel() const {
>>>>>>>> -  return 0;
>>>>>>>> +bool TCEToolChain::isPICDefaultForced() const {
>>>>>>>> +  return false;
>>>>>>>> }
>>>>>>>>
>>>>>>>> Tool &TCEToolChain::SelectTool(const Compilation &C,
>>>>>>>>
>>>>>>>> Modified: cfe/trunk/lib/Driver/ToolChains.h
>>>>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=168297&r1=168296&r2=168297&view=diff
>>>>>>>> ==============================================================================
>>>>>>>> --- cfe/trunk/lib/Driver/ToolChains.h (original)
>>>>>>>> +++ cfe/trunk/lib/Driver/ToolChains.h Sun Nov 18 21:52:03 2012
>>>>>>>> @@ -129,8 +129,8 @@
>>>>>>>>                          const ActionList &Inputs) const;
>>>>>>>>
>>>>>>>> virtual bool IsUnwindTablesDefault() const;
>>>>>>>> -  virtual const char *GetDefaultRelocationModel() const;
>>>>>>>> -  virtual const char *GetForcedPicModel() const;
>>>>>>>> +  virtual bool isPICDefault() const;
>>>>>>>> +  virtual bool isPICDefaultForced() const;
>>>>>>>>
>>>>>>>> protected:
>>>>>>>> /// \name ToolChain Implementation Helper Functions
>>>>>>>> @@ -156,8 +156,8 @@
>>>>>>>> virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
>>>>>>>>                          const ActionList &Inputs) const;
>>>>>>>>
>>>>>>>> -  virtual const char *GetDefaultRelocationModel() const;
>>>>>>>> -  virtual const char *GetForcedPicModel() const;
>>>>>>>> +  virtual bool isPICDefault() const;
>>>>>>>> +  virtual bool isPICDefaultForced() const;
>>>>>>>> };
>>>>>>>>
>>>>>>>> /// Darwin - The base Darwin tool chain.
>>>>>>>> @@ -344,8 +344,8 @@
>>>>>>>> virtual RuntimeLibType GetDefaultRuntimeLibType() const {
>>>>>>>>   return ToolChain::RLT_CompilerRT;
>>>>>>>> }
>>>>>>>> -  virtual const char *GetDefaultRelocationModel() const;
>>>>>>>> -  virtual const char *GetForcedPicModel() const;
>>>>>>>> +  virtual bool isPICDefault() const;
>>>>>>>> +  virtual bool isPICDefaultForced() const;
>>>>>>>>
>>>>>>>> virtual bool SupportsProfiling() const;
>>>>>>>>
>>>>>>>> @@ -393,7 +393,7 @@
>>>>>>>> std::string ComputeEffectiveClangTriple(const ArgList &Args,
>>>>>>>>                                         types::ID InputType) const;
>>>>>>>>
>>>>>>>> -  virtual const char *GetDefaultRelocationModel() const { return "pic"; }
>>>>>>>> +  virtual bool isPICDefault() const { return false; };
>>>>>>>> };
>>>>>>>>
>>>>>>>> class LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC {
>>>>>>>> @@ -534,8 +534,8 @@
>>>>>>>> virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
>>>>>>>>                          const ActionList &Inputs) const;
>>>>>>>> bool IsMathErrnoDefault() const;
>>>>>>>> -  const char* GetDefaultRelocationModel() const;
>>>>>>>> -  const char* GetForcedPicModel() const;
>>>>>>>> +  bool isPICDefault() const;
>>>>>>>> +  bool isPICDefaultForced() const;
>>>>>>>>
>>>>>>>> private:
>>>>>>>> mutable llvm::DenseMap<unsigned, Tool*> Tools;
>>>>>>>> @@ -557,8 +557,8 @@
>>>>>>>>
>>>>>>>> virtual bool IsIntegratedAssemblerDefault() const;
>>>>>>>> virtual bool IsUnwindTablesDefault() const;
>>>>>>>> -  virtual const char *GetDefaultRelocationModel() const;
>>>>>>>> -  virtual const char *GetForcedPicModel() const;
>>>>>>>> +  virtual bool isPICDefault() const;
>>>>>>>> +  virtual bool isPICDefaultForced() const;
>>>>>>>>
>>>>>>>> virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs,
>>>>>>>>                                        ArgStringList &CC1Args) const;
>>>>>>>>
>>>>>>>> Modified: cfe/trunk/lib/Driver/Tools.cpp
>>>>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=168297&r1=168296&r2=168297&view=diff
>>>>>>>> ==============================================================================
>>>>>>>> --- cfe/trunk/lib/Driver/Tools.cpp (original)
>>>>>>>> +++ cfe/trunk/lib/Driver/Tools.cpp Sun Nov 18 21:52:03 2012
>>>>>>>> @@ -1769,38 +1769,46 @@
>>>>>>>>
>>>>>>>> CheckCodeGenerationOptions(D, Args);
>>>>>>>>
>>>>>>>> -  // Perform argument translation for LLVM backend. This
>>>>>>>> -  // takes some care in reconciling with llvm-gcc. The
>>>>>>>> -  // issue is that llvm-gcc translates these options based on
>>>>>>>> -  // the values in cc1, whereas we are processing based on
>>>>>>>> -  // the driver arguments.
>>>>>>>> -
>>>>>>>> -  // This comes from the default translation the driver + cc1
>>>>>>>> -  // would do to enable flag_pic.
>>>>>>>> -
>>>>>>>> -  Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
>>>>>>>> -                                    options::OPT_fpic, options::OPT_fno_pic);
>>>>>>>> -  // We need to check for PIE flags separately because they can override the
>>>>>>>> -  // PIC flags.
>>>>>>>> -  Arg *LastPIEArg = Args.getLastArg(options::OPT_fPIE, options::OPT_fno_PIE,
>>>>>>>> -                                    options::OPT_fpie, options::OPT_fno_pie);
>>>>>>>> -  bool PICDisabled = false;
>>>>>>>> -  bool PICEnabled = false;
>>>>>>>> -  bool PICForPIE = false;
>>>>>>>> -  if (LastPIEArg) {
>>>>>>>> -    PICForPIE = (LastPIEArg->getOption().matches(options::OPT_fPIE) ||
>>>>>>>> -                 LastPIEArg->getOption().matches(options::OPT_fpie));
>>>>>>>> -  }
>>>>>>>> -  if (LastPICArg || PICForPIE) {
>>>>>>>> -    // The last PIE enabled argument can infer that PIC is enabled.
>>>>>>>> -    PICEnabled = (PICForPIE ||
>>>>>>>> -                  LastPICArg->getOption().matches(options::OPT_fPIC) ||
>>>>>>>> -                  LastPICArg->getOption().matches(options::OPT_fpic));
>>>>>>>> -    // We need to have PICDisabled inside the if statement because on darwin
>>>>>>>> -    // PIC is enabled by default even if PIC arguments are not in the command
>>>>>>>> -    // line (in this case causes PICDisabled to be true).
>>>>>>>> -    PICDisabled = !PICEnabled;
>>>>>>>> +  // 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.
>>>>>>>> +  bool PIE = false;
>>>>>>>> +  bool PIC = getToolChain().isPICDefault();
>>>>>>>> +  bool IsPICLevelTwo = PIC;
>>>>>>>> +  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 (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);
>>>>>>>> +      PIC = PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
>>>>>>>> +      IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
>>>>>>>> +                      O.matches(options::OPT_fPIC);
>>>>>>>> +    } else {
>>>>>>>> +      PIE = PIC = false;
>>>>>>>> +    }
>>>>>>>> }
>>>>>>>> +  // 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()) {
>>>>>>>> +    PIE = false;
>>>>>>>> +    PIC = getToolChain().isPICDefault();
>>>>>>>> +    IsPICLevelTwo = PIC;
>>>>>>>> +  }
>>>>>>>> +
>>>>>>>> +  // Inroduce a Darwin-specific hack. If the default is PIC but the flags
>>>>>>>> +  // specified while enabling PIC enabled level 1 PIC, just force it back to
>>>>>>>> +  // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
>>>>>>>> +  // informal testing).
>>>>>>>> +  if (PIC && getToolChain().getTriple().isOSDarwin())
>>>>>>>> +    IsPICLevelTwo |= getToolChain().isPICDefault();
>>>>>>>> +
>>>>>>>> // Note that these flags are trump-cards. Regardless of the order w.r.t. the
>>>>>>>> // PIC or PIE options above, if these show up, PIC is disabled.
>>>>>>>> llvm::Triple Triple(TripleStr);
>>>>>>>> @@ -1808,44 +1816,43 @@
>>>>>>>>      Args.hasArg(options::OPT_fapple_kext)) &&
>>>>>>>>     (Triple.getOS() != llvm::Triple::IOS ||
>>>>>>>>      Triple.isOSVersionLT(6)))
>>>>>>>> -    PICDisabled = true;
>>>>>>>> +    PIC = PIE = false;
>>>>>>>> if (Args.hasArg(options::OPT_static))
>>>>>>>> -    PICDisabled = true;
>>>>>>>> -  bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
>>>>>>>> +    PIC = PIE = false;
>>>>>>>> +
>>>>>>>> +  if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
>>>>>>>> +    // This is a very special mode. It trumps the other modes, almost no one
>>>>>>>> +    // uses it, and it isn't even valid on any OS but Darwin.
>>>>>>>> +    if (!getToolChain().getTriple().isOSDarwin())
>>>>>>>> +      D.Diag(diag::err_drv_unsupported_opt_for_target)
>>>>>>>> +        << A->getSpelling() << getToolChain().getTriple().str();
>>>>>>>> +
>>>>>>>> +    // FIXME: Warn when this flag trumps some other PIC or PIE flag.
>>>>>>>>
>>>>>>>> -  // Select the relocation model.
>>>>>>>> -  const char *Model = getToolChain().GetForcedPicModel();
>>>>>>>> -  if (!Model) {
>>>>>>>> -    if (DynamicNoPIC)
>>>>>>>> -      Model = "dynamic-no-pic";
>>>>>>>> -    else if (PICDisabled)
>>>>>>>> -      Model = "static";
>>>>>>>> -    else if (PICEnabled)
>>>>>>>> -      Model = "pic";
>>>>>>>> -    else
>>>>>>>> -      Model = getToolChain().GetDefaultRelocationModel();
>>>>>>>> -  }
>>>>>>>> -  StringRef ModelStr = Model ? Model : "";
>>>>>>>> -  if (Model && ModelStr != "pic") {
>>>>>>>>   CmdArgs.push_back("-mrelocation-model");
>>>>>>>> -    CmdArgs.push_back(Model);
>>>>>>>> -  }
>>>>>>>> +    CmdArgs.push_back("dynamic-no-pic");
>>>>>>>>
>>>>>>>> -  // Infer the __PIC__ and __PIE__ values.
>>>>>>>> -  if (ModelStr == "pic" && PICForPIE) {
>>>>>>>> -    CmdArgs.push_back("-pic-level");
>>>>>>>> -    CmdArgs.push_back((LastPIEArg &&
>>>>>>>> -                      LastPIEArg->getOption().matches(options::OPT_fPIE)) ?
>>>>>>>> -                      "2" : "1");
>>>>>>>> -    CmdArgs.push_back("-pie-level");
>>>>>>>> -    CmdArgs.push_back((LastPIEArg &&
>>>>>>>> -                       LastPIEArg->getOption().matches(options::OPT_fPIE)) ?
>>>>>>>> -                      "2" : "1");
>>>>>>>> -  } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
>>>>>>>> -    CmdArgs.push_back("-pic-level");
>>>>>>>> -    CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
>>>>>>>> -                        LastPICArg->getOption().matches(options::OPT_fPIC)) ||
>>>>>>>> -                       getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
>>>>>>>> +    // Only a forced PIC mode can cause the actual compile to have PIC defines
>>>>>>>> +    // etc., no flags are sufficient. This behavior was selected to closely
>>>>>>>> +    // match that of llvm-gcc and Apple GCC before that.
>>>>>>>> +    if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
>>>>>>>> +      CmdArgs.push_back("-pic-level");
>>>>>>>> +      CmdArgs.push_back("2");
>>>>>>>> +    }
>>>>>>>> +  } else {
>>>>>>>> +    // Currently, LLVM only knows about PIC vs. static; the PIE differences are
>>>>>>>> +    // handled in Clang's IRGen by the -pie-level flag.
>>>>>>>> +    CmdArgs.push_back("-mrelocation-model");
>>>>>>>> +    CmdArgs.push_back(PIC ? "pic" : "static");
>>>>>>>> +
>>>>>>>> +    if (PIC) {
>>>>>>>> +      CmdArgs.push_back("-pic-level");
>>>>>>>> +      CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
>>>>>>>> +      if (PIE) {
>>>>>>>> +        CmdArgs.push_back("-pie-level");
>>>>>>>> +        CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
>>>>>>>> +      }
>>>>>>>> +    }
>>>>>>>> }
>>>>>>>>
>>>>>>>> if (!Args.hasFlag(options::OPT_fmerge_all_constants,
>>>>>>>>
>>>>>>>> Modified: cfe/trunk/lib/Driver/WindowsToolChain.cpp
>>>>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/WindowsToolChain.cpp?rev=168297&r1=168296&r2=168297&view=diff
>>>>>>>> ==============================================================================
>>>>>>>> --- cfe/trunk/lib/Driver/WindowsToolChain.cpp (original)
>>>>>>>> +++ cfe/trunk/lib/Driver/WindowsToolChain.cpp Sun Nov 18 21:52:03 2012
>>>>>>>> @@ -84,14 +84,12 @@
>>>>>>>> return getArch() == llvm::Triple::x86_64;
>>>>>>>> }
>>>>>>>>
>>>>>>>> -const char *Windows::GetDefaultRelocationModel() const {
>>>>>>>> -  return "static";
>>>>>>>> +bool Windows::isPICDefault() const {
>>>>>>>> +  return getArch() == llvm::Triple::x86_64;
>>>>>>>> }
>>>>>>>>
>>>>>>>> -const char *Windows::GetForcedPicModel() const {
>>>>>>>> -  if (getArch() == llvm::Triple::x86_64)
>>>>>>>> -    return "pic";
>>>>>>>> -  return 0;
>>>>>>>> +bool Windows::isPICDefaultForced() const {
>>>>>>>> +  return getArch() == llvm::Triple::x86_64;
>>>>>>>> }
>>>>>>>>
>>>>>>>> // FIXME: This probably should goto to some platform utils place.
>>>>>>>>
>>>>>>>> Modified: cfe/trunk/test/Driver/pic.c
>>>>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/pic.c?rev=168297&r1=168296&r2=168297&view=diff
>>>>>>>> ==============================================================================
>>>>>>>> --- cfe/trunk/test/Driver/pic.c (original)
>>>>>>>> +++ cfe/trunk/test/Driver/pic.c Sun Nov 18 21:52:03 2012
>>>>>>>> @@ -5,28 +5,34 @@
>>>>>>>> // CHECK-NO-PIC-NOT: "-pic-level"
>>>>>>>> // CHECK-NO-PIC-NOT: "-pie-level"
>>>>>>>> //
>>>>>>>> -// CHECK-DYNAMIC-NO-PIC1: "-mrelocation-model" "dynamic-no-pic"
>>>>>>>> -// CHECK-DYNAMIC-NO-PIC1: "-pic-level" "1"
>>>>>>>> -//
>>>>>>>> -// CHECK-DYNAMIC-NO-PIC2: "-mrelocation-model" "dynamic-no-pic"
>>>>>>>> -// CHECK-DYNAMIC-NO-PIC2: "-pic-level" "2"
>>>>>>>> -//
>>>>>>>> -// CHECK-PIC1-NOT: "-mrelocation-model"
>>>>>>>> +// CHECK-PIC1: "-mrelocation-model" "pic"
>>>>>>>> // CHECK-PIC1: "-pic-level" "1"
>>>>>>>> //
>>>>>>>> -// CHECK-PIC2-NOT: "-mrelocation-model"
>>>>>>>> +// CHECK-PIC2: "-mrelocation-model" "pic"
>>>>>>>> // CHECK-PIC2: "-pic-level" "2"
>>>>>>>> //
>>>>>>>> -// CHECK-PIE1-NOT: "-mrelocation-model"
>>>>>>>> +// CHECK-PIE1: "-mrelocation-model" "pic"
>>>>>>>> +// CHECK-PIE1: "-pic-level" "1"
>>>>>>>> // CHECK-PIE1: "-pie-level" "1"
>>>>>>>> //
>>>>>>>> -// CHECK-PIE2-NOT: "-mrelocation-model"
>>>>>>>> +// CHECK-PIE2: "-mrelocation-model" "pic"
>>>>>>>> +// CHECK-PIE2: "-pic-level" "2"
>>>>>>>> // CHECK-PIE2: "-pie-level" "2"
>>>>>>>> //
>>>>>>>> -// CHECK-PIE3: "{{.*}}ld{{(.exe)?}}"
>>>>>>>> -// CHECK-PIE3: "-pie"
>>>>>>>> -// CHECK-PIE3: "Scrt1.o" "crti.o" "crtbeginS.o"
>>>>>>>> -// CHECK-PIE3: "crtendS.o" "crtn.o"
>>>>>>>> +// CHECK-PIE-LD: "{{.*}}ld{{(.exe)?}}"
>>>>>>>> +// CHECK-PIE-LD: "-pie"
>>>>>>>> +// CHECK-PIE-LD: "Scrt1.o" "crti.o" "crtbeginS.o"
>>>>>>>> +// CHECK-PIE-LD: "crtendS.o" "crtn.o"
>>>>>>>> +//
>>>>>>>> +// CHECK-DYNAMIC-NO-PIC-32: "-mrelocation-model" "dynamic-no-pic"
>>>>>>>> +// CHECK-DYNAMIC-NO-PIC-32-NOT: "-pic-level"
>>>>>>>> +// CHECK-DYNAMIC-NO-PIC-32-NOT: "-pie-level"
>>>>>>>> +//
>>>>>>>> +// CHECK-DYNAMIC-NO-PIC-64: "-mrelocation-model" "dynamic-no-pic"
>>>>>>>> +// CHECK-DYNAMIC-NO-PIC-64: "-pic-level" "2"
>>>>>>>> +// CHECK-DYNAMIC-NO-PIC-64-NOT: "-pie-level"
>>>>>>>> +//
>>>>>>>> +// CHECK-NON-DARWIN-DYNAMIC-NO-PIC: error: unsupported option '-mdynamic-no-pic' for target 'i386-unknown-unknown'
>>>>>>>> //
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> @@ -38,107 +44,141 @@
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIE1
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -fPIE -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIE2
>>>>>>>> +//
>>>>>>>> +// Check that PIC and PIE flags obey last-match-wins. If the last flag is
>>>>>>>> +// a no-* variant, regardless of which variant or which flags precede it, we
>>>>>>>> +// get no PIC.
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -fpic -fno-pic -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fno-PIC -### 2>&1 \
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fno-pic -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fpie -fno-pic -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fno-pic -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -fpic -fno-PIC -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fno-pic -### 2>&1 \
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fno-PIC -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fpie -fno-PIC -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fno-PIC -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fno-pie -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fno-pie -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -fpie -fno-pie -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fno-PIE -### 2>&1 \
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fno-pie -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fno-PIE -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fno-PIE -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -fpie -fno-PIE -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fno-pie -### 2>&1 \
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fno-PIE -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpie -fno-pic -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIC1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpie -fno-pic -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIE1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fno-pie -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIC1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fPIC -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fpic -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIC1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fPIE -fpie -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIE1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpie -fPIC -fPIE -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIE2
>>>>>>>> //
>>>>>>>> -// Cases where both pic and pie are specified
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fpie -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIC1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fpie -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIE1
>>>>>>>> +// Last-match-wins where both pic and pie are specified.
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -fpie -fpic -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIC1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpie -fpic -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIE1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fPIE -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fPIE -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIE2
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpie -fPIC -### 2>&1 \
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fpic -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIC1
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -fpie -fPIC -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIE1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpie -fPIE -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fpie -fPIE -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIE2
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fpie -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIC1
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fPIC -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fpie -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIE1
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fpie -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIE1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fPIE -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fPIE -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIE2
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fPIE -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIE2
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fpic -### 2>&1 \
>>>>>>>> +//
>>>>>>>> +// Last-match-wins when selecting level 1 vs. level 2.
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fPIC -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fpic -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIE2
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fpie -### 2>&1 \
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fPIC -fpic -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIC1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fpie -### 2>&1 \
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fpic -fPIE -fpie -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIE1
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fPIC -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -fPIE -fPIC -### 2>&1 \
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -fpie -fPIC -fPIE -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIE2
>>>>>>>> //
>>>>>>>> -// Defaults change for Darwin.
>>>>>>>> -// RUN: %clang -c %s -target i386-apple-darwin -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> -// RUN: %clang -c %s -target i386-apple-darwin -fno-pic -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> -// RUN: %clang -c %s -target i386-apple-darwin -fno-PIC -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> -//
>>>>>>>> // Make sure -pie is passed to along to ld and that the right *crt* files
>>>>>>>> // are linked in.
>>>>>>>> // RUN: %clang %s -target i386-unknown-freebsd -fPIE -pie -### \
>>>>>>>> // RUN: --sysroot=%S/Inputs/basic_freebsd_tree 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIE3
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIE-LD
>>>>>>>> // RUN: %clang %s -target i386-linux-gnu -fPIE -pie -### \
>>>>>>>> // RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-PIE3
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIE-LD
>>>>>>>> +// RUN: %clang %s -target i386-linux-gnu -fPIC -pie -### \
>>>>>>>> +// RUN: --sysroot=%S/Inputs/basic_linux_tree 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIE-LD
>>>>>>>> //
>>>>>>>> // Disregard any of the PIC-specific flags if we have a trump-card flag.
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -mkernel -fPIC -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> // RUN: %clang -c %s -target i386-unknown-unknown -static -fPIC -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> -// RUN: %clang -c %s -target i386-unknown-unknown -mdynamic-no-pic -fPIC -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC1
>>>>>>>> -// RUN: %clang -c %s -target i386-apple-darwin -mdynamic-no-pic -fPIC -### 2>&1 \
>>>>>>>> -// RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC2
>>>>>>>> -
>>>>>>>> -// Checks for ARM
>>>>>>>> +//
>>>>>>>> +// Darwin is a beautiful and unique snowflake when it comes to these flags.
>>>>>>>> +// When targetting a 32-bit darwin system, the -fno-* flag variants work and
>>>>>>>> +// disable PIC, but any other flag enables PIC (*not* PIE) even if the flag
>>>>>>>> +// specifies PIE. On 64-bit targets, there is simply nothing you can do, there
>>>>>>>> +// is no PIE, there is only PIC when it comes to compilation.
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -fpic -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -fPIC -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -fpie -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -fPIE -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -fno-PIC -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -fno-PIE -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-NO-PIC
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -fno-PIC -fpic -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -fno-PIC -fPIE -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> +// RUN: %clang -c %s -target x86_64-apple-darwin -fno-PIC -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> +// RUN: %clang -c %s -target x86_64-apple-darwin -fno-PIE -### 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-PIC2
>>>>>>>> +// RUN: %clang -c %s -target x86_64-apple-darwin -fPIE -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> +//
>>>>>>>> +// 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
>>>>>>>> +// consistent for compatibility.
>>>>>>>> +// RUN: %clang -c %s -target i386-unknown-unknown -mdynamic-no-pic -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-NON-DARWIN-DYNAMIC-NO-PIC
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -mdynamic-no-pic -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-32
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -mdynamic-no-pic -fno-pic -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-32
>>>>>>>> +// RUN: %clang -c %s -target i386-apple-darwin -mdynamic-no-pic -fpie -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-32
>>>>>>>> +// RUN: %clang -c %s -target x86_64-apple-darwin -mdynamic-no-pic -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-64
>>>>>>>> +// RUN: %clang -c %s -target x86_64-apple-darwin -mdynamic-no-pic -fno-pic -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-64
>>>>>>>> +// RUN: %clang -c %s -target x86_64-apple-darwin -mdynamic-no-pic -fpie -### 2>&1 \
>>>>>>>> +// RUN:   | FileCheck %s --check-prefix=CHECK-DYNAMIC-NO-PIC-64
>>>>>>>> +//
>>>>>>>> +// Checks for ARM+Apple+IOS including -fapple-kext, -mkernel, and iphoneos
>>>>>>>> +// version boundaries.
>>>>>>>> // RUN: %clang -c %s -target armv7-apple-ios -fapple-kext -miphoneos-version-min=6.0.0 -### 2>&1 \
>>>>>>>> // RUN:   | FileCheck %s --check-prefix=CHECK-PIC2
>>>>>>>> // RUN: %clang -c %s -target armv7-apple-ios -mkernel -miphoneos-version-min=6.0.0 -### 2>&1 \
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> cfe-commits mailing list
>>>>>>>> cfe-commits at cs.uiuc.edu
>>>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>>>> _______________________________________________
>>>>>> cfe-commits mailing list
>>>>>> cfe-commits at cs.uiuc.edu
>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>>
>>>>
>>>
>>
>>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list