| --- src/ld/InputFiles.cpp |
| +++ src/ld/InputFiles.cpp |
| @@ -58,7 +58,9 @@ |
| #include "macho_relocatable_file.h" |
| #include "macho_dylib_file.h" |
| #include "archive_file.h" |
| +#ifdef LTO |
| #include "lto_file.h" |
| +#endif |
| #include "opaque_section_file.h" |
| |
| |
| @@ -175,9 +177,11 @@ |
| if ( result != NULL ) |
| return result; |
| |
| +#ifdef LTO |
| result = lto::archName(p, len); |
| if ( result != NULL ) |
| return result; |
| +#endif |
| |
| if ( strncmp((const char*)p, "!<arch>\n", 8) == 0 ) |
| return "archive"; |
| @@ -264,10 +268,12 @@ |
| if ( objResult != NULL ) |
| return this->addObject(objResult, info, len); |
| |
| +#if LTO |
| // see if it is an llvm object file |
| objResult = lto::parse(p, len, info.path, info.modTime, _nextInputOrdinal, _options.architecture(), _options.subArchitecture(), _options.logAllFiles()); |
| if ( objResult != NULL ) |
| return this->addObject(objResult, info, len); |
| +#endif |
| |
| // see if it is a dynamic library |
| ld::dylib::File* dylibResult = mach_o::dylib::parse(p, len, info.path, info.modTime, _options, _nextInputOrdinal, info.options.fBundleLoader, indirectDylib); |
| @@ -291,6 +297,7 @@ |
| return this->addArchive(archiveResult, info, len); |
| } |
| |
| +#ifdef LTO |
| // does not seem to be any valid linker input file, check LTO misconfiguration problems |
| if ( lto::archName((uint8_t*)p, len) != NULL ) { |
| if ( lto::libLTOisLoaded() ) { |
| @@ -315,6 +322,7 @@ |
| throwf("could not process llvm bitcode object file, because %s could not be loaded", libLTO); |
| } |
| } |
| +#endif |
| |
| // error handling |
| if ( ((fat_header*)p)->magic == OSSwapBigToHostInt32(FAT_MAGIC) ) { |
| --- src/ld/Options.cpp |
| +++ src/ld/Options.cpp |
| @@ -36,10 +36,12 @@ |
| #include "Architectures.hpp" |
| #include "MachOFileAbstraction.hpp" |
| |
| +#ifdef LTO |
| // upward dependency on lto::version() |
| namespace lto { |
| extern const char* version(); |
| } |
| +#endif |
| |
| // magic to place command line in crash reports |
| const int crashreporterBufferSize = 2000; |
| @@ -2766,9 +2768,11 @@ |
| fprintf(stderr, "%s", ldVersionString); |
| // if only -v specified, exit cleanly |
| if ( argc == 2 ) { |
| +#ifdef LTO |
| const char* ltoVers = lto::version(); |
| if ( ltoVers != NULL ) |
| fprintf(stderr, "%s\n", ltoVers); |
| +#endif |
| exit(0); |
| } |
| } |
| --- src/ld/Resolver.cpp |
| +++ src/ld/Resolver.cpp |
| @@ -58,7 +58,9 @@ |
| #include "InputFiles.h" |
| #include "SymbolTable.h" |
| #include "Resolver.h" |
| +#ifdef LTO |
| #include "parsers/lto_file.h" |
| +#endif |
| |
| |
| namespace ld { |
| @@ -1315,6 +1317,7 @@ |
| |
| void Resolver::linkTimeOptimize() |
| { |
| +#ifdef LTO |
| // only do work here if some llvm obj files where loaded |
| if ( ! _haveLLVMObjs ) |
| return; |
| @@ -1415,6 +1418,9 @@ |
| // check new code does not override some dylib |
| this->checkDylibSymbolCollisions(); |
| } |
| +#else |
| + return; |
| +#endif |
| } |
| |
| |
| --- src/ld/ld.cpp |
| +++ src/ld/ld.cpp |
| @@ -83,7 +83,9 @@ |
| #include "parsers/archive_file.h" |
| #include "parsers/macho_relocatable_file.h" |
| #include "parsers/macho_dylib_file.h" |
| +#ifdef LTO |
| #include "parsers/lto_file.h" |
| +#endif |
| #include "parsers/opaque_section_file.h" |
| |
| |
| --- src/ld/parsers/archive_file.cpp |
| +++ src/ld/parsers/archive_file.cpp |
| @@ -39,7 +39,9 @@ |
| #include "Architectures.hpp" |
| |
| #include "macho_relocatable_file.h" |
| +#ifdef LTO |
| #include "lto_file.h" |
| +#endif |
| #include "archive_file.h" |
| |
| |
| @@ -91,8 +93,10 @@ |
| private: |
| static bool validMachOFile(const uint8_t* fileContent, uint64_t fileLength, |
| const mach_o::relocatable::ParserOptions& opts); |
| +#ifdef LTO |
| static bool validLTOFile(const uint8_t* fileContent, uint64_t fileLength, |
| const mach_o::relocatable::ParserOptions& opts); |
| +#endif |
| static cpu_type_t architecture(); |
| |
| class Entry : ar_hdr |
| @@ -239,12 +243,13 @@ |
| return mach_o::relocatable::isObjectFile(fileContent, fileLength, opts); |
| } |
| |
| +#ifdef LTO |
| template <typename A> |
| bool File<A>::validLTOFile(const uint8_t* fileContent, uint64_t fileLength, const mach_o::relocatable::ParserOptions& opts) |
| { |
| return lto::isObjectFile(fileContent, fileLength, opts.architecture, opts.subType); |
| } |
| - |
| +#endif |
| |
| |
| template <typename A> |
| @@ -263,7 +268,11 @@ |
| if ( (p==start) && ((strcmp(memberName, SYMDEF_SORTED) == 0) || (strcmp(memberName, SYMDEF) == 0)) ) |
| continue; |
| // archive is valid if first .o file is valid |
| - return (validMachOFile(p->content(), p->contentSize(), opts) || validLTOFile(p->content(), p->contentSize(), opts)); |
| + return (validMachOFile(p->content(), p->contentSize(), opts) |
| +#ifdef LTO |
| + || validLTOFile(p->content(), p->contentSize(), opts) |
| +#endif |
| + ); |
| } |
| // empty archive |
| return true; |
| @@ -363,6 +372,7 @@ |
| _instantiatedEntries[member] = state; |
| return _instantiatedEntries[member]; |
| } |
| +#ifdef LTO |
| // see if member is llvm bitcode file |
| result = lto::parse(member->content(), member->contentSize(), |
| mPath, member->modificationTime(), this->ordinal() + memberIndex, |
| @@ -372,6 +382,7 @@ |
| _instantiatedEntries[member] = state; |
| return _instantiatedEntries[member]; |
| } |
| +#endif |
| |
| throwf("archive member '%s' with length %d is not mach-o or llvm bitcode", memberName, member->contentSize()); |
| } |
| --- src/other/ObjectDump.cpp |
| +++ src/other/ObjectDump.cpp |
| @@ -33,7 +33,9 @@ |
| |
| #include "MachOFileAbstraction.hpp" |
| #include "parsers/macho_relocatable_file.h" |
| +#ifdef LTO |
| #include "parsers/lto_file.h" |
| +#endif |
| |
| static bool sDumpContent= true; |
| static bool sDumpStabs = false; |
| @@ -1150,10 +1152,12 @@ |
| if ( objResult != NULL ) |
| return objResult; |
| |
| +#ifdef LTO |
| // see if it is an llvm object file |
| objResult = lto::parse(p, fileLen, path, stat_buf.st_mtime, 0, sPreferredArch, sPreferredSubArch, false); |
| if ( objResult != NULL ) |
| return objResult; |
| +#endif |
| |
| throwf("not a mach-o object file: %s", path); |
| #else |