This change breaks darwin fat binary support. > ./bin/clang++ ~/dev/scratch/hello_world.cpp -arch armv7 -arch armv7s > -isysroot > /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/ fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: /var/folders/pb/95pc7qfx2xl9kr9kg0gg_9cc0000gn/T/hello_world-1b17ac.out and /var/folders/pb/95pc7qfx2xl9kr9kg0gg_9cc0000gn/T/hello_world-1b17ac.out have the same architectures (armv7) and can't be in the same fat output file clang-3.9: error: lipo command failed with exit code 1 (use -v to see invocation)
Can someone more familiar with this code please take a look? Thanks, -Chris > On Jan 14, 2016, at 1:41 PM, Justin Lebar via cfe-commits > <cfe-commits@lists.llvm.org> wrote: > > Author: jlebar > Date: Thu Jan 14 15:41:21 2016 > New Revision: 257808 > > URL: http://llvm.org/viewvc/llvm-project?rev=257808&view=rev > Log: > Don't build jobs for the same Action + ToolChain twice. > > Summary: > Right now if the Action graph is a DAG and we encounter an action twice, > we will run it twice. > > This patch is difficult to test as-is, but I have testcases for this as > used within CUDA compilation. > > Reviewers: > > Subscribers: > > Modified: > cfe/trunk/include/clang/Driver/Driver.h > cfe/trunk/lib/Driver/Driver.cpp > > Modified: cfe/trunk/include/clang/Driver/Driver.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Driver.h?rev=257808&r1=257807&r2=257808&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Driver/Driver.h (original) > +++ cfe/trunk/include/clang/Driver/Driver.h Thu Jan 14 15:41:21 2016 > @@ -21,6 +21,7 @@ > #include "llvm/Support/Path.h" // FIXME: Kill when CompilationInfo lands. > > #include <list> > +#include <map> > #include <memory> > #include <set> > #include <string> > @@ -381,10 +382,13 @@ public: > > /// BuildJobsForAction - Construct the jobs to perform for the > /// action \p A and return an InputInfo for the result of running \p A. > + /// Will only construct jobs for a given (Action, ToolChain) pair once. > InputInfo BuildJobsForAction(Compilation &C, const Action *A, > const ToolChain *TC, const char *BoundArch, > bool AtTopLevel, bool MultipleArchs, > - const char *LinkingOutput) const; > + const char *LinkingOutput, > + std::map<std::pair<const Action *, > std::string>, > + InputInfo> &CachedResults) const; > > /// Returns the default name for linked images (e.g., "a.out"). > const char *getDefaultImageName() const; > @@ -441,6 +445,16 @@ private: > /// the driver mode. > std::pair<unsigned, unsigned> getIncludeExcludeOptionFlagMasks() const; > > + /// Helper used in BuildJobsForAction. Doesn't use the cache when building > + /// jobs specifically for the given action, but will use the cache when > + /// building jobs for the Action's inputs. > + InputInfo BuildJobsForActionNoCache( > + Compilation &C, const Action *A, const ToolChain *TC, > + const char *BoundArch, bool AtTopLevel, bool MultipleArchs, > + const char *LinkingOutput, > + std::map<std::pair<const Action *, std::string>, InputInfo> > + &CachedResults) const; > + > public: > /// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and > /// return the grouped values as integers. Numbers which are not > > Modified: cfe/trunk/lib/Driver/Driver.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=257808&r1=257807&r2=257808&view=diff > ============================================================================== > --- cfe/trunk/lib/Driver/Driver.cpp (original) > +++ cfe/trunk/lib/Driver/Driver.cpp Thu Jan 14 15:41:21 2016 > @@ -1632,6 +1632,8 @@ void Driver::BuildJobs(Compilation &C) c > if (A->getOption().matches(options::OPT_arch)) > ArchNames.insert(A->getValue()); > > + // Set of (Action, canonical ToolChain triple) pairs we've built jobs for. > + std::map<std::pair<const Action *, std::string>, InputInfo> CachedResults; > for (Action *A : C.getActions()) { > // If we are linking an image for multiple archs then the linker wants > // -arch_multiple and -final_output <final image name>. Unfortunately, > this > @@ -1651,7 +1653,7 @@ void Driver::BuildJobs(Compilation &C) c > /*BoundArch*/ nullptr, > /*AtTopLevel*/ true, > /*MultipleArchs*/ ArchNames.size() > 1, > - /*LinkingOutput*/ LinkingOutput); > + /*LinkingOutput*/ LinkingOutput, CachedResults); > } > > // If the user passed -Qunused-arguments or there were errors, don't warn > @@ -1779,19 +1781,38 @@ static const Tool *selectToolForJob(Comp > return ToolForJob; > } > > -InputInfo Driver::BuildJobsForAction(Compilation &C, const Action *A, > - const ToolChain *TC, const char > *BoundArch, > - bool AtTopLevel, bool MultipleArchs, > - const char *LinkingOutput) const { > +InputInfo Driver::BuildJobsForAction( > + Compilation &C, const Action *A, const ToolChain *TC, const char > *BoundArch, > + bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput, > + std::map<std::pair<const Action *, std::string>, InputInfo> > &CachedResults) > + const { > + std::pair<const Action *, std::string> ActionTC = { > + A, TC->getTriple().normalize()}; > + auto CachedResult = CachedResults.find(ActionTC); > + if (CachedResult != CachedResults.end()) { > + return CachedResult->second; > + } > + InputInfo Result = > + BuildJobsForActionNoCache(C, A, TC, BoundArch, AtTopLevel, > MultipleArchs, > + LinkingOutput, CachedResults); > + CachedResults[ActionTC] = Result; > + return Result; > +} > + > +InputInfo Driver::BuildJobsForActionNoCache( > + Compilation &C, const Action *A, const ToolChain *TC, const char > *BoundArch, > + bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput, > + std::map<std::pair<const Action *, std::string>, InputInfo> > &CachedResults) > + const { > llvm::PrettyStackTraceString CrashInfo("Building compilation jobs"); > > InputInfoList CudaDeviceInputInfos; > if (const CudaHostAction *CHA = dyn_cast<CudaHostAction>(A)) { > // Append outputs of device jobs to the input list. > for (const Action *DA : CHA->getDeviceActions()) { > - CudaDeviceInputInfos.push_back( > - BuildJobsForAction(C, DA, TC, nullptr, AtTopLevel, > - /*MultipleArchs*/ false, LinkingOutput)); > + CudaDeviceInputInfos.push_back(BuildJobsForAction( > + C, DA, TC, nullptr, AtTopLevel, > + /*MultipleArchs*/ false, LinkingOutput, CachedResults)); > } > // Override current action with a real host compile action and continue > // processing it. > @@ -1822,7 +1843,7 @@ InputInfo Driver::BuildJobsForAction(Com > TC = &C.getDefaultToolChain(); > > return BuildJobsForAction(C, *BAA->begin(), TC, ArchName, AtTopLevel, > - MultipleArchs, LinkingOutput); > + MultipleArchs, LinkingOutput, CachedResults); > } > > if (const CudaDeviceAction *CDA = dyn_cast<CudaDeviceAction>(A)) { > @@ -1831,7 +1852,8 @@ InputInfo Driver::BuildJobsForAction(Com > assert(CDA->getGpuArchName() && "No GPU name in device action."); > return BuildJobsForAction(C, *CDA->begin(), C.getCudaDeviceToolChain(), > CDA->getGpuArchName(), CDA->isAtTopLevel(), > - /*MultipleArchs*/ true, LinkingOutput); > + /*MultipleArchs*/ true, LinkingOutput, > + CachedResults); > } > > const ActionList *Inputs = &A->getInputs(); > @@ -1847,9 +1869,9 @@ InputInfo Driver::BuildJobsForAction(Com > // need to build jobs for device-side inputs it may have held. > if (CollapsedCHA) { > for (const Action *DA : CollapsedCHA->getDeviceActions()) { > - CudaDeviceInputInfos.push_back( > - BuildJobsForAction(C, DA, TC, "", AtTopLevel, > - /*MultipleArchs*/ false, LinkingOutput)); > + CudaDeviceInputInfos.push_back(BuildJobsForAction( > + C, DA, TC, "", AtTopLevel, > + /*MultipleArchs*/ false, LinkingOutput, CachedResults)); > } > } > > @@ -1863,7 +1885,7 @@ InputInfo Driver::BuildJobsForAction(Com > AtTopLevel && (isa<DsymutilJobAction>(A) || isa<VerifyJobAction>(A)); > InputInfos.push_back(BuildJobsForAction(C, Input, TC, BoundArch, > SubJobAtTopLevel, MultipleArchs, > - LinkingOutput)); > + LinkingOutput, CachedResults)); > } > > // Always use the first input as the base input. > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits