[llvm] r366144 - Revert [llvm-lipo] Implement -create (with hardcoded alignments)
Shoaib Meenai via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 15 15:44:08 PDT 2019
Author: smeenai
Date: Mon Jul 15 15:44:08 2019
New Revision: 366144
URL: http://llvm.org/viewvc/llvm-project?rev=366144&view=rev
Log:
Revert [llvm-lipo] Implement -create (with hardcoded alignments)
This reverts r366142 (git commit 67cee1dc7ee285b03372eb818a3894d35efa7394)
The test is failing on the Windows buildbots. Reverting while I
investigate.
Removed:
llvm/trunk/test/tools/llvm-lipo/Inputs/arm64-slice.yaml
llvm/trunk/test/tools/llvm-lipo/Inputs/armv7-slice.yaml
llvm/trunk/test/tools/llvm-lipo/Inputs/x86_64-slice.yaml
llvm/trunk/test/tools/llvm-lipo/create-executable.test
llvm/trunk/test/tools/llvm-lipo/create-invalid-input.test
llvm/trunk/test/tools/llvm-lipo/create-without-alignment.test
Modified:
llvm/trunk/test/tools/llvm-lipo/thin-executable-universal-binary.test
llvm/trunk/tools/llvm-lipo/LipoOpts.td
llvm/trunk/tools/llvm-lipo/llvm-lipo.cpp
Removed: llvm/trunk/test/tools/llvm-lipo/Inputs/arm64-slice.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/Inputs/arm64-slice.yaml?rev=366143&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/Inputs/arm64-slice.yaml (original)
+++ llvm/trunk/test/tools/llvm-lipo/Inputs/arm64-slice.yaml (removed)
@@ -1,101 +0,0 @@
---- !mach-o
-FileHeader:
- magic: 0xFEEDFACF
- cputype: 0x0100000C
- cpusubtype: 0x00000000
- filetype: 0x00000001
- ncmds: 4
- sizeofcmds: 352
- flags: 0x00002000
- reserved: 0x00000000
-LoadCommands:
- - cmd: LC_SEGMENT_64
- cmdsize: 232
- segname: ''
- vmaddr: 0
- vmsize: 56
- fileoff: 384
- filesize: 56
- maxprot: 7
- initprot: 7
- nsects: 2
- flags: 0
- Sections:
- - sectname: __text
- segname: __TEXT
- addr: 0x0000000000000000
- size: 20
- offset: 0x00000180
- align: 2
- reloff: 0x00000000
- nreloc: 0
- flags: 0x80000400
- reserved1: 0x00000000
- reserved2: 0x00000000
- reserved3: 0x00000000
- - sectname: __compact_unwind
- segname: __LD
- addr: 0x0000000000000018
- size: 32
- offset: 0x00000198
- align: 3
- reloff: 0x000001B8
- nreloc: 1
- flags: 0x02000000
- reserved1: 0x00000000
- reserved2: 0x00000000
- reserved3: 0x00000000
- - cmd: LC_VERSION_MIN_IPHONEOS
- cmdsize: 16
- version: 327680
- sdk: 0
- - cmd: LC_SYMTAB
- cmdsize: 24
- symoff: 448
- nsyms: 3
- stroff: 496
- strsize: 20
- - cmd: LC_DYSYMTAB
- cmdsize: 80
- ilocalsym: 0
- nlocalsym: 2
- iextdefsym: 2
- nextdefsym: 1
- iundefsym: 3
- nundefsym: 0
- tocoff: 0
- ntoc: 0
- modtaboff: 0
- nmodtab: 0
- extrefsymoff: 0
- nextrefsyms: 0
- indirectsymoff: 0
- nindirectsyms: 0
- extreloff: 0
- nextrel: 0
- locreloff: 0
- nlocrel: 0
-LinkEditData:
- NameList:
- - n_strx: 13
- n_type: 0x0E
- n_sect: 1
- n_desc: 0
- n_value: 0
- - n_strx: 7
- n_type: 0x0E
- n_sect: 2
- n_desc: 0
- n_value: 24
- - n_strx: 1
- n_type: 0x0F
- n_sect: 1
- n_desc: 0
- n_value: 0
- StringTable:
- - ''
- - _main
- - ltmp1
- - ltmp0
- - ''
-...
Removed: llvm/trunk/test/tools/llvm-lipo/Inputs/armv7-slice.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/Inputs/armv7-slice.yaml?rev=366143&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/Inputs/armv7-slice.yaml (original)
+++ llvm/trunk/test/tools/llvm-lipo/Inputs/armv7-slice.yaml (removed)
@@ -1,76 +0,0 @@
---- !mach-o
-FileHeader:
- magic: 0xFEEDFACE
- cputype: 0x0000000C
- cpusubtype: 0x00000009
- filetype: 0x00000001
- ncmds: 4
- sizeofcmds: 244
- flags: 0x00002000
-LoadCommands:
- - cmd: LC_SEGMENT
- cmdsize: 124
- segname: ''
- vmaddr: 0
- vmsize: 10
- fileoff: 272
- filesize: 10
- maxprot: 7
- initprot: 7
- nsects: 1
- flags: 0
- Sections:
- - sectname: __text
- segname: __TEXT
- addr: 0x0000000000000000
- size: 10
- offset: 0x00000110
- align: 1
- reloff: 0x00000000
- nreloc: 0
- flags: 0x80000400
- reserved1: 0x00000000
- reserved2: 0x00000000
- reserved3: 0x00000000
- - cmd: LC_VERSION_MIN_IPHONEOS
- cmdsize: 16
- version: 327680
- sdk: 0
- - cmd: LC_SYMTAB
- cmdsize: 24
- symoff: 284
- nsyms: 1
- stroff: 296
- strsize: 8
- - cmd: LC_DYSYMTAB
- cmdsize: 80
- ilocalsym: 0
- nlocalsym: 0
- iextdefsym: 0
- nextdefsym: 1
- iundefsym: 1
- nundefsym: 0
- tocoff: 0
- ntoc: 0
- modtaboff: 0
- nmodtab: 0
- extrefsymoff: 0
- nextrefsyms: 0
- indirectsymoff: 0
- nindirectsyms: 0
- extreloff: 0
- nextrel: 0
- locreloff: 0
- nlocrel: 0
-LinkEditData:
- NameList:
- - n_strx: 1
- n_type: 0x0F
- n_sect: 1
- n_desc: 8
- n_value: 0
- StringTable:
- - ''
- - _main
- - ''
-...
Removed: llvm/trunk/test/tools/llvm-lipo/Inputs/x86_64-slice.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/Inputs/x86_64-slice.yaml?rev=366143&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/Inputs/x86_64-slice.yaml (original)
+++ llvm/trunk/test/tools/llvm-lipo/Inputs/x86_64-slice.yaml (removed)
@@ -1,89 +0,0 @@
---- !mach-o
-FileHeader:
- magic: 0xFEEDFACF
- cputype: 0x01000007
- cpusubtype: 0x00000003
- filetype: 0x00000001
- ncmds: 4
- sizeofcmds: 352
- flags: 0x00002000
- reserved: 0x00000000
-LoadCommands:
- - cmd: LC_SEGMENT_64
- cmdsize: 232
- segname: ''
- vmaddr: 0
- vmsize: 80
- fileoff: 384
- filesize: 80
- maxprot: 7
- initprot: 7
- nsects: 2
- flags: 0
- Sections:
- - sectname: __text
- segname: __TEXT
- addr: 0x0000000000000000
- size: 15
- offset: 0x00000180
- align: 4
- reloff: 0x00000000
- nreloc: 0
- flags: 0x80000400
- reserved1: 0x00000000
- reserved2: 0x00000000
- reserved3: 0x00000000
- - sectname: __eh_frame
- segname: __TEXT
- addr: 0x0000000000000010
- size: 64
- offset: 0x00000190
- align: 3
- reloff: 0x00000000
- nreloc: 0
- flags: 0x6800000B
- reserved1: 0x00000000
- reserved2: 0x00000000
- reserved3: 0x00000000
- - cmd: LC_VERSION_MIN_MACOSX
- cmdsize: 16
- version: 656384
- sdk: 0
- - cmd: LC_SYMTAB
- cmdsize: 24
- symoff: 464
- nsyms: 1
- stroff: 480
- strsize: 8
- - cmd: LC_DYSYMTAB
- cmdsize: 80
- ilocalsym: 0
- nlocalsym: 0
- iextdefsym: 0
- nextdefsym: 1
- iundefsym: 1
- nundefsym: 0
- tocoff: 0
- ntoc: 0
- modtaboff: 0
- nmodtab: 0
- extrefsymoff: 0
- nextrefsyms: 0
- indirectsymoff: 0
- nindirectsyms: 0
- extreloff: 0
- nextrel: 0
- locreloff: 0
- nlocrel: 0
-LinkEditData:
- NameList:
- - n_strx: 1
- n_type: 0x0F
- n_sect: 1
- n_desc: 0
- n_value: 0
- StringTable:
- - ''
- - _main
- - ''
-...
Removed: llvm/trunk/test/tools/llvm-lipo/create-executable.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/create-executable.test?rev=366143&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/create-executable.test (original)
+++ llvm/trunk/test/tools/llvm-lipo/create-executable.test (removed)
@@ -1,11 +0,0 @@
-# RUN: yaml2obj %p/Inputs/i386-slice.yaml > %t-i386.o
-# RUN: yaml2obj %p/Inputs/x86_64-slice.yaml > %t-x86_64.o
-
-# RUN: chmod -x %t-i386.o
-# RUN: chmod -x %t-x86_64.o
-# RUN: llvm-lipo %t-i386.o %t-x86_64.o -create -output %t-universal.o
-# RUN: ! test -x %t-universal.o
-
-# RUN: chmod +x %t-i386.o
-# RUN: llvm-lipo %t-i386.o %t-x86_64.o -create -output %t-universal.o
-# RUN: test -x %t-universal.o
Removed: llvm/trunk/test/tools/llvm-lipo/create-invalid-input.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/create-invalid-input.test?rev=366143&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/create-invalid-input.test (original)
+++ llvm/trunk/test/tools/llvm-lipo/create-invalid-input.test (removed)
@@ -1,8 +0,0 @@
-# RUN: yaml2obj %p/Inputs/i386-slice.yaml > %t-32.o
-# RUN: yaml2obj %p/Inputs/i386-x86_64-universal.yaml > %t-universal.o
-
-# RUN: not llvm-lipo %t-32.o -create 2>&1 | FileCheck --check-prefix=NO_OUTPUT %s
-# NO_OUTPUT: error: create expects a single output file to be specified
-
-# RUN: not llvm-lipo %t-universal.o %t-32.o -create -output %t.o 2>&1 | FileCheck --check-prefix=DUPLICATE_ARCHS %s
-# DUPLICATE_ARCHS: have the same architecture i386 and therefore cannot be in the same universal binary
Removed: llvm/trunk/test/tools/llvm-lipo/create-without-alignment.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/create-without-alignment.test?rev=366143&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/create-without-alignment.test (original)
+++ llvm/trunk/test/tools/llvm-lipo/create-without-alignment.test (removed)
@@ -1,32 +0,0 @@
-# RUN: yaml2obj %p/Inputs/i386-slice.yaml > %t-i386.o
-# RUN: yaml2obj %p/Inputs/x86_64-slice.yaml > %t-x86_64.o
-
-# RUN: llvm-lipo %t-i386.o %t-x86_64.o -create -output %t-universal-llvm.o
-
-# RUN: yaml2obj %p/Inputs/i386-x86_64-universal.yaml > %t-universal.o
-# RUN: cmp %t-universal-llvm.o %t-universal.o
-
-# RUN: yaml2obj %p/Inputs/armv7-slice.yaml > %t-armv7.o
-# RUN: yaml2obj %p/Inputs/arm64-slice.yaml > %t-arm64.o
-
-# RUN: llvm-lipo %t-arm64.o %t-armv7.o %t-universal.o -create -output %t-universal-2.o
-# RUN: llvm-lipo %t-universal-2.o -thin x86_64 -output %t-x86_64_extracted.o
-# RUN: cmp %t-x86_64_extracted.o %t-x86_64.o
-# RUN: llvm-lipo %t-universal-2.o -thin armv7 -output %t-armv7-extracted.o
-# RUN: cmp %t-armv7-extracted.o %t-armv7.o
-
-# RUN: llvm-objdump %t-universal-2.o -m --universal-headers | FileCheck %s
-# CHECK: fat_magic FAT_MAGIC
-# CHECK: nfat_arch 4
-# CHECK: architecture i386
-# CHECK: offset 4096
-# CHECK: align 2^12 (4096)
-# CHECK: architecture x86_64
-# CHECK: offset 8192
-# CHECK: align 2^12 (4096)
-# CHECK: architecture armv7
-# CHECK: offset 16384
-# CHECK: align 2^14 (16384)
-# CHECK: architecture arm64
-# CHECK: offset 32768
-# CHECK: align 2^14 (16384)
Modified: llvm/trunk/test/tools/llvm-lipo/thin-executable-universal-binary.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/thin-executable-universal-binary.test?rev=366144&r1=366143&r2=366144&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/thin-executable-universal-binary.test (original)
+++ llvm/trunk/test/tools/llvm-lipo/thin-executable-universal-binary.test Mon Jul 15 15:44:08 2019
@@ -4,7 +4,7 @@
# RUN: chmod -x %t-universal.o
# RUN: llvm-lipo %t-universal.o -thin i386 -output %t32.o
-# RUN: ! test -x %t32.o
+# RUN: test ! -x %t32.o
# RUN: chmod +x %t-universal.o
# RUN: llvm-lipo %t-universal.o -thin i386 -output %t32-ex.o
Modified: llvm/trunk/tools/llvm-lipo/LipoOpts.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lipo/LipoOpts.td?rev=366144&r1=366143&r2=366144&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-lipo/LipoOpts.td (original)
+++ llvm/trunk/tools/llvm-lipo/LipoOpts.td Mon Jul 15 15:44:08 2019
@@ -23,11 +23,6 @@ def thin : Option<["-", "--"], "thin", K
HelpText<"Create a thin output file of specified arch_type from the "
"fat input file. Requires -output option">;
-def create : Option<["-", "--"], "create", KIND_FLAG>,
- Group<action_group>,
- HelpText<"Create a universal binary output file from the input "
- "files. Requires -output option">;
-
def output : Option<["-", "--"], "output", KIND_SEPARATE>,
HelpText<"Create output file with specified name">;
def o : JoinedOrSeparate<["-"], "o">, Alias<output>;
Modified: llvm/trunk/tools/llvm-lipo/llvm-lipo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lipo/llvm-lipo.cpp?rev=366144&r1=366143&r2=366144&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-lipo/llvm-lipo.cpp (original)
+++ llvm/trunk/tools/llvm-lipo/llvm-lipo.cpp Mon Jul 15 15:44:08 2019
@@ -80,7 +80,6 @@ enum class LipoAction {
PrintArchs,
VerifyArch,
ThinArch,
- CreateUniversal,
};
struct Config {
@@ -91,14 +90,6 @@ struct Config {
LipoAction ActionToPerform;
};
-struct Slice {
- const MachOObjectFile *ObjectFile;
- // Requires Alignment field to store slice alignment values from universal
- // binaries. Also needed to order the slices using compareSlices, so the total
- // file size can be calculated before creating the output buffer.
- uint32_t Alignment;
-};
-
} // end namespace
static void validateArchitectureName(StringRef ArchitectureName) {
@@ -117,7 +108,7 @@ static Config parseLipoOptions(ArrayRef<
Config C;
LipoOptTable T;
unsigned MissingArgumentIndex, MissingArgumentCount;
- opt::InputArgList InputArgs =
+ llvm::opt::InputArgList InputArgs =
T.ParseArgs(ArgsArr, MissingArgumentIndex, MissingArgumentCount);
if (MissingArgumentCount)
@@ -195,12 +186,6 @@ static Config parseLipoOptions(ArrayRef<
C.ActionToPerform = LipoAction::ThinArch;
return C;
- case LIPO_create:
- if (C.OutputFile.empty())
- reportError("create expects a single output file to be specified");
- C.ActionToPerform = LipoAction::CreateUniversal;
- return C;
-
default:
reportError("llvm-lipo action unspecified");
}
@@ -210,7 +195,8 @@ static SmallVector<OwningBinary<Binary>,
readInputBinaries(ArrayRef<std::string> InputFiles) {
SmallVector<OwningBinary<Binary>, 1> InputBinaries;
for (StringRef InputFile : InputFiles) {
- Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(InputFile);
+ Expected<OwningBinary<llvm::object::Binary>> BinaryOrErr =
+ createBinary(InputFile);
if (!BinaryOrErr)
reportError(InputFile, BinaryOrErr.takeError());
// TODO: Add compatibility for archive files
@@ -255,35 +241,33 @@ static void verifyArch(ArrayRef<OwningBi
exit(EXIT_SUCCESS);
}
-// Returns a string of the given Object file's architecture type
-// Unknown architectures formatted unknown(CPUType,CPUSubType) for compatibility
-// with cctools lipo
-static std::string getArchString(const MachOObjectFile &ObjectFile) {
- const Triple T = ObjectFile.getArchTriple();
- const StringRef ObjectArch = T.getArchName();
- if (!ObjectArch.empty())
- return ObjectArch;
- return ("unknown(" + Twine(ObjectFile.getHeader().cputype) + "," +
- Twine(ObjectFile.getHeader().cpusubtype & ~MachO::CPU_SUBTYPE_MASK) +
- ")")
- .str();
+static void printArchOrUnknown(const MachOObjectFile *ObjectFile) {
+ // Prints trailing space and unknown in this format for compatibility with
+ // cctools lipo.
+ const std::string ObjectArch = ObjectFile->getArchTriple().getArchName();
+ if (ObjectArch.empty())
+ outs() << "unknown(" << ObjectFile->getHeader().cputype << ","
+ << ObjectFile->getHeader().cpusubtype << ") ";
+ else
+ outs() << ObjectArch + " ";
}
LLVM_ATTRIBUTE_NORETURN
static void printArchs(ArrayRef<OwningBinary<Binary>> InputBinaries) {
- // Prints trailing space for compatibility with cctools lipo.
assert(InputBinaries.size() == 1 && "Incorrect number of input binaries");
const Binary *InputBinary = InputBinaries.front().getBinary();
if (auto UO = dyn_cast<MachOUniversalBinary>(InputBinary)) {
- for (const auto &O : UO->objects()) {
+ for (MachOUniversalBinary::object_iterator I = UO->begin_objects(),
+ E = UO->end_objects();
+ I != E; ++I) {
Expected<std::unique_ptr<MachOObjectFile>> BinaryOrError =
- O.getAsObjectFile();
+ I->getAsObjectFile();
if (!BinaryOrError)
reportError(InputBinary->getFileName(), BinaryOrError.takeError());
- outs() << getArchString(*BinaryOrError.get().get()) << " ";
+ printArchOrUnknown(BinaryOrError.get().get());
}
} else if (auto O = dyn_cast<MachOObjectFile>(InputBinary)) {
- outs() << getArchString(*O) << " ";
+ printArchOrUnknown(O);
} else {
llvm_unreachable("Unexpected binary format");
}
@@ -330,173 +314,6 @@ static void extractSlice(ArrayRef<Owning
exit(EXIT_SUCCESS);
}
-static void checkArchDuplicates(const ArrayRef<Slice> &Slices) {
- DenseMap<uint64_t, const MachOObjectFile *> CPUIds;
- auto CPUIDForSlice = [](const Slice &S) {
- return static_cast<uint64_t>(S.ObjectFile->getHeader().cputype) << 32 |
- S.ObjectFile->getHeader().cpusubtype;
- };
- for (const auto &S : Slices) {
- auto Entry = CPUIds.try_emplace(CPUIDForSlice(S), S.ObjectFile);
- if (!Entry.second)
- reportError(Entry.first->second->getFileName() + " and " +
- S.ObjectFile->getFileName() + " have the same architecture " +
- getArchString(*S.ObjectFile) +
- " and therefore cannot be in the same universal binary");
- }
-}
-
-static uint32_t calculateAlignment(const MachOObjectFile *ObjectFile) {
- // TODO: Implement getAlign() and remove hard coding
- // Will be implemented in a follow-up.
-
- switch (ObjectFile->getHeader().cputype) {
- case MachO::CPU_TYPE_I386:
- case MachO::CPU_TYPE_X86_64:
- case MachO::CPU_TYPE_POWERPC:
- case MachO::CPU_TYPE_POWERPC64:
- return 12; // log2 value of page size(4k) for x86 and PPC
- case MachO::CPU_TYPE_ARM:
- case MachO::CPU_TYPE_ARM64:
- case MachO::CPU_TYPE_ARM64_32:
- return 14; // log2 value of page size(16k) for Darwin ARM
- default:
- return 12;
- }
-}
-
-// This function replicates ordering from cctools lipo for consistency
-static bool compareSlices(const Slice &Lhs, const Slice &Rhs) {
- if (Lhs.ObjectFile->getHeader().cputype ==
- Rhs.ObjectFile->getHeader().cputype)
- return Lhs.ObjectFile->getHeader().cpusubtype <
- Rhs.ObjectFile->getHeader().cpusubtype;
-
- // force arm64-family to follow after all other slices for compatibility
- // with cctools lipo
- if (Lhs.ObjectFile->getHeader().cputype == MachO::CPU_TYPE_ARM64)
- return false;
- if (Rhs.ObjectFile->getHeader().cputype == MachO::CPU_TYPE_ARM64)
- return true;
-
- // Sort by alignment to minimize file size
- return Lhs.Alignment < Rhs.Alignment;
-}
-
-// Updates vector ExtractedObjects with the MachOObjectFiles extracted from
-// Universal Binary files to transfer ownership.
-static SmallVector<Slice, 2> buildSlices(
- ArrayRef<OwningBinary<Binary>> InputBinaries,
- SmallVectorImpl<std::unique_ptr<MachOObjectFile>> &ExtractedObjects) {
- SmallVector<Slice, 2> Slices;
- for (auto &IB : InputBinaries) {
- const Binary *InputBinary = IB.getBinary();
- if (auto UO = dyn_cast<MachOUniversalBinary>(InputBinary)) {
- for (const auto &O : UO->objects()) {
- Expected<std::unique_ptr<MachOObjectFile>> BinaryOrError =
- O.getAsObjectFile();
- if (!BinaryOrError)
- reportError(InputBinary->getFileName(), BinaryOrError.takeError());
- ExtractedObjects.push_back(std::move(BinaryOrError.get()));
- Slices.push_back(Slice{ExtractedObjects.back().get(), O.getAlign()});
- }
- } else if (auto O = dyn_cast<MachOObjectFile>(InputBinary)) {
- Slices.push_back(Slice{O, calculateAlignment(O)});
- } else {
- llvm_unreachable("Unexpected binary format");
- }
- }
- return Slices;
-}
-
-static SmallVector<MachO::fat_arch, 2>
-buildFatArchList(ArrayRef<Slice> Slices) {
- SmallVector<MachO::fat_arch, 2> FatArchList;
- uint64_t Offset =
- sizeof(MachO::fat_header) + Slices.size() * sizeof(MachO::fat_arch);
-
- for (size_t Index = 0, Size = Slices.size(); Index < Size; ++Index) {
- Offset = alignTo(Offset, 1 << Slices[Index].Alignment);
- const MachOObjectFile *ObjectFile = Slices[Index].ObjectFile;
- if (Offset > UINT32_MAX)
- reportError("fat file too large to be created because the offset "
- "field in struct fat_arch is only 32-bits and the offset " +
- Twine(Offset) + " for " + ObjectFile->getFileName() +
- " for architecture " + getArchString(*ObjectFile) +
- "exceeds that.");
-
- MachO::fat_arch FatArch;
- FatArch.cputype = ObjectFile->getHeader().cputype;
- FatArch.cpusubtype = ObjectFile->getHeader().cpusubtype;
- FatArch.offset = Offset;
- FatArch.size = ObjectFile->getMemoryBufferRef().getBufferSize();
- FatArch.align = Slices[Index].Alignment;
- Offset += FatArch.size;
- FatArchList.push_back(FatArch);
- }
- return FatArchList;
-}
-
-static void createUniversalBinary(SmallVectorImpl<Slice> &Slices,
- StringRef OutputFileName) {
- MachO::fat_header FatHeader;
- FatHeader.magic = MachO::FAT_MAGIC;
- FatHeader.nfat_arch = Slices.size();
-
- stable_sort(Slices, compareSlices);
- SmallVector<MachO::fat_arch, 2> FatArchList = buildFatArchList(Slices);
-
- const bool IsExecutable = any_of(Slices, [](Slice S) {
- return sys::fs::can_execute(S.ObjectFile->getFileName());
- });
- const uint64_t OutputFileSize =
- FatArchList.back().offset + FatArchList.back().size;
- Expected<std::unique_ptr<FileOutputBuffer>> OutFileOrError =
- FileOutputBuffer::create(OutputFileName, OutputFileSize,
- IsExecutable ? FileOutputBuffer::F_executable
- : 0);
- if (!OutFileOrError)
- reportError(OutputFileName, OutFileOrError.takeError());
- std::unique_ptr<FileOutputBuffer> OutFile = std::move(OutFileOrError.get());
- std::memset(OutFile->getBufferStart(), 0, OutputFileSize);
-
- if (sys::IsLittleEndianHost)
- MachO::swapStruct(FatHeader);
- std::memcpy(OutFile->getBufferStart(), &FatHeader, sizeof(MachO::fat_header));
-
- for (size_t Index = 0, Size = Slices.size(); Index < Size; ++Index) {
- MemoryBufferRef BufferRef = Slices[Index].ObjectFile->getMemoryBufferRef();
- std::copy(BufferRef.getBufferStart(), BufferRef.getBufferEnd(),
- OutFile->getBufferStart() + FatArchList[Index].offset);
- }
-
- // FatArchs written after Slices in order reduce the number of swaps for the
- // LittleEndian case
- if (sys::IsLittleEndianHost)
- for (MachO::fat_arch &FA : FatArchList)
- MachO::swapStruct(FA);
- std::memcpy(OutFile->getBufferStart() + sizeof(MachO::fat_header),
- FatArchList.begin(),
- sizeof(MachO::fat_arch) * FatArchList.size());
-
- if (Error E = OutFile->commit())
- reportError(OutputFileName, std::move(E));
-}
-
-LLVM_ATTRIBUTE_NORETURN
-static void createUniversalBinary(ArrayRef<OwningBinary<Binary>> InputBinaries,
- StringRef OutputFileName) {
- assert(InputBinaries.size() >= 1 && "Incorrect number of input binaries");
- assert(!OutputFileName.empty() && "Create expects a single output file");
-
- SmallVector<std::unique_ptr<MachOObjectFile>, 1> ExtractedObjects;
- SmallVector<Slice, 1> Slices = buildSlices(InputBinaries, ExtractedObjects);
- checkArchDuplicates(Slices);
- createUniversalBinary(Slices, OutputFileName);
-
- exit(EXIT_SUCCESS);
-}
-
int main(int argc, char **argv) {
InitLLVM X(argc, argv);
Config C = parseLipoOptions(makeArrayRef(argv + 1, argc));
@@ -513,9 +330,6 @@ int main(int argc, char **argv) {
case LipoAction::ThinArch:
extractSlice(InputBinaries, C.ThinArchType, C.OutputFile);
break;
- case LipoAction::CreateUniversal:
- createUniversalBinary(InputBinaries, C.OutputFile);
- break;
}
return EXIT_SUCCESS;
}
More information about the llvm-commits
mailing list