> 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 <[email protected]> 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 <[email protected]> >> 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 <[email protected]> >> 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 <[email protected]> wrote: >>> >>>> It should be Pawel who is doing that this release I think. =] >>>> >>>> On Tue, Nov 20, 2012 at 12:40 PM, Chad Rosier <[email protected]> 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 <[email protected]> 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 <[email protected]> >>>>>> 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 >>>>>>> [email protected] >>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >>>>> _______________________________________________ >>>>> cfe-commits mailing list >>>>> [email protected] >>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >>> >>> >> > > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
