xref: /freebsd-src/contrib/llvm-project/llvm/lib/ObjCopy/ObjCopy.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
1*81ad6265SDimitry Andric //===- Objcopy.cpp --------------------------------------------------------===//
2*81ad6265SDimitry Andric //
3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*81ad6265SDimitry Andric //
7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===//
8*81ad6265SDimitry Andric 
9*81ad6265SDimitry Andric #include "llvm/ObjCopy/ObjCopy.h"
10*81ad6265SDimitry Andric #include "llvm/ObjCopy/COFF/COFFConfig.h"
11*81ad6265SDimitry Andric #include "llvm/ObjCopy/COFF/COFFObjcopy.h"
12*81ad6265SDimitry Andric #include "llvm/ObjCopy/CommonConfig.h"
13*81ad6265SDimitry Andric #include "llvm/ObjCopy/ELF/ELFConfig.h"
14*81ad6265SDimitry Andric #include "llvm/ObjCopy/ELF/ELFObjcopy.h"
15*81ad6265SDimitry Andric #include "llvm/ObjCopy/MachO/MachOConfig.h"
16*81ad6265SDimitry Andric #include "llvm/ObjCopy/MachO/MachOObjcopy.h"
17*81ad6265SDimitry Andric #include "llvm/ObjCopy/MultiFormatConfig.h"
18*81ad6265SDimitry Andric #include "llvm/ObjCopy/wasm/WasmConfig.h"
19*81ad6265SDimitry Andric #include "llvm/ObjCopy/wasm/WasmObjcopy.h"
20*81ad6265SDimitry Andric #include "llvm/ObjCopy/XCOFF/XCOFFConfig.h"
21*81ad6265SDimitry Andric #include "llvm/ObjCopy/XCOFF/XCOFFObjcopy.h"
22*81ad6265SDimitry Andric #include "llvm/Object/COFF.h"
23*81ad6265SDimitry Andric #include "llvm/Object/ELFObjectFile.h"
24*81ad6265SDimitry Andric #include "llvm/Object/Error.h"
25*81ad6265SDimitry Andric #include "llvm/Object/MachO.h"
26*81ad6265SDimitry Andric #include "llvm/Object/MachOUniversal.h"
27*81ad6265SDimitry Andric #include "llvm/Object/Wasm.h"
28*81ad6265SDimitry Andric #include "llvm/Object/XCOFFObjectFile.h"
29*81ad6265SDimitry Andric #include "llvm/Support/SmallVectorMemoryBuffer.h"
30*81ad6265SDimitry Andric 
31*81ad6265SDimitry Andric namespace llvm {
32*81ad6265SDimitry Andric namespace objcopy {
33*81ad6265SDimitry Andric 
34*81ad6265SDimitry Andric using namespace llvm::object;
35*81ad6265SDimitry Andric 
36*81ad6265SDimitry Andric /// The function executeObjcopyOnBinary does the dispatch based on the format
37*81ad6265SDimitry Andric /// of the input binary (ELF, MachO or COFF).
executeObjcopyOnBinary(const MultiFormatConfig & Config,object::Binary & In,raw_ostream & Out)38*81ad6265SDimitry Andric Error executeObjcopyOnBinary(const MultiFormatConfig &Config,
39*81ad6265SDimitry Andric                              object::Binary &In, raw_ostream &Out) {
40*81ad6265SDimitry Andric   if (auto *ELFBinary = dyn_cast<object::ELFObjectFileBase>(&In)) {
41*81ad6265SDimitry Andric     Expected<const ELFConfig &> ELFConfig = Config.getELFConfig();
42*81ad6265SDimitry Andric     if (!ELFConfig)
43*81ad6265SDimitry Andric       return ELFConfig.takeError();
44*81ad6265SDimitry Andric 
45*81ad6265SDimitry Andric     return elf::executeObjcopyOnBinary(Config.getCommonConfig(), *ELFConfig,
46*81ad6265SDimitry Andric                                        *ELFBinary, Out);
47*81ad6265SDimitry Andric   }
48*81ad6265SDimitry Andric   if (auto *COFFBinary = dyn_cast<object::COFFObjectFile>(&In)) {
49*81ad6265SDimitry Andric     Expected<const COFFConfig &> COFFConfig = Config.getCOFFConfig();
50*81ad6265SDimitry Andric     if (!COFFConfig)
51*81ad6265SDimitry Andric       return COFFConfig.takeError();
52*81ad6265SDimitry Andric 
53*81ad6265SDimitry Andric     return coff::executeObjcopyOnBinary(Config.getCommonConfig(), *COFFConfig,
54*81ad6265SDimitry Andric                                         *COFFBinary, Out);
55*81ad6265SDimitry Andric   }
56*81ad6265SDimitry Andric   if (auto *MachOBinary = dyn_cast<object::MachOObjectFile>(&In)) {
57*81ad6265SDimitry Andric     Expected<const MachOConfig &> MachOConfig = Config.getMachOConfig();
58*81ad6265SDimitry Andric     if (!MachOConfig)
59*81ad6265SDimitry Andric       return MachOConfig.takeError();
60*81ad6265SDimitry Andric 
61*81ad6265SDimitry Andric     return macho::executeObjcopyOnBinary(Config.getCommonConfig(), *MachOConfig,
62*81ad6265SDimitry Andric                                          *MachOBinary, Out);
63*81ad6265SDimitry Andric   }
64*81ad6265SDimitry Andric   if (auto *MachOUniversalBinary =
65*81ad6265SDimitry Andric           dyn_cast<object::MachOUniversalBinary>(&In)) {
66*81ad6265SDimitry Andric     return macho::executeObjcopyOnMachOUniversalBinary(
67*81ad6265SDimitry Andric         Config, *MachOUniversalBinary, Out);
68*81ad6265SDimitry Andric   }
69*81ad6265SDimitry Andric   if (auto *WasmBinary = dyn_cast<object::WasmObjectFile>(&In)) {
70*81ad6265SDimitry Andric     Expected<const WasmConfig &> WasmConfig = Config.getWasmConfig();
71*81ad6265SDimitry Andric     if (!WasmConfig)
72*81ad6265SDimitry Andric       return WasmConfig.takeError();
73*81ad6265SDimitry Andric 
74*81ad6265SDimitry Andric     return objcopy::wasm::executeObjcopyOnBinary(Config.getCommonConfig(),
75*81ad6265SDimitry Andric                                                  *WasmConfig, *WasmBinary, Out);
76*81ad6265SDimitry Andric   }
77*81ad6265SDimitry Andric   if (auto *XCOFFBinary = dyn_cast<object::XCOFFObjectFile>(&In)) {
78*81ad6265SDimitry Andric     Expected<const XCOFFConfig &> XCOFFConfig = Config.getXCOFFConfig();
79*81ad6265SDimitry Andric     if (!XCOFFConfig)
80*81ad6265SDimitry Andric       return XCOFFConfig.takeError();
81*81ad6265SDimitry Andric 
82*81ad6265SDimitry Andric     return xcoff::executeObjcopyOnBinary(Config.getCommonConfig(), *XCOFFConfig,
83*81ad6265SDimitry Andric                                          *XCOFFBinary, Out);
84*81ad6265SDimitry Andric   }
85*81ad6265SDimitry Andric   return createStringError(object_error::invalid_file_type,
86*81ad6265SDimitry Andric                            "unsupported object file format");
87*81ad6265SDimitry Andric }
88*81ad6265SDimitry Andric 
89*81ad6265SDimitry Andric } // end namespace objcopy
90*81ad6265SDimitry Andric } // end namespace llvm
91