[llvm] r364107 - [llvm-lipo] Implement -thin
Shoaib Meenai via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 21 14:59:01 PDT 2019
Author: smeenai
Date: Fri Jun 21 14:59:01 2019
New Revision: 364107
URL: http://llvm.org/viewvc/llvm-project?rev=364107&view=rev
Log:
[llvm-lipo] Implement -thin
Creates thin output file of specified arch_type from the fat input file.
Patch by Anusha Basana <anushabasana at fb.com>
Differential Revision: https://reviews.llvm.org/D63341
Added:
llvm/trunk/test/tools/llvm-lipo/Inputs/
llvm/trunk/test/tools/llvm-lipo/Inputs/i386-slice.yaml
llvm/trunk/test/tools/llvm-lipo/Inputs/i386-x86_64-universal.yaml
llvm/trunk/test/tools/llvm-lipo/thin-executable-universal-binary.test
llvm/trunk/test/tools/llvm-lipo/thin-macho-binary.test
llvm/trunk/test/tools/llvm-lipo/thin-universal-binary.test
Modified:
llvm/trunk/test/tools/llvm-lipo/help-error-messages.test
llvm/trunk/tools/llvm-lipo/LipoOpts.td
llvm/trunk/tools/llvm-lipo/llvm-lipo.cpp
Added: llvm/trunk/test/tools/llvm-lipo/Inputs/i386-slice.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/Inputs/i386-slice.yaml?rev=364107&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/Inputs/i386-slice.yaml (added)
+++ llvm/trunk/test/tools/llvm-lipo/Inputs/i386-slice.yaml Fri Jun 21 14:59:01 2019
@@ -0,0 +1,88 @@
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACE
+ cputype: 0x00000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 4
+ sizeofcmds: 312
+ flags: 0x00002000
+LoadCommands:
+ - cmd: LC_SEGMENT
+ cmdsize: 192
+ segname: ''
+ vmaddr: 0
+ vmsize: 72
+ fileoff: 340
+ filesize: 72
+ maxprot: 7
+ initprot: 7
+ nsects: 2
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x0000000000000000
+ size: 18
+ offset: 0x00000154
+ align: 4
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __eh_frame
+ segname: __TEXT
+ addr: 0x0000000000000014
+ size: 52
+ offset: 0x00000168
+ align: 2
+ 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: 412
+ nsyms: 1
+ stroff: 424
+ 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
+ - ''
+...
Added: llvm/trunk/test/tools/llvm-lipo/Inputs/i386-x86_64-universal.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/Inputs/i386-x86_64-universal.yaml?rev=364107&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/Inputs/i386-x86_64-universal.yaml (added)
+++ llvm/trunk/test/tools/llvm-lipo/Inputs/i386-x86_64-universal.yaml Fri Jun 21 14:59:01 2019
@@ -0,0 +1,192 @@
+--- !fat-mach-o
+FatHeader:
+ magic: 0xCAFEBABE
+ nfat_arch: 2
+FatArchs:
+ - cputype: 0x00000007
+ cpusubtype: 0x00000003
+ offset: 0x0000000000001000
+ size: 432
+ align: 12
+ - cputype: 0x01000007
+ cpusubtype: 0x00000003
+ offset: 0x0000000000002000
+ size: 488
+ align: 12
+Slices:
+ - !mach-o
+ FileHeader:
+ magic: 0xFEEDFACE
+ cputype: 0x00000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 4
+ sizeofcmds: 312
+ flags: 0x00002000
+ LoadCommands:
+ - cmd: LC_SEGMENT
+ cmdsize: 192
+ segname: ''
+ vmaddr: 0
+ vmsize: 72
+ fileoff: 340
+ filesize: 72
+ maxprot: 7
+ initprot: 7
+ nsects: 2
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x0000000000000000
+ size: 18
+ offset: 0x00000154
+ align: 4
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __eh_frame
+ segname: __TEXT
+ addr: 0x0000000000000014
+ size: 52
+ offset: 0x00000168
+ align: 2
+ 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: 412
+ nsyms: 1
+ stroff: 424
+ 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
+ - ''
+ - !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
+ - ''
+...
Modified: llvm/trunk/test/tools/llvm-lipo/help-error-messages.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/help-error-messages.test?rev=364107&r1=364106&r2=364107&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/help-error-messages.test (original)
+++ llvm/trunk/test/tools/llvm-lipo/help-error-messages.test Fri Jun 21 14:59:01 2019
@@ -9,7 +9,10 @@
# RUN: not llvm-lipo --abcabc 2>&1 | FileCheck --check-prefix=LIPO-UNKNOWN-ARG %s
# RUN: not llvm-lipo %t -archs -verify_arch i386 2>&1 | FileCheck --check-prefix=MULTIPLE_FLAGS %s
-# MULTIPLE_FLAGS: only one of the following actions can be specified: -archs -verify_arch
+# RUN: not llvm-lipo %t -archs -thin i386 2>&1 | FileCheck --check-prefix=MULTIPLE_FLAGS %s
+# RUN: not llvm-lipo %t -thin i386 -verify_arch i386 2>&1 | FileCheck --check-prefix=MULTIPLE_FLAGS %s
+# RUN: not llvm-lipo %t -archs -thin i386 -verify_arch i386 2>&1 | FileCheck --check-prefix=MULTIPLE_FLAGS %s
+# MULTIPLE_FLAGS: only one of the following actions can be specified:
# LIPO-USAGE: USAGE: llvm-lipo
# LIPO-UNKNOWN-ARG: unknown argument '{{-+}}abcabc'
Added: 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=364107&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/thin-executable-universal-binary.test (added)
+++ llvm/trunk/test/tools/llvm-lipo/thin-executable-universal-binary.test Fri Jun 21 14:59:01 2019
@@ -0,0 +1,50 @@
+# Executable testing is not supported on Windows, since all files are considered executable
+# UNSUPPORTED: windows
+# RUN: yaml2obj %s > %t-universal.o
+
+# RUN: chmod -x %t-universal.o
+# RUN: llvm-lipo %t-universal.o -thin i386 -output %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
+# RUN: test -x %t32-ex.o
+
+
+
+--- !fat-mach-o
+FatHeader:
+ magic: 0xCAFEBABE
+ nfat_arch: 2
+FatArchs:
+ - cputype: 0x00000007
+ cpusubtype: 0x00000003
+ offset: 0x0000000000001000
+ size: 28
+ align: 12
+ - cputype: 0x01000007
+ cpusubtype: 0x00000003
+ offset: 0x0000000000002000
+ size: 32
+ align: 12
+Slices:
+ - !mach-o
+ FileHeader:
+ magic: 0xFEEDFACE
+ cputype: 0x00000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00002000
+ - !mach-o
+ FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00002000
+ reserved: 0x00000000
+...
Added: llvm/trunk/test/tools/llvm-lipo/thin-macho-binary.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/thin-macho-binary.test?rev=364107&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/thin-macho-binary.test (added)
+++ llvm/trunk/test/tools/llvm-lipo/thin-macho-binary.test Fri Jun 21 14:59:01 2019
@@ -0,0 +1,21 @@
+# RUN: yaml2obj %s > %t
+
+# RUN: not llvm-lipo %t -thin i386 2>&1 | FileCheck --check-prefix=NO_OUTPUT %s
+# NO_OUTPUT: error: thin expects a single output file
+
+# RUN: not llvm-lipo %t %t -thin i386 2>&1 | FileCheck --check-prefix=MULTIPLE_INPUT_OBJ %s
+# MULTIPLE_INPUT_OBJ: thin expects a single input file
+
+# RUN: not llvm-lipo %t -thin i386 -output %t.out 2>&1 | FileCheck --check-prefix=INPUT_FILE_THIN %s
+# INPUT_FILE_THIN: must be a fat file when the -thin option is specified
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACE
+ cputype: 0x00000097
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00002000
+...
Added: llvm/trunk/test/tools/llvm-lipo/thin-universal-binary.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lipo/thin-universal-binary.test?rev=364107&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-lipo/thin-universal-binary.test (added)
+++ llvm/trunk/test/tools/llvm-lipo/thin-universal-binary.test Fri Jun 21 14:59:01 2019
@@ -0,0 +1,49 @@
+# RUN: yaml2obj %s > %t
+
+# RUN: not llvm-lipo %t -thin arc -output %t.out 2>&1 | FileCheck --check-prefix=ARCH_NOT_IN_FILE %s
+# ARCH_NOT_IN_FILE: does not contain the specified architecture arc to thin it to
+
+# RUN: not llvm-lipo %t -thin aarch101 -output %t.out 2>&1 | FileCheck --check-prefix=INVALID_ARCH %s
+# INVALID_ARCH: Invalid architecture: aarch101
+
+# RUN: yaml2obj %p/Inputs/i386-x86_64-universal.yaml > %t-universal.o
+# RUN: llvm-lipo %t-universal.o -thin i386 -output %t32.o
+# RUN: yaml2obj %p/Inputs/i386-slice.yaml > %t-basic32.o
+# RUN: cmp %t32.o %t-basic32.o
+
+--- !fat-mach-o
+FatHeader:
+ magic: 0xCAFEBABE
+ nfat_arch: 2
+FatArchs:
+ - cputype: 0x00000007
+ cpusubtype: 0x00000003
+ offset: 0x0000000000001000
+ size: 28
+ align: 12
+ - cputype: 0x01000007
+ cpusubtype: 0x00000003
+ offset: 0x0000000000002000
+ size: 32
+ align: 12
+Slices:
+ - !mach-o
+ FileHeader:
+ magic: 0xFEEDFACE
+ cputype: 0x00000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00002000
+ - !mach-o
+ FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00002000
+ reserved: 0x00000000
+...
Modified: llvm/trunk/tools/llvm-lipo/LipoOpts.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lipo/LipoOpts.td?rev=364107&r1=364106&r2=364107&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-lipo/LipoOpts.td (original)
+++ llvm/trunk/tools/llvm-lipo/LipoOpts.td Fri Jun 21 14:59:01 2019
@@ -17,3 +17,12 @@ def verify_arch
def archs : Option<["-", "--"], "archs", KIND_FLAG>,
Group<action_group>,
HelpText<"Display the arch_types present in the input file">;
+
+def thin : Option<["-", "--"], "thin", KIND_SEPARATE>,
+ Group<action_group>,
+ HelpText<"Create a thin output file of specified arch_type from the "
+ "fat input file. 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=364107&r1=364106&r2=364107&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-lipo/llvm-lipo.cpp (original)
+++ llvm/trunk/tools/llvm-lipo/llvm-lipo.cpp Fri Jun 21 14:59:01 2019
@@ -19,6 +19,7 @@
#include "llvm/Option/ArgList.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Error.h"
+#include "llvm/Support/FileOutputBuffer.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/WithColor.h"
@@ -78,16 +79,24 @@ public:
enum class LipoAction {
PrintArchs,
VerifyArch,
+ ThinArch,
};
struct Config {
SmallVector<std::string, 1> InputFiles;
SmallVector<std::string, 1> VerifyArchList;
+ std::string ThinArchType;
+ std::string OutputFile;
LipoAction ActionToPerform;
};
} // end namespace
+static void validateArchitectureName(StringRef ArchitectureName) {
+ if (Triple(ArchitectureName).getArch() == Triple::ArchType::UnknownArch)
+ reportError("Invalid architecture: " + ArchitectureName);
+}
+
static Config parseLipoOptions(ArrayRef<const char *> ArgsArr) {
Config C;
LipoOptTable T;
@@ -95,6 +104,11 @@ static Config parseLipoOptions(ArrayRef<
llvm::opt::InputArgList InputArgs =
T.ParseArgs(ArgsArr, MissingArgumentIndex, MissingArgumentCount);
+ if (MissingArgumentCount)
+ reportError("missing argument to " +
+ StringRef(InputArgs.getArgString(MissingArgumentIndex)) +
+ " option");
+
if (InputArgs.size() == 0) {
// PrintHelp does not accept Twine.
T.PrintHelp(errs(), "llvm-lipo input[s] option[s]", "llvm-lipo");
@@ -121,6 +135,9 @@ static Config parseLipoOptions(ArrayRef<
if (C.InputFiles.empty())
reportError("at least one input file should be specified");
+ if (InputArgs.hasArg(LIPO_output))
+ C.OutputFile = InputArgs.getLastArgValue(LIPO_output);
+
SmallVector<opt::Arg *, 1> ActionArgs(InputArgs.filtered(LIPO_action_group));
if (ActionArgs.empty())
reportError("at least one action should be specified");
@@ -151,6 +168,17 @@ static Config parseLipoOptions(ArrayRef<
C.ActionToPerform = LipoAction::PrintArchs;
return C;
+ case LIPO_thin:
+ if (C.InputFiles.size() > 1)
+ reportError("thin expects a single input file");
+ C.ThinArchType = ActionArgs[0]->getValue();
+ validateArchitectureName(C.ThinArchType);
+ if (C.OutputFile.empty())
+ reportError("thin expects a single output file");
+
+ C.ActionToPerform = LipoAction::ThinArch;
+ return C;
+
default:
reportError("llvm-lipo action unspecified");
}
@@ -164,8 +192,12 @@ readInputBinaries(ArrayRef<std::string>
createBinary(InputFile);
if (!BinaryOrErr)
reportError(InputFile, BinaryOrErr.takeError());
- if (!isa<MachOObjectFile>(BinaryOrErr->getBinary()) &&
- !isa<MachOUniversalBinary>(BinaryOrErr->getBinary()))
+ // TODO: Add compatibility for archive files
+ if (BinaryOrErr->getBinary()->isArchive())
+ reportError("File " + InputFile +
+ " is an archive file and is not yet supported.");
+ if (!BinaryOrErr->getBinary()->isMachO() &&
+ !BinaryOrErr->getBinary()->isMachOUniversalBinary())
reportError("File " + InputFile + " has unsupported binary format");
InputBinaries.push_back(std::move(*BinaryOrErr));
}
@@ -180,8 +212,7 @@ static void verifyArch(ArrayRef<OwningBi
assert(InputBinaries.size() == 1 && "Incorrect number of input binaries");
for (StringRef Arch : VerifyArchList)
- if (Triple(Arch).getArch() == Triple::ArchType::UnknownArch)
- reportError("Invalid architecture: " + Arch);
+ validateArchitectureName(Arch);
if (auto UO =
dyn_cast<MachOUniversalBinary>(InputBinaries.front().getBinary())) {
@@ -238,6 +269,44 @@ static void printArchs(ArrayRef<OwningBi
exit(EXIT_SUCCESS);
}
+LLVM_ATTRIBUTE_NORETURN
+static void extractSlice(ArrayRef<OwningBinary<Binary>> InputBinaries,
+ StringRef ThinArchType, StringRef OutputFileName) {
+ assert(!ThinArchType.empty() && "The architecture type should be non-empty");
+ assert(InputBinaries.size() == 1 && "Incorrect number of input binaries");
+ assert(!OutputFileName.empty() && "Thin expects a single output file");
+
+ if (InputBinaries.front().getBinary()->isMachO()) {
+ reportError("input file " +
+ InputBinaries.front().getBinary()->getFileName() +
+ " must be a fat file when the -thin option is specified");
+ exit(EXIT_FAILURE);
+ }
+
+ auto *UO = cast<MachOUniversalBinary>(InputBinaries.front().getBinary());
+ Expected<std::unique_ptr<MachOObjectFile>> Obj =
+ UO->getObjectForArch(ThinArchType);
+ if (!Obj)
+ reportError("fat input file " + UO->getFileName() +
+ " does not contain the specified architecture " + ThinArchType +
+ " to thin it to");
+
+ Expected<std::unique_ptr<FileOutputBuffer>> OutFileOrError =
+ FileOutputBuffer::create(OutputFileName,
+ Obj.get()->getMemoryBufferRef().getBufferSize(),
+ sys::fs::can_execute(UO->getFileName())
+ ? FileOutputBuffer::F_executable
+ : 0);
+ if (!OutFileOrError)
+ reportError(OutputFileName, OutFileOrError.takeError());
+ std::copy(Obj.get()->getMemoryBufferRef().getBufferStart(),
+ Obj.get()->getMemoryBufferRef().getBufferEnd(),
+ OutFileOrError.get()->getBufferStart());
+ if (Error E = OutFileOrError.get()->commit())
+ reportError(OutputFileName, std::move(E));
+ exit(EXIT_SUCCESS);
+}
+
int main(int argc, char **argv) {
InitLLVM X(argc, argv);
Config C = parseLipoOptions(makeArrayRef(argv + 1, argc));
@@ -251,6 +320,9 @@ int main(int argc, char **argv) {
case LipoAction::PrintArchs:
printArchs(InputBinaries);
break;
+ case LipoAction::ThinArch:
+ extractSlice(InputBinaries, C.ThinArchType, C.OutputFile);
+ break;
}
return EXIT_SUCCESS;
}
More information about the llvm-commits
mailing list