diff --git a/test/tools/llvm-lipo/Inputs/armv7-slice-big.yaml b/test/tools/llvm-lipo/Inputs/armv7-slice-big.yaml new file mode 100644 index 00000000000..9c328959938 --- /dev/null +++ b/test/tools/llvm-lipo/Inputs/armv7-slice-big.yaml @@ -0,0 +1,934 @@ +--- !mach-o +FileHeader: + magic: 0xFEEDFACE + cputype: 0x0000000C + cpusubtype: 0x00000009 + filetype: 0x00000002 + ncmds: 27 + sizeofcmds: 2176 + flags: 0x00200085 +LoadCommands: + - cmd: LC_SEGMENT + cmdsize: 56 + segname: __PAGEZERO + vmaddr: 0 + vmsize: 16384 + fileoff: 0 + filesize: 0 + maxprot: 0 + initprot: 0 + nsects: 0 + flags: 0 + - cmd: LC_SEGMENT + cmdsize: 260 + segname: __TEXT + vmaddr: 16384 + vmsize: 32768 + fileoff: 0 + filesize: 32768 + maxprot: 5 + initprot: 5 + nsects: 3 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x000000000000BBA0 + size: 804 + offset: 0x00007BA0 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __picsymbolstub4 + segname: __TEXT + addr: 0x000000000000BEC4 + size: 160 + offset: 0x00007EC4 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x80000408 + reserved1: 0x00000000 + reserved2: 0x00000010 + reserved3: 0x00000000 + - sectname: __stub_helper + segname: __TEXT + addr: 0x000000000000BF64 + size: 156 + offset: 0x00007F64 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - cmd: LC_SEGMENT + cmdsize: 600 + segname: __DATA + vmaddr: 49152 + vmsize: 16384 + fileoff: 32768 + filesize: 16384 + maxprot: 3 + initprot: 3 + nsects: 8 + flags: 0 + Sections: + - sectname: __nl_symbol_ptr + segname: __DATA + addr: 0x000000000000C000 + size: 12 + offset: 0x00008000 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000006 + reserved1: 0x0000000A + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __la_symbol_ptr + segname: __DATA + addr: 0x000000000000C00C + size: 40 + offset: 0x0000800C + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000007 + reserved1: 0x0000000D + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __mod_init_func + segname: __DATA + addr: 0x000000000000C034 + size: 4 + offset: 0x00008034 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000009 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __const + segname: __DATA + addr: 0x000000000000C038 + size: 36 + offset: 0x00008038 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __cfstring + segname: __DATA + addr: 0x000000000000C05C + size: 160 + offset: 0x0000805C + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __objc_imageinfo + segname: __DATA + addr: 0x000000000000C0FC + size: 8 + offset: 0x000080FC + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __objc_selrefs + segname: __DATA + addr: 0x000000000000C104 + size: 44 + offset: 0x00008104 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x10000005 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __objc_classrefs + segname: __DATA + addr: 0x000000000000C130 + size: 20 + offset: 0x00008130 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x10000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - cmd: LC_SEGMENT + cmdsize: 192 + segname: __RODATA + vmaddr: 65536 + vmsize: 16384 + fileoff: 49152 + filesize: 16384 + maxprot: 1 + initprot: 1 + nsects: 2 + flags: 0 + Sections: + - sectname: __cstring + segname: __RODATA + addr: 0x0000000000010000 + size: 191 + offset: 0x0000C000 + align: 0 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000002 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __objc_methname + segname: __RODATA + addr: 0x00000000000100BF + size: 243 + offset: 0x0000C0BF + align: 0 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000002 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - cmd: LC_SEGMENT + cmdsize: 56 + segname: __LINKEDIT + vmaddr: 81920 + vmsize: 32768 + fileoff: 65536 + filesize: 22592 + maxprot: 1 + initprot: 1 + nsects: 0 + flags: 0 + - cmd: LC_DYLD_INFO_ONLY + cmdsize: 48 + rebase_off: 65536 + rebase_size: 16 + bind_off: 65552 + bind_size: 316 + weak_bind_off: 0 + weak_bind_size: 0 + lazy_bind_off: 65868 + lazy_bind_size: 260 + export_off: 66128 + export_size: 60 + - cmd: LC_SYMTAB + cmdsize: 24 + symoff: 66220 + nsyms: 29 + stroff: 66660 + strsize: 708 + - cmd: LC_DYSYMTAB + cmdsize: 80 + ilocalsym: 0 + nlocalsym: 7 + iextdefsym: 7 + nextdefsym: 3 + iundefsym: 10 + nundefsym: 19 + tocoff: 0 + ntoc: 0 + modtaboff: 0 + nmodtab: 0 + extrefsymoff: 0 + nextrefsyms: 0 + indirectsymoff: 66568 + nindirectsyms: 23 + extreloff: 0 + nextrel: 0 + locreloff: 0 + nlocrel: 0 + - cmd: LC_LOAD_DYLINKER + cmdsize: 28 + name: 12 + PayloadString: '/usr/lib/dyld' + ZeroPadBytes: 3 + - cmd: LC_UUID + cmdsize: 24 + uuid: D36E4B66-CF78-37EC-B274-9DDADEECE4C1 + - cmd: LC_VERSION_MIN_IPHONEOS + cmdsize: 16 + version: 589824 + sdk: 786944 + - cmd: LC_SOURCE_VERSION + cmdsize: 16 + version: 0 + - cmd: LC_MAIN + cmdsize: 24 + entryoff: 31913 + stacksize: 0 + - cmd: LC_ENCRYPTION_INFO + cmdsize: 20 + cryptoff: 16384 + cryptsize: 16384 + cryptid: 0 + - cmd: LC_LOAD_DYLIB + cmdsize: 48 + dylib: + name: 24 + timestamp: 2 + current_version: 26216708 + compatibility_version: 65536 + PayloadString: '/usr/lib/libc++.1.dylib' + ZeroPadBytes: 1 + - cmd: LC_LOAD_DYLIB + cmdsize: 68 + dylib: + name: 24 + timestamp: 2 + current_version: 0 + compatibility_version: 0 + PayloadString: '@rpath/MobileConfig.framework/MobileConfig' + ZeroPadBytes: 2 + - cmd: LC_LOAD_DYLIB + cmdsize: 84 + dylib: + name: 24 + timestamp: 2 + current_version: 102895360 + compatibility_version: 19660800 + PayloadString: '/System/Library/Frameworks/Foundation.framework/Foundation' + ZeroPadBytes: 2 + - cmd: LC_LOAD_DYLIB + cmdsize: 76 + dylib: + name: 24 + timestamp: 2 + current_version: 917504 + compatibility_version: 65536 + PayloadString: '/System/Library/Frameworks/MapKit.framework/MapKit' + ZeroPadBytes: 2 + - cmd: LC_LOAD_DYLIB + cmdsize: 84 + dylib: + name: 24 + timestamp: 2 + current_version: 68352 + compatibility_version: 66048 + PayloadString: '/System/Library/Frameworks/QuartzCore.framework/QuartzCore' + ZeroPadBytes: 2 + - cmd: LC_LOAD_DYLIB + cmdsize: 76 + dylib: + name: 24 + timestamp: 2 + current_version: 3997696000 + compatibility_version: 65536 + PayloadString: '/System/Library/Frameworks/UIKit.framework/UIKit' + ZeroPadBytes: 4 + - cmd: LC_LOAD_DYLIB + cmdsize: 52 + dylib: + name: 24 + timestamp: 2 + current_version: 14942208 + compatibility_version: 65536 + PayloadString: '/usr/lib/libobjc.A.dylib' + ZeroPadBytes: 4 + - cmd: LC_LOAD_DYLIB + cmdsize: 52 + dylib: + name: 24 + timestamp: 2 + current_version: 82115073 + compatibility_version: 65536 + PayloadString: '/usr/lib/libSystem.B.dylib' + ZeroPadBytes: 2 + - cmd: LC_LOAD_DYLIB + cmdsize: 92 + dylib: + name: 24 + timestamp: 2 + current_version: 102895360 + compatibility_version: 9830400 + PayloadString: '/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation' + ZeroPadBytes: 2 + - cmd: LC_RPATH + cmdsize: 28 + path: 12 + PayloadString: '/usr/lib/swift' + ZeroPadBytes: 2 + - cmd: LC_RPATH + cmdsize: 40 + path: 12 + PayloadString: '@executable_path/Frameworks' + ZeroPadBytes: 1 + - cmd: LC_DATA_IN_CODE + cmdsize: 16 + dataoff: 66188 + datasize: 32 + - cmd: LC_CODE_SIGNATURE + cmdsize: 16 + dataoff: 67376 + datasize: 20752 +LinkEditData: + RebaseOpcodes: + - Opcode: REBASE_OPCODE_SET_TYPE_IMM + Imm: 1 + - Opcode: REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ExtraData: + - 0x000000000000000C + - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES + Imm: 11 + - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED + Imm: 2 + - Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB + Imm: 0 + ExtraData: + - 0x0000000000000010 + - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES + Imm: 2 + - Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED + Imm: 2 + - Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB + Imm: 0 + ExtraData: + - 0x000000000000000A + - 0x000000000000000C + - Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES + Imm: 11 + - Opcode: REBASE_OPCODE_DONE + Imm: 0 + BindOpcodes: + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 3 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: '_OBJC_CLASS_$_NSBundle' + - Opcode: BIND_OPCODE_SET_TYPE_IMM + Imm: 1 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: + - 0x0000000000000140 + Symbol: '' + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: '_OBJC_CLASS_$_NSJSONSerialization' + - Opcode: BIND_OPCODE_ADD_ADDR_ULEB + Imm: 0 + ULEBExtraData: + - 0xFFFFFFFFFFFFFFF0 + Symbol: '' + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 7 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _objc_release + - Opcode: BIND_OPCODE_ADD_ADDR_ULEB + Imm: 0 + ULEBExtraData: + - 0xFFFFFFFFFFFFFED0 + Symbol: '' + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 8 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: __NSConcreteGlobalBlock + - Opcode: BIND_OPCODE_ADD_ADDR_ULEB + Imm: 0 + ULEBExtraData: + - 0x000000000000003C + Symbol: '' + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: dyld_stub_binder + - Opcode: BIND_OPCODE_ADD_ADDR_ULEB + Imm: 0 + ULEBExtraData: + - 0xFFFFFFFFFFFFFFB4 + Symbol: '' + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 9 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: '_OBJC_CLASS_$_NSData' + - Opcode: BIND_OPCODE_ADD_ADDR_ULEB + Imm: 0 + ULEBExtraData: + - 0x000000000000012C + Symbol: '' + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: '_OBJC_CLASS_$_NSMutableArray' + - Opcode: BIND_OPCODE_ADD_ADDR_ULEB + Imm: 0 + ULEBExtraData: + - 0x0000000000000008 + Symbol: '' + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: '_OBJC_CLASS_$_NSUserDefaults' + - Opcode: BIND_OPCODE_ADD_ADDR_ULEB + Imm: 0 + ULEBExtraData: + - 0xFFFFFFFFFFFFFFF8 + Symbol: '' + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: ___CFConstantStringClassReference + - Opcode: BIND_OPCODE_ADD_ADDR_ULEB + Imm: 0 + ULEBExtraData: + - 0xFFFFFFFFFFFFFF20 + Symbol: '' + - Opcode: BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB + Imm: 0 + ULEBExtraData: + - 0x0000000000000009 + - 0x000000000000000C + Symbol: '' + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + LazyBindOpcodes: + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: + - 0x000000000000000C + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 3 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _NSClassFromString + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: + - 0x0000000000000010 + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 6 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _UIApplicationMain + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: + - 0x0000000000000014 + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 7 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _objc_autoreleasePoolPop + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: + - 0x0000000000000018 + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 7 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _objc_autoreleasePoolPush + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: + - 0x000000000000001C + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 7 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _objc_autoreleaseReturnValue + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: + - 0x0000000000000020 + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 7 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _objc_msgSend + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: + - 0x0000000000000024 + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 7 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _objc_release + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: + - 0x0000000000000028 + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 7 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _objc_retainAutoreleasedReturnValue + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: + - 0x000000000000002C + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 8 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _strcmp + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB + Imm: 2 + ULEBExtraData: + - 0x0000000000000030 + Symbol: '' + - Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM + Imm: 8 + Symbol: '' + - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM + Imm: 0 + Symbol: _strlen + - Opcode: BIND_OPCODE_DO_BIND + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + - Opcode: BIND_OPCODE_DONE + Imm: 0 + Symbol: '' + ExportTrie: + TerminalSize: 0 + NodeOffset: 0 + Name: '' + Flags: 0x0000000000000000 + Address: 0x0000000000000000 + Other: 0x0000000000000000 + ImportName: '' + Children: + - TerminalSize: 0 + NodeOffset: 5 + Name: _ + Flags: 0x0000000000000000 + Address: 0x0000000000000000 + Other: 0x0000000000000000 + ImportName: '' + Children: + - TerminalSize: 2 + NodeOffset: 41 + Name: _mh_execute_header + Flags: 0x0000000000000000 + Address: 0x0000000000000000 + Other: 0x0000000000000000 + ImportName: '' + - TerminalSize: 4 + NodeOffset: 45 + Name: main + Flags: 0x0000000000000000 + Address: 0x0000000000007CA9 + Other: 0x0000000000000000 + ImportName: '' + - TerminalSize: 4 + NodeOffset: 51 + Name: MNMain + Flags: 0x0000000000000000 + Address: 0x0000000000007E45 + Other: 0x0000000000000000 + ImportName: '' + NameList: + - n_strx: 461 + n_type: 0x0E + n_sect: 1 + n_desc: 8 + n_value: 48032 + - n_strx: 487 + n_type: 0x0E + n_sect: 1 + n_desc: 8 + n_value: 48776 + - n_strx: 540 + n_type: 0x1E + n_sect: 1 + n_desc: 8 + n_value: 48812 + - n_strx: 559 + n_type: 0x1E + n_sect: 1 + n_desc: 8 + n_value: 48824 + - n_strx: 593 + n_type: 0x1E + n_sect: 3 + n_desc: 0 + n_value: 48996 + - n_strx: 607 + n_type: 0x0E + n_sect: 7 + n_desc: 0 + n_value: 49208 + - n_strx: 656 + n_type: 0x0E + n_sect: 7 + n_desc: 0 + n_value: 49224 + - n_strx: 4 + n_type: 0x0F + n_sect: 1 + n_desc: 8 + n_value: 48708 + - n_strx: 12 + n_type: 0x0F + n_sect: 1 + n_desc: 16 + n_value: 16384 + - n_strx: 32 + n_type: 0x0F + n_sect: 1 + n_desc: 8 + n_value: 48296 + - n_strx: 38 + n_type: 0x01 + n_sect: 0 + n_desc: 768 + n_value: 0 + - n_strx: 57 + n_type: 0x01 + n_sect: 0 + n_desc: 768 + n_value: 0 + - n_strx: 80 + n_type: 0x01 + n_sect: 0 + n_desc: 2304 + n_value: 0 + - n_strx: 101 + n_type: 0x01 + n_sect: 0 + n_desc: 768 + n_value: 0 + - n_strx: 135 + n_type: 0x01 + n_sect: 0 + n_desc: 2304 + n_value: 0 + - n_strx: 164 + n_type: 0x01 + n_sect: 0 + n_desc: 2304 + n_value: 0 + - n_strx: 193 + n_type: 0x01 + n_sect: 0 + n_desc: 1536 + n_value: 0 + - n_strx: 212 + n_type: 0x01 + n_sect: 0 + n_desc: 2048 + n_value: 0 + - n_strx: 236 + n_type: 0x01 + n_sect: 0 + n_desc: 2304 + n_value: 0 + - n_strx: 270 + n_type: 0x01 + n_sect: 0 + n_desc: 2048 + n_value: 0 + - n_strx: 284 + n_type: 0x01 + n_sect: 0 + n_desc: 1792 + n_value: 0 + - n_strx: 309 + n_type: 0x01 + n_sect: 0 + n_desc: 1792 + n_value: 0 + - n_strx: 335 + n_type: 0x01 + n_sect: 0 + n_desc: 1792 + n_value: 0 + - n_strx: 364 + n_type: 0x01 + n_sect: 0 + n_desc: 1792 + n_value: 0 + - n_strx: 378 + n_type: 0x01 + n_sect: 0 + n_desc: 1792 + n_value: 0 + - n_strx: 392 + n_type: 0x01 + n_sect: 0 + n_desc: 1792 + n_value: 0 + - n_strx: 428 + n_type: 0x01 + n_sect: 0 + n_desc: 2048 + n_value: 0 + - n_strx: 436 + n_type: 0x01 + n_sect: 0 + n_desc: 2048 + n_value: 0 + - n_strx: 444 + n_type: 0x01 + n_sect: 0 + n_desc: 2048 + n_value: 0 + StringTable: + - '' + - '' + - '' + - '' + - _MNMain + - __mh_execute_header + - _main + - _NSClassFromString + - '_OBJC_CLASS_$_NSBundle' + - '_OBJC_CLASS_$_NSData' + - '_OBJC_CLASS_$_NSJSONSerialization' + - '_OBJC_CLASS_$_NSMutableArray' + - '_OBJC_CLASS_$_NSUserDefaults' + - _UIApplicationMain + - __NSConcreteGlobalBlock + - ___CFConstantStringClassReference + - ___truncdfhf2 + - _objc_autoreleasePoolPop + - _objc_autoreleasePoolPush + - _objc_autoreleaseReturnValue + - _objc_msgSend + - _objc_release + - _objc_retainAutoreleasedReturnValue + - _strcmp + - _strlen + - dyld_stub_binder + - _FBParseCommandLineParams + - ___MNMain_block_invoke_7636.llvm.6232502296855065941 + - '_objc_release$shim' + - '_objc_autoreleaseReturnValue$shim' + - ' stub helpers' + - ___block_descriptor_tmp.llvm.6232502296855065941 + - ___block_literal_global.llvm.6232502296855065941 + - '' + - '' + - '' +... diff --git a/test/tools/llvm-lipo/Inputs/armv7_i386_non_default_alignment.yaml b/test/tools/llvm-lipo/Inputs/armv7_i386_non_default_alignment.yaml new file mode 100644 index 00000000000..2005b56eab1 --- /dev/null +++ b/test/tools/llvm-lipo/Inputs/armv7_i386_non_default_alignment.yaml @@ -0,0 +1,191 @@ +--- !fat-mach-o +FatHeader: + magic: 0xCAFEBABE + nfat_arch: 2 +FatArchs: + - cputype: 0x0000000C + cpusubtype: 0x00000009 + offset: 0x0000000000000030 + size: 432 + align: 4 + - cputype: 0x00000007 + cpusubtype: 0x00000003 + offset: 0x0000000000001000 + size: 432 + align: 12 +Slices: + - !mach-o + FileHeader: + magic: 0xFEEDFACE + cputype: 0x0000000C + cpusubtype: 0x00000009 + 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: 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 + - '' +... diff --git a/test/tools/llvm-lipo/Inputs/i386-x86_64-armv7-arm64-universal.yaml b/test/tools/llvm-lipo/Inputs/i386-x86_64-armv7-arm64-universal.yaml new file mode 100644 index 00000000000..f0070b5bd94 --- /dev/null +++ b/test/tools/llvm-lipo/Inputs/i386-x86_64-armv7-arm64-universal.yaml @@ -0,0 +1,377 @@ +--- !fat-mach-o +FatHeader: + magic: 0xCAFEBABE + nfat_arch: 4 +FatArchs: + - cputype: 0x00000007 + cpusubtype: 0x00000003 + offset: 0x0000000000001000 + size: 432 + align: 12 + - cputype: 0x01000007 + cpusubtype: 0x00000003 + offset: 0x0000000000002000 + size: 488 + align: 12 + - cputype: 0x0000000C + cpusubtype: 0x00000009 + offset: 0x0000000000004000 + size: 304 + align: 14 + - cputype: 0x0100000C + cpusubtype: 0x00000000 + offset: 0x0000000000008000 + size: 516 + align: 14 +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 + - '' + - !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 + - '' + - !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 + - '' +... diff --git a/test/tools/llvm-lipo/replace-invalid-input.test b/test/tools/llvm-lipo/replace-invalid-input.test new file mode 100644 index 00000000000..8c0f7ce3d96 --- /dev/null +++ b/test/tools/llvm-lipo/replace-invalid-input.test @@ -0,0 +1,30 @@ +# RUN: yaml2obj %p/Inputs/i386-slice.yaml > %t-32.o +# RUN: yaml2obj %p/Inputs/arm64-slice.yaml > %t-arm64.o +# RUN: yaml2obj %p/Inputs/i386-x86_64-universal.yaml > %t-universal.o + +# RUN: not llvm-lipo %t-universal.o -replace %t-32.o 2>&1 | FileCheck --check-prefix=MISSING_ARG %s +# MISSING_ARG: error: replace is missing an argument: expects -replace arch_type file_name + +# RUN: not llvm-lipo %t-universal.o -replace %t-32.o i386 2>&1 | FileCheck --check-prefix=OUTPUT_FILE %s +# OUTPUT_FILE: error: replace expects a single output file to be specified + +# RUN: not llvm-lipo %t-universal.o %t-universal.o -replace %t-32.o i386 -o %t.o 2>&1 | FileCheck --check-prefix=INPUT_ARGS %s +# INPUT_ARGS: error: replace expects a single input file + +# RUN: not llvm-lipo %t-universal.o -replace %t-32.o i386 -o %t.o 2>&1 | FileCheck --check-prefix=INVALID_FILE %s +# INVALID_FILE: error: 'i386': No such file or directory + +# RUN: not llvm-lipo %t-universal.o -replace i3866 %t-32.o -o %t.o 2>&1 | FileCheck --check-prefix=INVALID_ARCH %s +# INVALID_ARCH: error: Invalid architecture: i3866 + +# RUN: not llvm-lipo %t-universal.o -replace arm64 %t-32.o -o %t.o 2>&1 | FileCheck --check-prefix=ARCH_NOT_MATCHED %s +# ARCH_NOT_MATCHED: error: specified architecture: arm64 for replacement file: {{.*}} does not match the file's architecture + +# RUN: not llvm-lipo %t-universal.o -replace arm64 %t-arm64.o -o %t.o 2>&1 | FileCheck --check-prefix=ARCH_NOT_IN_INPUT %s +# ARCH_NOT_IN_INPUT: error: -replace arm64 specified but fat file: {{.*}} does not contain that architecture + +# RUN: not llvm-lipo %t-universal.o -replace i386 %t-32.o -replace arm64 %t-universal.o -o %t.o 2>&1 | FileCheck --check-prefix=REPLACE_UNIVERSAL %s +# REPLACE_UNIVERSAL: replacement file: {{.*}} is a fat file (must be a thin file) + +# RUN: not llvm-lipo %t-universal.o -replace i386 %t-32.o -replace i386 %t-32.o -o %t.o 2>&1 | FileCheck --check-prefix=ARCH_DUPLICATE %s +# ARCH_DUPLICATE: error: -replace i386 specified multiple times: diff --git a/test/tools/llvm-lipo/replace-universal-binary.test b/test/tools/llvm-lipo/replace-universal-binary.test new file mode 100644 index 00000000000..f9419ef18f3 --- /dev/null +++ b/test/tools/llvm-lipo/replace-universal-binary.test @@ -0,0 +1,35 @@ +# RUN: yaml2obj %p/Inputs/armv7-slice-big.yaml > %t-armv7big.o +# RUN: yaml2obj %p/Inputs/i386-x86_64-armv7-arm64-universal.yaml > %t-universal.o + +# RUN: llvm-lipo %t-universal.o -replace armv7 %t-armv7big.o -o %t.o +# RUN: llvm-objdump %t.o -m --universal-headers | FileCheck --check-prefix=ARMV7_BIG %s +# RUN: llvm-lipo %t.o -thin armv7 -o %t-armv7-out.o +# RUN: cmp %t-armv7big.o %t-armv7-out.o +# ARMV7_BIG: architecture i386 +# ARMV7_BIG: offset 4096 +# ARMV7_BIG: align 2^12 (4096) +# ARMV7_BIG-NEXT: architecture x86_64 +# ARMV7_BIG: offset 8192 +# ARMV7_BIG: align 2^12 (4096) +# ARMV7_BIG-NEXT: architecture armv7 +# ARMV7_BIG: offset 16384 +# ARMV7_BIG: size 88128 +# ARMV7_BIG: align 2^14 (16384) +# ARMV7_BIG-NEXT: architecture arm64 +# ARMV7_BIG: offset 114688 +# ARMV7_BIG: size 516 +# ARMV7_BIG: align 2^14 (16384) + +# RUN: yaml2obj %p/Inputs/armv7-slice.yaml > %t-armv7.o +# RUN: yaml2obj %p/Inputs/armv7_i386_non_default_alignment.yaml > %t-universal-align.o + +# RUN: llvm-lipo %t-universal-align.o -replace armv7 %t-armv7.o -o %t2.o +# RUN: llvm-objdump %t2.o -m --universal-headers | FileCheck --check-prefix=ARMV7_ALIGN_SWAP %s +# RUN: llvm-lipo %t2.o -thin armv7 -o %t-armv7-out2.o +# RUN: cmp %t-armv7.o %t-armv7-out2.o +# ARMV7_ALIGN_SWAP: architecture i386 +# ARMV7_ALIGN_SWAP: offset 4096 +# ARMV7_ALIGN_SWAP: align 2^12 (4096) +# ARMV7_ALIGN_SWAP-NEXT: architecture armv7 +# ARMV7_ALIGN_SWAP: offset 16384 +# ARMV7_ALIGN_SWAP: align 2^14 (16384) diff --git a/tools/llvm-lipo/LipoOpts.td b/tools/llvm-lipo/LipoOpts.td index 44515feec6a..7e38cb59c2a 100644 --- a/tools/llvm-lipo/LipoOpts.td +++ b/tools/llvm-lipo/LipoOpts.td @@ -34,6 +34,12 @@ def create : Option<["-", "--"], "create", KIND_FLAG>, HelpText<"Create a universal binary output file from the input " "files. Requires -output option">; +def replace + : MultiArg<["-", "--"], "replace", 2>, + Group, + HelpText<"Replace the specified arch type with the contents of the " + "input_file in a universal binary. Requires -output option">; + def output : Option<["-", "--"], "output", KIND_SEPARATE>, HelpText<"Create output file with specified name">; def o : JoinedOrSeparate<["-"], "o">, Alias; diff --git a/tools/llvm-lipo/llvm-lipo.cpp b/tools/llvm-lipo/llvm-lipo.cpp index 87167679a41..060fe7c629a 100644 --- a/tools/llvm-lipo/llvm-lipo.cpp +++ b/tools/llvm-lipo/llvm-lipo.cpp @@ -82,11 +82,18 @@ enum class LipoAction { VerifyArch, ThinArch, CreateUniversal, + ReplaceArch, +}; + +struct Replacement { + StringRef ArchType; + StringRef FileName; }; struct Config { SmallVector InputFiles; SmallVector VerifyArchList; + SmallVector Replacements; std::string ThinArchType; std::string OutputFile; LipoAction ActionToPerform; @@ -158,7 +165,14 @@ static Config parseLipoOptions(ArrayRef ArgsArr) { SmallVector ActionArgs(InputArgs.filtered(LIPO_action_group)); if (ActionArgs.empty()) reportError("at least one action should be specified"); - if (ActionArgs.size() > 1) { + // errors if multiple actions specified other than replace + // multiple replace flags may be specified, as long as they are not mixed with + // other action flags + auto ReplacementArgsRange = InputArgs.filtered(LIPO_replace); + if (ActionArgs.size() > 1 && + ActionArgs.size() != + static_cast(std::distance(ReplacementArgsRange.begin(), + ReplacementArgsRange.end()))) { std::string Buf; raw_string_ostream OS(Buf); OS << "only one of the following actions can be specified:"; @@ -206,6 +220,23 @@ static Config parseLipoOptions(ArrayRef ArgsArr) { C.ActionToPerform = LipoAction::CreateUniversal; return C; + case LIPO_replace: + for (auto Action : ActionArgs) { + if (!Action->getValue(1)) + reportError( + "replace is missing an argument: expects -replace arch_type " + "file_name"); + C.Replacements.push_back( + Replacement{Action->getValue(0), Action->getValue(1)}); + } + + if (C.OutputFile.empty()) + reportError("replace expects a single output file to be specified"); + if (C.InputFiles.size() > 1) + reportError("replace expects a single input file"); + C.ActionToPerform = LipoAction::ReplaceArch; + return C; + default: reportError("llvm-lipo action unspecified"); } @@ -557,6 +588,81 @@ static void createUniversalBinary(ArrayRef> InputBinaries, exit(EXIT_SUCCESS); } +static StringMap +buildReplacementSlices(ArrayRef> ReplacementBinaries, + ArrayRef Replacements) { + assert(ReplacementBinaries.size() == Replacements.size() && + "Number of replacment binaries does not match the number of " + "replacements"); + StringMap Slices; + // populates StringMap of slices to replace with; error checks for mismatched + // replace flag args, fat files, and duplicate arch_types + for (size_t Index = 0, Size = Replacements.size(); Index < Size; ++Index) { + StringRef ReplacementArch = Replacements[Index].ArchType; + const Binary *ReplacementBinary = ReplacementBinaries[Index].getBinary(); + validateArchitectureName(ReplacementArch); + + auto O = dyn_cast(ReplacementBinary); + if (!O) + reportError("replacement file: " + ReplacementBinary->getFileName() + + " is a fat file (must be a thin file)"); + + if (O->getArch() != Triple(ReplacementArch).getArch()) + reportError("specified architecture: " + ReplacementArch + + " for replacement file: " + ReplacementBinary->getFileName() + + " does not match the file's architecture"); + + auto Entry = + Slices.try_emplace(ReplacementArch, Slice{O, calculateAlignment(O)}); + if (!Entry.second) + reportError("-replace " + ReplacementArch + + " specified multiple times: " + + Entry.first->second.ObjectFile->getFileName() + ", " + + O->getFileName()); + } + return Slices; +} + +LLVM_ATTRIBUTE_NORETURN +static void replaceSlices(ArrayRef> InputBinaries, + StringRef OutputFileName, + ArrayRef Replacements) { + assert(InputBinaries.size() == 1 && "Incorrect number of input binaries"); + assert(!OutputFileName.empty() && "Replace expects a single output file"); + + if (InputBinaries.front().getBinary()->isMachO()) + reportError("input file " + + InputBinaries.front().getBinary()->getFileName() + + " must be a fat file when the -replace option is specified"); + + SmallVector ReplacementFiles; + for (const auto &R : Replacements) + ReplacementFiles.push_back(R.FileName); + SmallVector, 1> ReplacementBinaries = + readInputBinaries(ReplacementFiles); + + StringMap ReplacementSlices = + buildReplacementSlices(ReplacementBinaries, Replacements); + SmallVector, 2> ExtractedObjects; + SmallVector Slices = buildSlices(InputBinaries, ExtractedObjects); + + for (auto &Slice : Slices) { + auto It = ReplacementSlices.find(getArchString(*Slice.ObjectFile)); + if (It != ReplacementSlices.end()) { + Slice = It->second; + ReplacementSlices.erase(It); // only keep remaining replacing arch_types + } + } + + if (!ReplacementSlices.empty()) + reportError("-replace " + ReplacementSlices.begin()->first() + + " specified but fat file: " + + InputBinaries.front().getBinary()->getFileName() + + " does not contain that architecture"); + createUniversalBinary(Slices, OutputFileName); + exit(EXIT_SUCCESS); +} + int main(int argc, char **argv) { InitLLVM X(argc, argv); Config C = parseLipoOptions(makeArrayRef(argv + 1, argc)); @@ -579,6 +685,9 @@ int main(int argc, char **argv) { case LipoAction::CreateUniversal: createUniversalBinary(InputBinaries, C.OutputFile); break; + case LipoAction::ReplaceArch: + replaceSlices(InputBinaries, C.OutputFile, C.Replacements); + break; } return EXIT_SUCCESS; }