[llvm] f75da0c - [llvm-objcopy][NFC] Move core implementation of llvm-objcopy into separate library.
Alexey Lapshin via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 17 02:12:29 PST 2022
Author: Alexey Lapshin
Date: 2022-02-17T13:11:42+03:00
New Revision: f75da0c8e65cf1b09012a8b62cd7f3e9a646bbc9
URL: https://github.com/llvm/llvm-project/commit/f75da0c8e65cf1b09012a8b62cd7f3e9a646bbc9
DIFF: https://github.com/llvm/llvm-project/commit/f75da0c8e65cf1b09012a8b62cd7f3e9a646bbc9.diff
LOG: [llvm-objcopy][NFC] Move core implementation of llvm-objcopy into separate library.
This patch moves core implementation of llvm-objcopy into Object library
(http://lists.llvm.org/pipermail/llvm-dev/2020-September/145075.html).
The functionality for parsing input options is left inside tools/llvm-objcopy.
The interface of ObjCopy library:
ObjCopy/ELF/ELFObjcopy.h
```
Error executeObjcopyOnIHex(const CopyConfig &Config, MemoryBuffer &In,
Buffer &Out);
Error executeObjcopyOnRawBinary(const CopyConfig &Config, MemoryBuffer &In,
Buffer &Out);
Error executeObjcopyOnBinary(const CopyConfig &Config,
object::ELFObjectFileBase &In, Buffer &Out);
```
ObjCopy/COFF/COFFObjcopy.h
```
Error executeObjcopyOnBinary(const CopyConfig &Config,
object::COFFObjectFile &In, Buffer &Out);
```
ObjCopy/MachO/MachOObjcopy.h
```
Error executeObjcopyOnBinary(const CopyConfig &Config,
object::MachOObjectFile &In, Buffer &Out);
```
ObjCopy/wasm/WasmObjcopy.h
```
Error executeObjcopyOnBinary(const CopyConfig &Config,
object::WasmObjectFile &In, Buffer &Out);
```
Differential Revision: https://reviews.llvm.org/D88827
Added:
llvm/include/llvm/ObjCopy/COFF/COFFConfig.h
llvm/include/llvm/ObjCopy/COFF/COFFObjcopy.h
llvm/include/llvm/ObjCopy/CommonConfig.h
llvm/include/llvm/ObjCopy/ConfigManager.h
llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
llvm/include/llvm/ObjCopy/ELF/ELFObjcopy.h
llvm/include/llvm/ObjCopy/MachO/MachOConfig.h
llvm/include/llvm/ObjCopy/MachO/MachOObjcopy.h
llvm/include/llvm/ObjCopy/MultiFormatConfig.h
llvm/include/llvm/ObjCopy/ObjCopy.h
llvm/include/llvm/ObjCopy/wasm/WasmConfig.h
llvm/include/llvm/ObjCopy/wasm/WasmObjcopy.h
llvm/lib/ObjCopy/Archive.cpp
llvm/lib/ObjCopy/Archive.h
llvm/lib/ObjCopy/CMakeLists.txt
llvm/lib/ObjCopy/COFF/COFFObjcopy.cpp
llvm/lib/ObjCopy/COFF/Object.cpp
llvm/lib/ObjCopy/COFF/Object.h
llvm/lib/ObjCopy/COFF/Reader.cpp
llvm/lib/ObjCopy/COFF/Reader.h
llvm/lib/ObjCopy/COFF/Writer.cpp
llvm/lib/ObjCopy/COFF/Writer.h
llvm/lib/ObjCopy/ConfigManager.cpp
llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
llvm/lib/ObjCopy/ELF/Object.cpp
llvm/lib/ObjCopy/ELF/Object.h
llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp
llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.h
llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp
llvm/lib/ObjCopy/MachO/MachOReader.cpp
llvm/lib/ObjCopy/MachO/MachOReader.h
llvm/lib/ObjCopy/MachO/MachOWriter.cpp
llvm/lib/ObjCopy/MachO/MachOWriter.h
llvm/lib/ObjCopy/MachO/Object.cpp
llvm/lib/ObjCopy/MachO/Object.h
llvm/lib/ObjCopy/ObjCopy.cpp
llvm/lib/ObjCopy/wasm/Object.cpp
llvm/lib/ObjCopy/wasm/Object.h
llvm/lib/ObjCopy/wasm/Reader.cpp
llvm/lib/ObjCopy/wasm/Reader.h
llvm/lib/ObjCopy/wasm/WasmObjcopy.cpp
llvm/lib/ObjCopy/wasm/Writer.cpp
llvm/lib/ObjCopy/wasm/Writer.h
llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
llvm/tools/llvm-objcopy/ObjcopyOptions.h
llvm/unittests/ObjCopy/CMakeLists.txt
llvm/unittests/ObjCopy/ObjCopyTest.cpp
Modified:
llvm/lib/CMakeLists.txt
llvm/tools/llvm-objcopy/CMakeLists.txt
llvm/tools/llvm-objcopy/llvm-objcopy.cpp
Removed:
llvm/tools/llvm-objcopy/COFF/COFFConfig.h
llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
llvm/tools/llvm-objcopy/COFF/COFFObjcopy.h
llvm/tools/llvm-objcopy/COFF/Object.cpp
llvm/tools/llvm-objcopy/COFF/Object.h
llvm/tools/llvm-objcopy/COFF/Reader.cpp
llvm/tools/llvm-objcopy/COFF/Reader.h
llvm/tools/llvm-objcopy/COFF/Writer.cpp
llvm/tools/llvm-objcopy/COFF/Writer.h
llvm/tools/llvm-objcopy/CommonConfig.h
llvm/tools/llvm-objcopy/ConfigManager.cpp
llvm/tools/llvm-objcopy/ConfigManager.h
llvm/tools/llvm-objcopy/ELF/ELFConfig.h
llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
llvm/tools/llvm-objcopy/ELF/ELFObjcopy.h
llvm/tools/llvm-objcopy/ELF/Object.cpp
llvm/tools/llvm-objcopy/ELF/Object.h
llvm/tools/llvm-objcopy/MachO/MachOConfig.h
llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp
llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.h
llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp
llvm/tools/llvm-objcopy/MachO/MachOObjcopy.h
llvm/tools/llvm-objcopy/MachO/MachOReader.cpp
llvm/tools/llvm-objcopy/MachO/MachOReader.h
llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp
llvm/tools/llvm-objcopy/MachO/MachOWriter.h
llvm/tools/llvm-objcopy/MachO/Object.cpp
llvm/tools/llvm-objcopy/MachO/Object.h
llvm/tools/llvm-objcopy/MultiFormatConfig.h
llvm/tools/llvm-objcopy/llvm-objcopy.h
llvm/tools/llvm-objcopy/wasm/Object.cpp
llvm/tools/llvm-objcopy/wasm/Object.h
llvm/tools/llvm-objcopy/wasm/Reader.cpp
llvm/tools/llvm-objcopy/wasm/Reader.h
llvm/tools/llvm-objcopy/wasm/WasmConfig.h
llvm/tools/llvm-objcopy/wasm/WasmObjcopy.cpp
llvm/tools/llvm-objcopy/wasm/WasmObjcopy.h
llvm/tools/llvm-objcopy/wasm/Writer.cpp
llvm/tools/llvm-objcopy/wasm/Writer.h
################################################################################
diff --git a/llvm/tools/llvm-objcopy/COFF/COFFConfig.h b/llvm/include/llvm/ObjCopy/COFF/COFFConfig.h
similarity index 82%
rename from llvm/tools/llvm-objcopy/COFF/COFFConfig.h
rename to llvm/include/llvm/ObjCopy/COFF/COFFConfig.h
index 7bf673fa4af9b..29d56d75698be 100644
--- a/llvm/tools/llvm-objcopy/COFF/COFFConfig.h
+++ b/llvm/include/llvm/ObjCopy/COFF/COFFConfig.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_OBJCOPY_COFF_COFFCONFIG_H
-#define LLVM_TOOLS_LLVM_OBJCOPY_COFF_COFFCONFIG_H
+#ifndef LLVM_OBJCOPY_COFF_COFFCONFIG_H
+#define LLVM_OBJCOPY_COFF_COFFCONFIG_H
#include "llvm/ADT/Optional.h"
@@ -24,4 +24,4 @@ struct COFFConfig {
} // namespace objcopy
} // namespace llvm
-#endif // LLVM_TOOLS_LLVM_OBJCOPY_COFF_COFFCONFIG_H
+#endif // LLVM_OBJCOPY_COFF_COFFCONFIG_H
diff --git a/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.h b/llvm/include/llvm/ObjCopy/COFF/COFFObjcopy.h
similarity index 86%
rename from llvm/tools/llvm-objcopy/COFF/COFFObjcopy.h
rename to llvm/include/llvm/ObjCopy/COFF/COFFObjcopy.h
index 2c7ccd34653d7..f8925e21159be 100644
--- a/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.h
+++ b/llvm/include/llvm/ObjCopy/COFF/COFFObjcopy.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_OBJCOPY_COFFOBJCOPY_H
-#define LLVM_TOOLS_OBJCOPY_COFFOBJCOPY_H
+#ifndef LLVM_OBJCOPY_COFF_COFFOBJCOPY_H
+#define LLVM_OBJCOPY_COFF_COFFOBJCOPY_H
namespace llvm {
class Error;
@@ -30,4 +30,4 @@ Error executeObjcopyOnBinary(const CommonConfig &Config, const COFFConfig &,
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_OBJCOPY_COFFOBJCOPY_H
+#endif // LLVM_OBJCOPY_COFF_COFFOBJCOPY_H
diff --git a/llvm/tools/llvm-objcopy/CommonConfig.h b/llvm/include/llvm/ObjCopy/CommonConfig.h
similarity index 98%
rename from llvm/tools/llvm-objcopy/CommonConfig.h
rename to llvm/include/llvm/ObjCopy/CommonConfig.h
index ea39a6da2ba56..ecb169a4e8ec2 100644
--- a/llvm/tools/llvm-objcopy/CommonConfig.h
+++ b/llvm/include/llvm/ObjCopy/CommonConfig.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_OBJCOPY_COMMONCONFIG_H
-#define LLVM_TOOLS_LLVM_OBJCOPY_COMMONCONFIG_H
+#ifndef LLVM_OBJCOPY_COMMONCONFIG_H
+#define LLVM_OBJCOPY_COMMONCONFIG_H
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/CachedHashString.h"
@@ -257,4 +257,4 @@ struct CommonConfig {
} // namespace objcopy
} // namespace llvm
-#endif // LLVM_TOOLS_LLVM_OBJCOPY_COMMONCONFIG_H
+#endif // LLVM_OBJCOPY_COMMONCONFIG_H
diff --git a/llvm/include/llvm/ObjCopy/ConfigManager.h b/llvm/include/llvm/ObjCopy/ConfigManager.h
new file mode 100644
index 0000000000000..3aac601fca9a3
--- /dev/null
+++ b/llvm/include/llvm/ObjCopy/ConfigManager.h
@@ -0,0 +1,46 @@
+//===- ConfigManager.h ------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_OBJCOPY_CONFIGMANAGER_H
+#define LLVM_OBJCOPY_CONFIGMANAGER_H
+
+#include "llvm/ObjCopy/COFF/COFFConfig.h"
+#include "llvm/ObjCopy/CommonConfig.h"
+#include "llvm/ObjCopy/ELF/ELFConfig.h"
+#include "llvm/ObjCopy/MachO/MachOConfig.h"
+#include "llvm/ObjCopy/MultiFormatConfig.h"
+#include "llvm/ObjCopy/wasm/WasmConfig.h"
+
+namespace llvm {
+namespace objcopy {
+
+struct ConfigManager : public MultiFormatConfig {
+ virtual ~ConfigManager() {}
+
+ const CommonConfig &getCommonConfig() const override { return Common; }
+
+ Expected<const ELFConfig &> getELFConfig() const override { return ELF; }
+
+ Expected<const COFFConfig &> getCOFFConfig() const override;
+
+ Expected<const MachOConfig &> getMachOConfig() const override;
+
+ Expected<const WasmConfig &> getWasmConfig() const override;
+
+ // All configs.
+ CommonConfig Common;
+ ELFConfig ELF;
+ COFFConfig COFF;
+ MachOConfig MachO;
+ WasmConfig Wasm;
+};
+
+} // namespace objcopy
+} // namespace llvm
+
+#endif // LLVM_OBJCOPY_CONFIGMANAGER_H
diff --git a/llvm/tools/llvm-objcopy/ELF/ELFConfig.h b/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
similarity index 88%
rename from llvm/tools/llvm-objcopy/ELF/ELFConfig.h
rename to llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
index 229a8d61fb83c..52bc728e36ffa 100644
--- a/llvm/tools/llvm-objcopy/ELF/ELFConfig.h
+++ b/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_OBJCOPY_ELF_ELFCONFIG_H
-#define LLVM_TOOLS_LLVM_OBJCOPY_ELF_ELFCONFIG_H
+#ifndef LLVM_OBJCOPY_ELF_ELFCONFIG_H
+#define LLVM_OBJCOPY_ELF_ELFCONFIG_H
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/StringRef.h"
@@ -35,4 +35,4 @@ struct ELFConfig {
} // namespace objcopy
} // namespace llvm
-#endif // LLVM_TOOLS_LLVM_OBJCOPY_ELF_ELFCONFIG_H
+#endif // LLVM_OBJCOPY_ELF_ELFCONFIG_H
diff --git a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.h b/llvm/include/llvm/ObjCopy/ELF/ELFObjcopy.h
similarity index 90%
rename from llvm/tools/llvm-objcopy/ELF/ELFObjcopy.h
rename to llvm/include/llvm/ObjCopy/ELF/ELFObjcopy.h
index 852661e68f37b..676af4bec0844 100644
--- a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.h
+++ b/llvm/include/llvm/ObjCopy/ELF/ELFObjcopy.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_OBJCOPY_ELFOBJCOPY_H
-#define LLVM_TOOLS_OBJCOPY_ELFOBJCOPY_H
+#ifndef LLVM_OBJCOPY_ELF_ELFOBJCOPY_H
+#define LLVM_OBJCOPY_ELF_ELFOBJCOPY_H
namespace llvm {
class Error;
@@ -37,4 +37,4 @@ Error executeObjcopyOnBinary(const CommonConfig &Config,
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_OBJCOPY_ELFOBJCOPY_H
+#endif // LLVM_OBJCOPY_ELF_ELFOBJCOPY_H
diff --git a/llvm/tools/llvm-objcopy/MachO/MachOConfig.h b/llvm/include/llvm/ObjCopy/MachO/MachOConfig.h
similarity index 87%
rename from llvm/tools/llvm-objcopy/MachO/MachOConfig.h
rename to llvm/include/llvm/ObjCopy/MachO/MachOConfig.h
index 93f9facfcf0bb..f65cea36a920b 100644
--- a/llvm/tools/llvm-objcopy/MachO/MachOConfig.h
+++ b/llvm/include/llvm/ObjCopy/MachO/MachOConfig.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_OBJCOPY_MACHO_MACHOCONFIG_H
-#define LLVM_TOOLS_LLVM_OBJCOPY_MACHO_MACHOCONFIG_H
+#ifndef LLVM_OBJCOPY_MACHO_MACHOCONFIG_H
+#define LLVM_OBJCOPY_MACHO_MACHOCONFIG_H
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
@@ -40,4 +40,4 @@ struct MachOConfig {
} // namespace objcopy
} // namespace llvm
-#endif // LLVM_TOOLS_LLVM_OBJCOPY_MACHO_MACHOCONFIG_H
+#endif // LLVM_OBJCOPY_MACHO_MACHOCONFIG_H
diff --git a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.h b/llvm/include/llvm/ObjCopy/MachO/MachOObjcopy.h
similarity index 89%
rename from llvm/tools/llvm-objcopy/MachO/MachOObjcopy.h
rename to llvm/include/llvm/ObjCopy/MachO/MachOObjcopy.h
index d03eee9d5fdbb..79f6ba4cf8a84 100644
--- a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.h
+++ b/llvm/include/llvm/ObjCopy/MachO/MachOObjcopy.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_OBJCOPY_MACHOOBJCOPY_H
-#define LLVM_TOOLS_OBJCOPY_MACHOOBJCOPY_H
+#ifndef LLVM_OBJCOPY_MACHO_MACHOOBJCOPY_H
+#define LLVM_OBJCOPY_MACHO_MACHOOBJCOPY_H
namespace llvm {
class Error;
@@ -36,4 +36,4 @@ Error executeObjcopyOnMachOUniversalBinary(
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_OBJCOPY_MACHOOBJCOPY_H
+#endif // LLVM_OBJCOPY_MACHO_MACHOOBJCOPY_H
diff --git a/llvm/tools/llvm-objcopy/MultiFormatConfig.h b/llvm/include/llvm/ObjCopy/MultiFormatConfig.h
similarity index 86%
rename from llvm/tools/llvm-objcopy/MultiFormatConfig.h
rename to llvm/include/llvm/ObjCopy/MultiFormatConfig.h
index 31d9883d6d3a3..022751b6228bb 100644
--- a/llvm/tools/llvm-objcopy/MultiFormatConfig.h
+++ b/llvm/include/llvm/ObjCopy/MultiFormatConfig.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_OBJCOPY_MULTIFORMATCONFIG_H
-#define LLVM_TOOLS_LLVM_OBJCOPY_MULTIFORMATCONFIG_H
+#ifndef LLVM_OBJCOPY_MULTIFORMATCONFIG_H
+#define LLVM_OBJCOPY_MULTIFORMATCONFIG_H
#include "llvm/Support/Error.h"
@@ -34,4 +34,4 @@ class MultiFormatConfig {
} // namespace objcopy
} // namespace llvm
-#endif // LLVM_TOOLS_LLVM_OBJCOPY_MULTIFORMATCONFIG_H
+#endif // LLVM_OBJCOPY_MULTIFORMATCONFIG_H
diff --git a/llvm/include/llvm/ObjCopy/ObjCopy.h b/llvm/include/llvm/ObjCopy/ObjCopy.h
new file mode 100644
index 0000000000000..023814002c727
--- /dev/null
+++ b/llvm/include/llvm/ObjCopy/ObjCopy.h
@@ -0,0 +1,42 @@
+//===- ObjCopy.h ------------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_OBJCOPY_OBJCOPY_H
+#define LLVM_OBJCOPY_OBJCOPY_H
+
+#include "llvm/Support/Error.h"
+
+namespace llvm {
+class raw_ostream;
+
+namespace object {
+class Archive;
+class Binary;
+} // end namespace object
+
+namespace objcopy {
+class MultiFormatConfig;
+
+/// Applies the transformations described by \p Config to
+/// each member in archive \p Ar.
+/// Writes a result in a file specified by \p Config.OutputFilename.
+/// \returns any Error encountered whilst performing the operation.
+Error executeObjcopyOnArchive(const MultiFormatConfig &Config,
+ const object::Archive &Ar);
+
+/// Applies the transformations described by \p Config to \p In and writes
+/// the result into \p Out. This function does the dispatch based on the
+/// format of the input binary (COFF, ELF, MachO or wasm).
+/// \returns any Error encountered whilst performing the operation.
+Error executeObjcopyOnBinary(const MultiFormatConfig &Config,
+ object::Binary &In, raw_ostream &Out);
+
+} // end namespace objcopy
+} // end namespace llvm
+
+#endif // LLVM_OBJCOPY_OBJCOPY_H
diff --git a/llvm/tools/llvm-objcopy/wasm/WasmConfig.h b/llvm/include/llvm/ObjCopy/wasm/WasmConfig.h
similarity index 78%
rename from llvm/tools/llvm-objcopy/wasm/WasmConfig.h
rename to llvm/include/llvm/ObjCopy/wasm/WasmConfig.h
index 4e40926ae4530..56a7055da9a77 100644
--- a/llvm/tools/llvm-objcopy/wasm/WasmConfig.h
+++ b/llvm/include/llvm/ObjCopy/wasm/WasmConfig.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_OBJCOPY_WASM_WASMCONFIG_H
-#define LLVM_TOOLS_LLVM_OBJCOPY_WASM_WASMCONFIG_H
+#ifndef LLVM_OBJCOPY_WASM_WASMCONFIG_H
+#define LLVM_OBJCOPY_WASM_WASMCONFIG_H
namespace llvm {
namespace objcopy {
@@ -18,4 +18,4 @@ struct WasmConfig {};
} // namespace objcopy
} // namespace llvm
-#endif // LLVM_TOOLS_LLVM_OBJCOPY_WASM_WASMCONFIG_H
+#endif // LLVM_OBJCOPY_WASM_WASMCONFIG_H
diff --git a/llvm/tools/llvm-objcopy/wasm/WasmObjcopy.h b/llvm/include/llvm/ObjCopy/wasm/WasmObjcopy.h
similarity index 83%
rename from llvm/tools/llvm-objcopy/wasm/WasmObjcopy.h
rename to llvm/include/llvm/ObjCopy/wasm/WasmObjcopy.h
index 28268e38c5849..36a9103a35df3 100644
--- a/llvm/tools/llvm-objcopy/wasm/WasmObjcopy.h
+++ b/llvm/include/llvm/ObjCopy/wasm/WasmObjcopy.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_OBJCOPY_WASM_WASMOBJCOPY_H
-#define LLVM_TOOLS_LLVM_OBJCOPY_WASM_WASMOBJCOPY_H
+#ifndef LLVM_OBJCOPY_WASM_WASMOBJCOPY_H
+#define LLVM_OBJCOPY_WASM_WASMOBJCOPY_H
namespace llvm {
class Error;
@@ -29,4 +29,4 @@ Error executeObjcopyOnBinary(const CommonConfig &Config, const WasmConfig &,
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_LLVM_OBJCOPY_WASM_WASMOBJCOPY_H
+#endif // LLVM_OBJCOPY_WASM_WASMOBJCOPY_H
diff --git a/llvm/lib/CMakeLists.txt b/llvm/lib/CMakeLists.txt
index 57bf209a67699..5ecdf5af956a3 100644
--- a/llvm/lib/CMakeLists.txt
+++ b/llvm/lib/CMakeLists.txt
@@ -21,6 +21,7 @@ add_subdirectory(Analysis)
add_subdirectory(LTO)
add_subdirectory(MC)
add_subdirectory(MCA)
+add_subdirectory(ObjCopy)
add_subdirectory(Object)
add_subdirectory(ObjectYAML)
add_subdirectory(Option)
diff --git a/llvm/lib/ObjCopy/Archive.cpp b/llvm/lib/ObjCopy/Archive.cpp
new file mode 100644
index 0000000000000..ef893ccb409cb
--- /dev/null
+++ b/llvm/lib/ObjCopy/Archive.cpp
@@ -0,0 +1,105 @@
+//===- Archive.cpp --------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "Archive.h"
+#include "llvm/ObjCopy/CommonConfig.h"
+#include "llvm/ObjCopy/MultiFormatConfig.h"
+#include "llvm/ObjCopy/ObjCopy.h"
+#include "llvm/Object/Error.h"
+#include "llvm/Support/FileOutputBuffer.h"
+#include "llvm/Support/SmallVectorMemoryBuffer.h"
+
+namespace llvm {
+namespace objcopy {
+
+using namespace llvm::object;
+
+Expected<std::vector<NewArchiveMember>>
+createNewArchiveMembers(const MultiFormatConfig &Config, const Archive &Ar) {
+ std::vector<NewArchiveMember> NewArchiveMembers;
+ Error Err = Error::success();
+ for (const Archive::Child &Child : Ar.children(Err)) {
+ Expected<StringRef> ChildNameOrErr = Child.getName();
+ if (!ChildNameOrErr)
+ return createFileError(Ar.getFileName(), ChildNameOrErr.takeError());
+
+ Expected<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary();
+ if (!ChildOrErr)
+ return createFileError(Ar.getFileName() + "(" + *ChildNameOrErr + ")",
+ ChildOrErr.takeError());
+
+ SmallVector<char, 0> Buffer;
+ raw_svector_ostream MemStream(Buffer);
+
+ if (Error E = executeObjcopyOnBinary(Config, *ChildOrErr->get(), MemStream))
+ return std::move(E);
+
+ Expected<NewArchiveMember> Member = NewArchiveMember::getOldMember(
+ Child, Config.getCommonConfig().DeterministicArchives);
+ if (!Member)
+ return createFileError(Ar.getFileName(), Member.takeError());
+
+ Member->Buf = std::make_unique<SmallVectorMemoryBuffer>(
+ std::move(Buffer), ChildNameOrErr.get());
+ Member->MemberName = Member->Buf->getBufferIdentifier();
+ NewArchiveMembers.push_back(std::move(*Member));
+ }
+ if (Err)
+ return createFileError(Config.getCommonConfig().InputFilename,
+ std::move(Err));
+ return std::move(NewArchiveMembers);
+}
+
+// For regular archives this function simply calls llvm::writeArchive,
+// For thin archives it writes the archive file itself as well as its members.
+static Error deepWriteArchive(StringRef ArcName,
+ ArrayRef<NewArchiveMember> NewMembers,
+ bool WriteSymtab, object::Archive::Kind Kind,
+ bool Deterministic, bool Thin) {
+ if (Error E = writeArchive(ArcName, NewMembers, WriteSymtab, Kind,
+ Deterministic, Thin))
+ return createFileError(ArcName, std::move(E));
+
+ if (!Thin)
+ return Error::success();
+
+ for (const NewArchiveMember &Member : NewMembers) {
+ // For regular files (as is the case for deepWriteArchive),
+ // FileOutputBuffer::create will return OnDiskBuffer.
+ // OnDiskBuffer uses a temporary file and then renames it. So in reality
+ // there is no inefficiency / duplicated in-memory buffers in this case. For
+ // now in-memory buffers can not be completely avoided since
+ // NewArchiveMember still requires them even though writeArchive does not
+ // write them on disk.
+ Expected<std::unique_ptr<FileOutputBuffer>> FB =
+ FileOutputBuffer::create(Member.MemberName, Member.Buf->getBufferSize(),
+ FileOutputBuffer::F_executable);
+ if (!FB)
+ return FB.takeError();
+ std::copy(Member.Buf->getBufferStart(), Member.Buf->getBufferEnd(),
+ (*FB)->getBufferStart());
+ if (Error E = (*FB)->commit())
+ return E;
+ }
+ return Error::success();
+}
+
+Error executeObjcopyOnArchive(const MultiFormatConfig &Config,
+ const object::Archive &Ar) {
+ Expected<std::vector<NewArchiveMember>> NewArchiveMembersOrErr =
+ createNewArchiveMembers(Config, Ar);
+ if (!NewArchiveMembersOrErr)
+ return NewArchiveMembersOrErr.takeError();
+ const CommonConfig &CommonConfig = Config.getCommonConfig();
+ return deepWriteArchive(CommonConfig.OutputFilename, *NewArchiveMembersOrErr,
+ Ar.hasSymbolTable(), Ar.kind(),
+ CommonConfig.DeterministicArchives, Ar.isThin());
+}
+
+} // end namespace objcopy
+} // end namespace llvm
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.h b/llvm/lib/ObjCopy/Archive.h
similarity index 61%
rename from llvm/tools/llvm-objcopy/llvm-objcopy.h
rename to llvm/lib/ObjCopy/Archive.h
index 182c95dc64c8c..08aae563505ce 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.h
+++ b/llvm/lib/ObjCopy/Archive.h
@@ -1,4 +1,4 @@
-//===- llvm-objcopy.h -------------------------------------------*- C++ -*-===//
+//===- Archive.h ------------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,24 +6,21 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_OBJCOPY_OBJCOPY_H
-#define LLVM_TOOLS_OBJCOPY_OBJCOPY_H
+#ifndef LLVM_LIB_OBJCOPY_ARCHIVE_H
+#define LLVM_LIB_OBJCOPY_ARCHIVE_H
+#include "llvm/Object/ArchiveWriter.h"
#include "llvm/Support/Error.h"
-#include "llvm/Support/raw_ostream.h"
+#include <vector>
namespace llvm {
-
-struct NewArchiveMember;
-
-namespace object {
-
-class Archive;
-
-} // end namespace object
-
namespace objcopy {
+
class MultiFormatConfig;
+
+/// Applies the transformations described by \p Config to
+/// each member in archive \p Ar.
+/// \returns Vector of transformed archive members.
Expected<std::vector<NewArchiveMember>>
createNewArchiveMembers(const MultiFormatConfig &Config,
const object::Archive &Ar);
@@ -31,4 +28,4 @@ createNewArchiveMembers(const MultiFormatConfig &Config,
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_OBJCOPY_OBJCOPY_H
+#endif // LLVM_LIB_OBJCOPY_ARCHIVE_H
diff --git a/llvm/lib/ObjCopy/CMakeLists.txt b/llvm/lib/ObjCopy/CMakeLists.txt
new file mode 100644
index 0000000000000..c272d2637bdcc
--- /dev/null
+++ b/llvm/lib/ObjCopy/CMakeLists.txt
@@ -0,0 +1,31 @@
+add_llvm_component_library(LLVMObjCopy
+ Archive.cpp
+ ObjCopy.cpp
+ ConfigManager.cpp
+ COFF/COFFObjcopy.cpp
+ COFF/Object.cpp
+ COFF/Reader.cpp
+ COFF/Writer.cpp
+ ELF/ELFObjcopy.cpp
+ ELF/Object.cpp
+ MachO/MachOObjcopy.cpp
+ MachO/MachOReader.cpp
+ MachO/MachOWriter.cpp
+ MachO/MachOLayoutBuilder.cpp
+ MachO/Object.cpp
+ wasm/Object.cpp
+ wasm/Reader.cpp
+ wasm/Writer.cpp
+ wasm/WasmObjcopy.cpp
+
+ ADDITIONAL_HEADER_DIRS
+ ${LLVM_MAIN_INCLUDE_DIR}/llvm/Object
+
+ DEPENDS
+ intrinsics_gen
+
+ LINK_COMPONENTS
+ Object
+ Support
+ MC
+ )
diff --git a/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp b/llvm/lib/ObjCopy/COFF/COFFObjcopy.cpp
similarity index 98%
rename from llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
rename to llvm/lib/ObjCopy/COFF/COFFObjcopy.cpp
index e93d2775665dd..31801231e46be 100644
--- a/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
+++ b/llvm/lib/ObjCopy/COFF/COFFObjcopy.cpp
@@ -6,12 +6,12 @@
//
//===----------------------------------------------------------------------===//
-#include "COFFObjcopy.h"
-#include "COFFConfig.h"
-#include "CommonConfig.h"
+#include "llvm/ObjCopy/COFF/COFFObjcopy.h"
#include "Object.h"
#include "Reader.h"
#include "Writer.h"
+#include "llvm/ObjCopy/COFF/COFFConfig.h"
+#include "llvm/ObjCopy/CommonConfig.h"
#include "llvm/Object/Binary.h"
#include "llvm/Object/COFF.h"
diff --git a/llvm/tools/llvm-objcopy/COFF/Object.cpp b/llvm/lib/ObjCopy/COFF/Object.cpp
similarity index 100%
rename from llvm/tools/llvm-objcopy/COFF/Object.cpp
rename to llvm/lib/ObjCopy/COFF/Object.cpp
diff --git a/llvm/tools/llvm-objcopy/COFF/Object.h b/llvm/lib/ObjCopy/COFF/Object.h
similarity index 98%
rename from llvm/tools/llvm-objcopy/COFF/Object.h
rename to llvm/lib/ObjCopy/COFF/Object.h
index 4a478cda8c151..2f4d8af41fdee 100644
--- a/llvm/tools/llvm-objcopy/COFF/Object.h
+++ b/llvm/lib/ObjCopy/COFF/Object.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_OBJCOPY_COFF_OBJECT_H
-#define LLVM_TOOLS_OBJCOPY_COFF_OBJECT_H
+#ifndef LLVM_LIB_OBJCOPY_COFF_OBJECT_H
+#define LLVM_LIB_OBJCOPY_COFF_OBJECT_H
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
@@ -209,4 +209,4 @@ void copyPeHeader(PeHeader1Ty &Dest, const PeHeader2Ty &Src) {
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_OBJCOPY_COFF_OBJECT_H
+#endif // LLVM_LIB_OBJCOPY_COFF_OBJECT_H
diff --git a/llvm/tools/llvm-objcopy/COFF/Reader.cpp b/llvm/lib/ObjCopy/COFF/Reader.cpp
similarity index 100%
rename from llvm/tools/llvm-objcopy/COFF/Reader.cpp
rename to llvm/lib/ObjCopy/COFF/Reader.cpp
diff --git a/llvm/tools/llvm-objcopy/COFF/Reader.h b/llvm/lib/ObjCopy/COFF/Reader.h
similarity index 89%
rename from llvm/tools/llvm-objcopy/COFF/Reader.h
rename to llvm/lib/ObjCopy/COFF/Reader.h
index 48c050b6ea115..9e4d5124829c7 100644
--- a/llvm/tools/llvm-objcopy/COFF/Reader.h
+++ b/llvm/lib/ObjCopy/COFF/Reader.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_OBJCOPY_COFF_READER_H
-#define LLVM_TOOLS_OBJCOPY_COFF_READER_H
+#ifndef LLVM_LIB_OBJCOPY_COFF_READER_H
+#define LLVM_LIB_OBJCOPY_COFF_READER_H
#include "llvm/BinaryFormat/COFF.h"
#include "llvm/Object/COFF.h"
@@ -38,4 +38,4 @@ class COFFReader {
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_OBJCOPY_COFF_READER_H
+#endif // LLVM_LIB_OBJCOPY_COFF_READER_H
diff --git a/llvm/tools/llvm-objcopy/COFF/Writer.cpp b/llvm/lib/ObjCopy/COFF/Writer.cpp
similarity index 100%
rename from llvm/tools/llvm-objcopy/COFF/Writer.cpp
rename to llvm/lib/ObjCopy/COFF/Writer.cpp
diff --git a/llvm/tools/llvm-objcopy/COFF/Writer.h b/llvm/lib/ObjCopy/COFF/Writer.h
similarity index 92%
rename from llvm/tools/llvm-objcopy/COFF/Writer.h
rename to llvm/lib/ObjCopy/COFF/Writer.h
index eed43b3e58146..5856c0f30b9f0 100644
--- a/llvm/tools/llvm-objcopy/COFF/Writer.h
+++ b/llvm/lib/ObjCopy/COFF/Writer.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_OBJCOPY_COFF_WRITER_H
-#define LLVM_TOOLS_OBJCOPY_COFF_WRITER_H
+#ifndef LLVM_LIB_OBJCOPY_COFF_WRITER_H
+#define LLVM_LIB_OBJCOPY_COFF_WRITER_H
#include "llvm/MC/StringTableBuilder.h"
#include "llvm/Support/Error.h"
@@ -60,4 +60,4 @@ class COFFWriter {
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_OBJCOPY_COFF_WRITER_H
+#endif // LLVM_LIB_OBJCOPY_COFF_WRITER_H
diff --git a/llvm/lib/ObjCopy/ConfigManager.cpp b/llvm/lib/ObjCopy/ConfigManager.cpp
new file mode 100644
index 0000000000000..6f6e1bd1a74f8
--- /dev/null
+++ b/llvm/lib/ObjCopy/ConfigManager.cpp
@@ -0,0 +1,70 @@
+//===- ConfigManager.cpp --------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ObjCopy/ConfigManager.h"
+#include "llvm/Support/Errc.h"
+#include "llvm/Support/Error.h"
+
+namespace llvm {
+namespace objcopy {
+
+Expected<const COFFConfig &> ConfigManager::getCOFFConfig() const {
+ if (!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
+ !Common.AllocSectionsPrefix.empty() || !Common.DumpSection.empty() ||
+ !Common.KeepSection.empty() || !Common.SymbolsToGlobalize.empty() ||
+ !Common.SymbolsToKeep.empty() || !Common.SymbolsToLocalize.empty() ||
+ !Common.SymbolsToWeaken.empty() || !Common.SymbolsToKeepGlobal.empty() ||
+ !Common.SectionsToRename.empty() || !Common.SetSectionAlignment.empty() ||
+ Common.ExtractDWO || Common.PreserveDates || Common.StripDWO ||
+ Common.StripNonAlloc || Common.StripSections || Common.Weaken ||
+ Common.DecompressDebugSections ||
+ Common.DiscardMode == DiscardType::Locals || !Common.SymbolsToAdd.empty())
+ return createStringError(llvm::errc::invalid_argument,
+ "option is not supported for COFF");
+
+ return COFF;
+}
+
+Expected<const MachOConfig &> ConfigManager::getMachOConfig() const {
+ if (!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
+ !Common.AllocSectionsPrefix.empty() || !Common.KeepSection.empty() ||
+ !Common.SymbolsToGlobalize.empty() || !Common.SymbolsToKeep.empty() ||
+ !Common.SymbolsToLocalize.empty() || !Common.SymbolsToWeaken.empty() ||
+ !Common.SymbolsToKeepGlobal.empty() || !Common.SectionsToRename.empty() ||
+ !Common.UnneededSymbolsToRemove.empty() ||
+ !Common.SetSectionAlignment.empty() || !Common.SetSectionFlags.empty() ||
+ Common.ExtractDWO || Common.PreserveDates || Common.StripAllGNU ||
+ Common.StripDWO || Common.StripNonAlloc || Common.StripSections ||
+ Common.Weaken || Common.DecompressDebugSections || Common.StripUnneeded ||
+ Common.DiscardMode == DiscardType::Locals || !Common.SymbolsToAdd.empty())
+ return createStringError(llvm::errc::invalid_argument,
+ "option is not supported for MachO");
+
+ return MachO;
+}
+
+Expected<const WasmConfig &> ConfigManager::getWasmConfig() const {
+ if (!Common.AddGnuDebugLink.empty() || Common.ExtractPartition ||
+ !Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
+ !Common.AllocSectionsPrefix.empty() ||
+ Common.DiscardMode != DiscardType::None || !Common.SymbolsToAdd.empty() ||
+ !Common.SymbolsToGlobalize.empty() || !Common.SymbolsToLocalize.empty() ||
+ !Common.SymbolsToKeep.empty() || !Common.SymbolsToRemove.empty() ||
+ !Common.UnneededSymbolsToRemove.empty() ||
+ !Common.SymbolsToWeaken.empty() || !Common.SymbolsToKeepGlobal.empty() ||
+ !Common.SectionsToRename.empty() || !Common.SetSectionAlignment.empty() ||
+ !Common.SetSectionFlags.empty() || !Common.SymbolsToRename.empty())
+ return createStringError(llvm::errc::invalid_argument,
+ "only flags for section dumping, removal, and "
+ "addition are supported");
+
+ return Wasm;
+}
+
+} // end namespace objcopy
+} // end namespace llvm
diff --git a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
similarity index 99%
rename from llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
rename to llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
index f8521fa0d5b70..9e41a04919522 100644
--- a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
@@ -6,11 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#include "ELFObjcopy.h"
-#include "CommonConfig.h"
-#include "ELFConfig.h"
+#include "llvm/ObjCopy/ELF/ELFObjcopy.h"
#include "Object.h"
-#include "llvm-objcopy.h"
#include "llvm/ADT/BitmaskEnum.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/Optional.h"
@@ -20,6 +17,8 @@
#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/MC/MCTargetOptions.h"
+#include "llvm/ObjCopy/CommonConfig.h"
+#include "llvm/ObjCopy/ELF/ELFConfig.h"
#include "llvm/Object/Binary.h"
#include "llvm/Object/ELFObjectFile.h"
#include "llvm/Object/ELFTypes.h"
@@ -169,7 +168,7 @@ static std::unique_ptr<Writer> createWriter(const CommonConfig &Config,
template <class... Ts>
static Error makeStringError(std::error_code EC, const Twine &Msg,
- Ts &&... Args) {
+ Ts &&...Args) {
std::string FullMsg = (EC.message() + ": " + Msg).str();
return createStringError(EC, FullMsg.c_str(), std::forward<Ts>(Args)...);
}
diff --git a/llvm/tools/llvm-objcopy/ELF/Object.cpp b/llvm/lib/ObjCopy/ELF/Object.cpp
similarity index 99%
rename from llvm/tools/llvm-objcopy/ELF/Object.cpp
rename to llvm/lib/ObjCopy/ELF/Object.cpp
index 3b4152a74a4af..be255470ebc8e 100644
--- a/llvm/tools/llvm-objcopy/ELF/Object.cpp
+++ b/llvm/lib/ObjCopy/ELF/Object.cpp
@@ -1813,9 +1813,9 @@ template <class ELFT> Error ELFBuilder<ELFT>::readSectionHeaders() {
Sec->EntrySize = Shdr.sh_entsize;
Sec->Index = Index++;
Sec->OriginalIndex = Sec->Index;
- Sec->OriginalData =
- ArrayRef<uint8_t>(ElfFile.base() + Shdr.sh_offset,
- (Shdr.sh_type == SHT_NOBITS) ? (size_t)0 : Shdr.sh_size);
+ Sec->OriginalData = ArrayRef<uint8_t>(
+ ElfFile.base() + Shdr.sh_offset,
+ (Shdr.sh_type == SHT_NOBITS) ? (size_t)0 : Shdr.sh_size);
}
return Error::success();
diff --git a/llvm/tools/llvm-objcopy/ELF/Object.h b/llvm/lib/ObjCopy/ELF/Object.h
similarity index 99%
rename from llvm/tools/llvm-objcopy/ELF/Object.h
rename to llvm/lib/ObjCopy/ELF/Object.h
index 681ab8f56381c..b14f7f2c72384 100644
--- a/llvm/tools/llvm-objcopy/ELF/Object.h
+++ b/llvm/lib/ObjCopy/ELF/Object.h
@@ -6,15 +6,15 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_OBJCOPY_OBJECT_H
-#define LLVM_TOOLS_OBJCOPY_OBJECT_H
+#ifndef LLVM_LIB_OBJCOPY_ELF_OBJECT_H
+#define LLVM_LIB_OBJCOPY_ELF_OBJECT_H
-#include "CommonConfig.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/MC/StringTableBuilder.h"
+#include "llvm/ObjCopy/CommonConfig.h"
#include "llvm/Object/ELFObjectFile.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/FileOutputBuffer.h"
@@ -998,7 +998,7 @@ class IHexReader : public Reader {
std::move(E));
}
template <typename... Ts>
- Error parseError(size_t LineNo, char const *Fmt, const Ts &... Vals) const {
+ Error parseError(size_t LineNo, char const *Fmt, const Ts &...Vals) const {
Error E = createStringError(errc::invalid_argument, Fmt, Vals...);
return parseError(LineNo, std::move(E));
}
@@ -1088,7 +1088,7 @@ class Object {
std::function<bool(const SectionBase &)> ToRemove);
Error replaceSections(const DenseMap<SectionBase *, SectionBase *> &FromTo);
Error removeSymbols(function_ref<bool(const Symbol &)> ToRemove);
- template <class T, class... Ts> T &addSection(Ts &&... Args) {
+ template <class T, class... Ts> T &addSection(Ts &&...Args) {
auto Sec = std::make_unique<T>(std::forward<Ts>(Args)...);
auto Ptr = Sec.get();
MustBeRelocatable |= isa<RelocationSection>(*Ptr);
@@ -1110,4 +1110,4 @@ class Object {
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_OBJCOPY_OBJECT_H
+#endif // LLVM_LIB_OBJCOPY_ELF_OBJECT_H
diff --git a/llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp b/llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp
similarity index 100%
rename from llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp
rename to llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.cpp
diff --git a/llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.h b/llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.h
similarity index 94%
rename from llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.h
rename to llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.h
index 44d03b4af7e83..709534306fda9 100644
--- a/llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.h
+++ b/llvm/lib/ObjCopy/MachO/MachOLayoutBuilder.h
@@ -6,11 +6,11 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_OBJCOPY_MACHO_MACHOLAYOUTBUILDER_H
-#define LLVM_OBJCOPY_MACHO_MACHOLAYOUTBUILDER_H
+#ifndef LLVM_LIB_OBJCOPY_MACHO_MACHOLAYOUTBUILDER_H
+#define LLVM_LIB_OBJCOPY_MACHO_MACHOLAYOUTBUILDER_H
-#include "MachOObjcopy.h"
#include "Object.h"
+#include "llvm/ObjCopy/MachO/MachOObjcopy.h"
namespace llvm {
namespace objcopy {
@@ -94,4 +94,4 @@ class MachOLayoutBuilder {
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_OBJCOPY_MACHO_MACHOLAYOUTBUILDER_H
+#endif // LLVM_LIB_OBJCOPY_MACHO_MACHOLAYOUTBUILDER_H
diff --git a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp b/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp
similarity index 98%
rename from llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp
rename to llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp
index 0f92ca516bef7..b8e21222aa3e1 100644
--- a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp
+++ b/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp
@@ -6,14 +6,15 @@
//
//===----------------------------------------------------------------------===//
-#include "MachOObjcopy.h"
-#include "../llvm-objcopy.h"
-#include "CommonConfig.h"
-#include "MachO/MachOConfig.h"
+#include "llvm/ObjCopy/MachO/MachOObjcopy.h"
+#include "Archive.h"
#include "MachOReader.h"
#include "MachOWriter.h"
-#include "MultiFormatConfig.h"
#include "llvm/ADT/DenseSet.h"
+#include "llvm/ObjCopy/CommonConfig.h"
+#include "llvm/ObjCopy/MachO/MachOConfig.h"
+#include "llvm/ObjCopy/MultiFormatConfig.h"
+#include "llvm/ObjCopy/ObjCopy.h"
#include "llvm/Object/ArchiveWriter.h"
#include "llvm/Object/MachOUniversal.h"
#include "llvm/Object/MachOUniversalWriter.h"
diff --git a/llvm/tools/llvm-objcopy/MachO/MachOReader.cpp b/llvm/lib/ObjCopy/MachO/MachOReader.cpp
similarity index 100%
rename from llvm/tools/llvm-objcopy/MachO/MachOReader.cpp
rename to llvm/lib/ObjCopy/MachO/MachOReader.cpp
diff --git a/llvm/tools/llvm-objcopy/MachO/MachOReader.h b/llvm/lib/ObjCopy/MachO/MachOReader.h
similarity index 91%
rename from llvm/tools/llvm-objcopy/MachO/MachOReader.h
rename to llvm/lib/ObjCopy/MachO/MachOReader.h
index b29e86ca642e4..fee2112845a5e 100644
--- a/llvm/tools/llvm-objcopy/MachO/MachOReader.h
+++ b/llvm/lib/ObjCopy/MachO/MachOReader.h
@@ -6,9 +6,12 @@
//
//===----------------------------------------------------------------------===//
-#include "MachOObjcopy.h"
+#ifndef LLVM_LIB_OBJCOPY_MACHO_MACHOREADER_H
+#define LLVM_LIB_OBJCOPY_MACHO_MACHOREADER_H
+
#include "Object.h"
#include "llvm/BinaryFormat/MachO.h"
+#include "llvm/ObjCopy/MachO/MachOObjcopy.h"
#include "llvm/Object/MachO.h"
#include <memory>
@@ -55,3 +58,5 @@ class MachOReader : public Reader {
} // end namespace macho
} // end namespace objcopy
} // end namespace llvm
+
+#endif // LLVM_LIB_OBJCOPY_MACHO_MACHOREADER_H
diff --git a/llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp b/llvm/lib/ObjCopy/MachO/MachOWriter.cpp
similarity index 100%
rename from llvm/tools/llvm-objcopy/MachO/MachOWriter.cpp
rename to llvm/lib/ObjCopy/MachO/MachOWriter.cpp
diff --git a/llvm/tools/llvm-objcopy/MachO/MachOWriter.h b/llvm/lib/ObjCopy/MachO/MachOWriter.h
similarity index 91%
rename from llvm/tools/llvm-objcopy/MachO/MachOWriter.h
rename to llvm/lib/ObjCopy/MachO/MachOWriter.h
index a172534dac8a3..2898df6c4bf0f 100644
--- a/llvm/tools/llvm-objcopy/MachO/MachOWriter.h
+++ b/llvm/lib/ObjCopy/MachO/MachOWriter.h
@@ -6,10 +6,13 @@
//
//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H
+#define LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H
+
#include "MachOLayoutBuilder.h"
-#include "MachOObjcopy.h"
#include "Object.h"
#include "llvm/BinaryFormat/MachO.h"
+#include "llvm/ObjCopy/MachO/MachOObjcopy.h"
#include "llvm/Object/MachO.h"
namespace llvm {
@@ -69,3 +72,5 @@ class MachOWriter {
} // end namespace macho
} // end namespace objcopy
} // end namespace llvm
+
+#endif // LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H
diff --git a/llvm/tools/llvm-objcopy/MachO/Object.cpp b/llvm/lib/ObjCopy/MachO/Object.cpp
similarity index 100%
rename from llvm/tools/llvm-objcopy/MachO/Object.cpp
rename to llvm/lib/ObjCopy/MachO/Object.cpp
diff --git a/llvm/tools/llvm-objcopy/MachO/Object.h b/llvm/lib/ObjCopy/MachO/Object.h
similarity index 99%
rename from llvm/tools/llvm-objcopy/MachO/Object.h
rename to llvm/lib/ObjCopy/MachO/Object.h
index 13aaf42634b09..bb7f1fa81800f 100644
--- a/llvm/tools/llvm-objcopy/MachO/Object.h
+++ b/llvm/lib/ObjCopy/MachO/Object.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_OBJCOPY_MACHO_OBJECT_H
-#define LLVM_OBJCOPY_MACHO_OBJECT_H
+#ifndef LLVM_LIB_OBJCOPY_MACHO_OBJECT_H
+#define LLVM_LIB_OBJCOPY_MACHO_OBJECT_H
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/StringRef.h"
@@ -371,4 +371,4 @@ struct Object {
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_OBJCOPY_MACHO_OBJECT_H
+#endif // LLVM_LIB_OBJCOPY_MACHO_OBJECT_H
diff --git a/llvm/lib/ObjCopy/ObjCopy.cpp b/llvm/lib/ObjCopy/ObjCopy.cpp
new file mode 100644
index 0000000000000..a62f476567f56
--- /dev/null
+++ b/llvm/lib/ObjCopy/ObjCopy.cpp
@@ -0,0 +1,79 @@
+//===- Objcopy.cpp --------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ObjCopy/ObjCopy.h"
+#include "llvm/ObjCopy/COFF/COFFConfig.h"
+#include "llvm/ObjCopy/COFF/COFFObjcopy.h"
+#include "llvm/ObjCopy/CommonConfig.h"
+#include "llvm/ObjCopy/ELF/ELFConfig.h"
+#include "llvm/ObjCopy/ELF/ELFObjcopy.h"
+#include "llvm/ObjCopy/MachO/MachOConfig.h"
+#include "llvm/ObjCopy/MachO/MachOObjcopy.h"
+#include "llvm/ObjCopy/MultiFormatConfig.h"
+#include "llvm/ObjCopy/wasm/WasmConfig.h"
+#include "llvm/ObjCopy/wasm/WasmObjcopy.h"
+#include "llvm/Object/COFF.h"
+#include "llvm/Object/ELFObjectFile.h"
+#include "llvm/Object/Error.h"
+#include "llvm/Object/MachO.h"
+#include "llvm/Object/MachOUniversal.h"
+#include "llvm/Object/Wasm.h"
+#include "llvm/Support/SmallVectorMemoryBuffer.h"
+
+namespace llvm {
+namespace objcopy {
+
+using namespace llvm::object;
+
+/// The function executeObjcopyOnBinary does the dispatch based on the format
+/// of the input binary (ELF, MachO or COFF).
+Error executeObjcopyOnBinary(const MultiFormatConfig &Config,
+ object::Binary &In, raw_ostream &Out) {
+ if (auto *ELFBinary = dyn_cast<object::ELFObjectFileBase>(&In)) {
+ Expected<const ELFConfig &> ELFConfig = Config.getELFConfig();
+ if (!ELFConfig)
+ return ELFConfig.takeError();
+
+ return elf::executeObjcopyOnBinary(Config.getCommonConfig(), *ELFConfig,
+ *ELFBinary, Out);
+ }
+ if (auto *COFFBinary = dyn_cast<object::COFFObjectFile>(&In)) {
+ Expected<const COFFConfig &> COFFConfig = Config.getCOFFConfig();
+ if (!COFFConfig)
+ return COFFConfig.takeError();
+
+ return coff::executeObjcopyOnBinary(Config.getCommonConfig(), *COFFConfig,
+ *COFFBinary, Out);
+ }
+ if (auto *MachOBinary = dyn_cast<object::MachOObjectFile>(&In)) {
+ Expected<const MachOConfig &> MachOConfig = Config.getMachOConfig();
+ if (!MachOConfig)
+ return MachOConfig.takeError();
+
+ return macho::executeObjcopyOnBinary(Config.getCommonConfig(), *MachOConfig,
+ *MachOBinary, Out);
+ }
+ if (auto *MachOUniversalBinary =
+ dyn_cast<object::MachOUniversalBinary>(&In)) {
+ return macho::executeObjcopyOnMachOUniversalBinary(
+ Config, *MachOUniversalBinary, Out);
+ }
+ if (auto *WasmBinary = dyn_cast<object::WasmObjectFile>(&In)) {
+ Expected<const WasmConfig &> WasmConfig = Config.getWasmConfig();
+ if (!WasmConfig)
+ return WasmConfig.takeError();
+
+ return objcopy::wasm::executeObjcopyOnBinary(Config.getCommonConfig(),
+ *WasmConfig, *WasmBinary, Out);
+ }
+ return createStringError(object_error::invalid_file_type,
+ "unsupported object file format");
+}
+
+} // end namespace objcopy
+} // end namespace llvm
diff --git a/llvm/tools/llvm-objcopy/wasm/Object.cpp b/llvm/lib/ObjCopy/wasm/Object.cpp
similarity index 100%
rename from llvm/tools/llvm-objcopy/wasm/Object.cpp
rename to llvm/lib/ObjCopy/wasm/Object.cpp
diff --git a/llvm/tools/llvm-objcopy/wasm/Object.h b/llvm/lib/ObjCopy/wasm/Object.h
similarity index 90%
rename from llvm/tools/llvm-objcopy/wasm/Object.h
rename to llvm/lib/ObjCopy/wasm/Object.h
index 9db91c41e2e26..e58fc8c454962 100644
--- a/llvm/tools/llvm-objcopy/wasm/Object.h
+++ b/llvm/lib/ObjCopy/wasm/Object.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_OBJCOPY_WASM_OBJECT_H
-#define LLVM_TOOLS_LLVM_OBJCOPY_WASM_OBJECT_H
+#ifndef LLVM_LIB_OBJCOPY_WASM_OBJECT_H
+#define LLVM_LIB_OBJCOPY_WASM_OBJECT_H
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
@@ -44,4 +44,4 @@ struct Object {
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_LLVM_OBJCOPY_WASM_OBJECT_H
+#endif // LLVM_LIB_OBJCOPY_WASM_OBJECT_H
diff --git a/llvm/tools/llvm-objcopy/wasm/Reader.cpp b/llvm/lib/ObjCopy/wasm/Reader.cpp
similarity index 100%
rename from llvm/tools/llvm-objcopy/wasm/Reader.cpp
rename to llvm/lib/ObjCopy/wasm/Reader.cpp
diff --git a/llvm/tools/llvm-objcopy/wasm/Reader.h b/llvm/lib/ObjCopy/wasm/Reader.h
similarity index 83%
rename from llvm/tools/llvm-objcopy/wasm/Reader.h
rename to llvm/lib/ObjCopy/wasm/Reader.h
index 2dcf7dde029a0..d8dd541894541 100644
--- a/llvm/tools/llvm-objcopy/wasm/Reader.h
+++ b/llvm/lib/ObjCopy/wasm/Reader.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_OBJCOPY_WASM_READER_H
-#define LLVM_TOOLS_LLVM_OBJCOPY_WASM_READER_H
+#ifndef LLVM_LIB_OBJCOPY_WASM_READER_H
+#define LLVM_LIB_OBJCOPY_WASM_READER_H
#include "Object.h"
@@ -28,4 +28,4 @@ class Reader {
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_LLVM_OBJCOPY_WASM_READER_H
+#endif // LLVM_LIB_OBJCOPY_WASM_READER_H
diff --git a/llvm/tools/llvm-objcopy/wasm/WasmObjcopy.cpp b/llvm/lib/ObjCopy/wasm/WasmObjcopy.cpp
similarity index 98%
rename from llvm/tools/llvm-objcopy/wasm/WasmObjcopy.cpp
rename to llvm/lib/ObjCopy/wasm/WasmObjcopy.cpp
index 397d09757e54c..69b5e6fe8bee4 100644
--- a/llvm/tools/llvm-objcopy/wasm/WasmObjcopy.cpp
+++ b/llvm/lib/ObjCopy/wasm/WasmObjcopy.cpp
@@ -6,11 +6,11 @@
//
//===----------------------------------------------------------------------===//
-#include "WasmObjcopy.h"
-#include "CommonConfig.h"
+#include "llvm/ObjCopy/wasm/WasmObjcopy.h"
#include "Object.h"
#include "Reader.h"
#include "Writer.h"
+#include "llvm/ObjCopy/CommonConfig.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/FileOutputBuffer.h"
diff --git a/llvm/tools/llvm-objcopy/wasm/Writer.cpp b/llvm/lib/ObjCopy/wasm/Writer.cpp
similarity index 100%
rename from llvm/tools/llvm-objcopy/wasm/Writer.cpp
rename to llvm/lib/ObjCopy/wasm/Writer.cpp
diff --git a/llvm/tools/llvm-objcopy/wasm/Writer.h b/llvm/lib/ObjCopy/wasm/Writer.h
similarity index 91%
rename from llvm/tools/llvm-objcopy/wasm/Writer.h
rename to llvm/lib/ObjCopy/wasm/Writer.h
index 4404cd8caf843..332b96e892516 100644
--- a/llvm/tools/llvm-objcopy/wasm/Writer.h
+++ b/llvm/lib/ObjCopy/wasm/Writer.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_OBJCOPY_WASM_WRITER_H
-#define LLVM_TOOLS_LLVM_OBJCOPY_WASM_WRITER_H
+#ifndef LLVM_LIB_OBJCOPY_WASM_WRITER_H
+#define LLVM_LIB_OBJCOPY_WASM_WRITER_H
#include "Object.h"
#include <cstdint>
@@ -46,4 +46,4 @@ class Writer {
} // end namespace objcopy
} // end namespace llvm
-#endif // LLVM_TOOLS_LLVM_OBJCOPY_WASM_WRITER_H
+#endif // LLVM_LIB_OBJCOPY_WASM_WRITER_H
diff --git a/llvm/tools/llvm-objcopy/CMakeLists.txt b/llvm/tools/llvm-objcopy/CMakeLists.txt
index d14d2135f5db7..99e884a8cf0fa 100644
--- a/llvm/tools/llvm-objcopy/CMakeLists.txt
+++ b/llvm/tools/llvm-objcopy/CMakeLists.txt
@@ -1,5 +1,6 @@
set(LLVM_LINK_COMPONENTS
Object
+ ObjCopy
Option
Support
MC
@@ -22,23 +23,8 @@ tablegen(LLVM StripOpts.inc -gen-opt-parser-defs)
add_public_tablegen_target(StripOptsTableGen)
add_llvm_tool(llvm-objcopy
- ConfigManager.cpp
+ ObjcopyOptions.cpp
llvm-objcopy.cpp
- COFF/COFFObjcopy.cpp
- COFF/Object.cpp
- COFF/Reader.cpp
- COFF/Writer.cpp
- ELF/ELFObjcopy.cpp
- ELF/Object.cpp
- MachO/MachOObjcopy.cpp
- MachO/MachOReader.cpp
- MachO/MachOWriter.cpp
- MachO/MachOLayoutBuilder.cpp
- MachO/Object.cpp
- wasm/Object.cpp
- wasm/Reader.cpp
- wasm/Writer.cpp
- wasm/WasmObjcopy.cpp
DEPENDS
ObjcopyOptsTableGen
InstallNameToolOptsTableGen
diff --git a/llvm/tools/llvm-objcopy/ConfigManager.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
similarity index 93%
rename from llvm/tools/llvm-objcopy/ConfigManager.cpp
rename to llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index 90730c421a46d..65bbd033d3c28 100644
--- a/llvm/tools/llvm-objcopy/ConfigManager.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -1,4 +1,4 @@
-//===- ConfigManager.cpp --------------------------------------------------===//
+//===- ObjcopyOptions.cpp -------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,12 +6,13 @@
//
//===----------------------------------------------------------------------===//
-#include "ConfigManager.h"
+#include "ObjcopyOptions.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/BinaryFormat/COFF.h"
+#include "llvm/ObjCopy/ConfigManager.h"
#include "llvm/Option/Arg.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/CRC.h"
@@ -20,8 +21,6 @@
#include "llvm/Support/Errc.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/MemoryBuffer.h"
-#include "llvm/Support/StringSaver.h"
-#include <memory>
using namespace llvm;
using namespace llvm::objcopy;
@@ -559,68 +558,6 @@ static Expected<NewSymbolInfo> parseNewSymbolInfo(StringRef FlagValue) {
return SI;
}
-Expected<const ELFConfig &> ConfigManager::getELFConfig() const {
- return ELF;
-}
-
-Expected<const COFFConfig &> ConfigManager::getCOFFConfig() const {
- if (!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
- !Common.AllocSectionsPrefix.empty() || !Common.DumpSection.empty() ||
- !Common.KeepSection.empty() || !Common.SymbolsToGlobalize.empty() ||
- !Common.SymbolsToKeep.empty() || !Common.SymbolsToLocalize.empty() ||
- !Common.SymbolsToWeaken.empty() || !Common.SymbolsToKeepGlobal.empty() ||
- !Common.SectionsToRename.empty() || !Common.SetSectionAlignment.empty() ||
- Common.ExtractDWO || Common.PreserveDates || Common.StripDWO ||
- Common.StripNonAlloc || Common.StripSections || Common.Weaken ||
- Common.DecompressDebugSections ||
- Common.DiscardMode == DiscardType::Locals ||
- !Common.SymbolsToAdd.empty()) {
- return createStringError(llvm::errc::invalid_argument,
- "option not supported by llvm-objcopy for COFF");
- }
-
- return COFF;
-}
-
-Expected<const MachOConfig &> ConfigManager::getMachOConfig() const {
- if (!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
- !Common.AllocSectionsPrefix.empty() || !Common.KeepSection.empty() ||
- !Common.SymbolsToGlobalize.empty() || !Common.SymbolsToKeep.empty() ||
- !Common.SymbolsToLocalize.empty() || !Common.SymbolsToWeaken.empty() ||
- !Common.SymbolsToKeepGlobal.empty() || !Common.SectionsToRename.empty() ||
- !Common.UnneededSymbolsToRemove.empty() ||
- !Common.SetSectionAlignment.empty() || !Common.SetSectionFlags.empty() ||
- Common.ExtractDWO || Common.PreserveDates || Common.StripAllGNU ||
- Common.StripDWO || Common.StripNonAlloc || Common.StripSections ||
- Common.Weaken || Common.DecompressDebugSections || Common.StripUnneeded ||
- Common.DiscardMode == DiscardType::Locals ||
- !Common.SymbolsToAdd.empty()) {
- return createStringError(llvm::errc::invalid_argument,
- "option not supported by llvm-objcopy for MachO");
- }
-
- return MachO;
-}
-
-Expected<const WasmConfig &> ConfigManager::getWasmConfig() const {
- if (!Common.AddGnuDebugLink.empty() || Common.ExtractPartition ||
- !Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
- !Common.AllocSectionsPrefix.empty() ||
- Common.DiscardMode != DiscardType::None || !Common.SymbolsToAdd.empty() ||
- !Common.SymbolsToGlobalize.empty() || !Common.SymbolsToLocalize.empty() ||
- !Common.SymbolsToKeep.empty() || !Common.SymbolsToRemove.empty() ||
- !Common.UnneededSymbolsToRemove.empty() ||
- !Common.SymbolsToWeaken.empty() || !Common.SymbolsToKeepGlobal.empty() ||
- !Common.SectionsToRename.empty() || !Common.SetSectionAlignment.empty() ||
- !Common.SetSectionFlags.empty() || !Common.SymbolsToRename.empty()) {
- return createStringError(
- llvm::errc::invalid_argument,
- "only flags for section dumping, removal, and addition are supported");
- }
-
- return Wasm;
-}
-
// ParseObjcopyOptions returns the config and sets the input arguments. If a
// help flag is set then ParseObjcopyOptions will print the help messege and
// exit.
@@ -695,11 +632,10 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> RawArgsArr,
MatchStyle SectionMatchStyle = InputArgs.hasArg(OBJCOPY_regex)
? MatchStyle::Regex
: MatchStyle::Wildcard;
- MatchStyle SymbolMatchStyle = InputArgs.hasArg(OBJCOPY_regex)
- ? MatchStyle::Regex
- : InputArgs.hasArg(OBJCOPY_wildcard)
- ? MatchStyle::Wildcard
- : MatchStyle::Literal;
+ MatchStyle SymbolMatchStyle
+ = InputArgs.hasArg(OBJCOPY_regex) ? MatchStyle::Regex
+ : InputArgs.hasArg(OBJCOPY_wildcard) ? MatchStyle::Wildcard
+ : MatchStyle::Literal;
StringRef InputFormat, OutputFormat;
if (InputArgs.hasArg(OBJCOPY_target)) {
InputFormat = InputArgs.getLastArgValue(OBJCOPY_target);
@@ -1337,11 +1273,10 @@ objcopy::parseStripOptions(ArrayRef<const char *> RawArgsArr,
"--regex and --wildcard are incompatible");
MatchStyle SectionMatchStyle =
InputArgs.hasArg(STRIP_regex) ? MatchStyle::Regex : MatchStyle::Wildcard;
- MatchStyle SymbolMatchStyle = InputArgs.hasArg(STRIP_regex)
- ? MatchStyle::Regex
- : InputArgs.hasArg(STRIP_wildcard)
- ? MatchStyle::Wildcard
- : MatchStyle::Literal;
+ MatchStyle SymbolMatchStyle
+ = InputArgs.hasArg(STRIP_regex) ? MatchStyle::Regex
+ : InputArgs.hasArg(STRIP_wildcard) ? MatchStyle::Wildcard
+ : MatchStyle::Literal;
ELFConfig.AllowBrokenLinks = InputArgs.hasArg(STRIP_allow_broken_links);
Config.StripDebug = InputArgs.hasArg(STRIP_strip_debug);
diff --git a/llvm/tools/llvm-objcopy/ConfigManager.h b/llvm/tools/llvm-objcopy/ObjcopyOptions.h
similarity index 68%
rename from llvm/tools/llvm-objcopy/ConfigManager.h
rename to llvm/tools/llvm-objcopy/ObjcopyOptions.h
index c0d0e8bbc7219..d5c1fad10b7ab 100644
--- a/llvm/tools/llvm-objcopy/ConfigManager.h
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.h
@@ -1,4 +1,4 @@
-//===- ConfigManager.h ----------------------------------------------------===//
+//===- ObjcopyOptions.h ---------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,40 +6,16 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_OBJCOPY_CONFIGMANAGER_H
-#define LLVM_TOOLS_LLVM_OBJCOPY_CONFIGMANAGER_H
+#ifndef LLVM_TOOLS_LLVM_OBJCOPY_OBJCOPYOPTIONS_H
+#define LLVM_TOOLS_LLVM_OBJCOPY_OBJCOPYOPTIONS_H
-#include "COFF/COFFConfig.h"
-#include "CommonConfig.h"
-#include "ELF/ELFConfig.h"
-#include "MachO/MachOConfig.h"
-#include "MultiFormatConfig.h"
-#include "wasm/WasmConfig.h"
+#include "llvm/ObjCopy/ConfigManager.h"
#include "llvm/Support/Allocator.h"
#include <vector>
namespace llvm {
namespace objcopy {
-// ConfigManager keeps all configurations and prepare
-// format-specific options.
-struct ConfigManager : public MultiFormatConfig {
- virtual ~ConfigManager() {}
-
- const CommonConfig &getCommonConfig() const override { return Common; }
- Expected<const ELFConfig &> getELFConfig() const override;
- Expected<const COFFConfig &> getCOFFConfig() const override;
- Expected<const MachOConfig &> getMachOConfig() const override;
- Expected<const WasmConfig &> getWasmConfig() const override;
-
- // All configs.
- CommonConfig Common;
- ELFConfig ELF;
- COFFConfig COFF;
- MachOConfig MachO;
- WasmConfig Wasm;
-};
-
// Configuration for the overall invocation of this tool. When invoked as
// objcopy, will always contain exactly one CopyConfig. When invoked as strip,
// will contain one or more CopyConfigs.
@@ -77,4 +53,4 @@ parseStripOptions(ArrayRef<const char *> ArgsArr,
} // namespace objcopy
} // namespace llvm
-#endif // LLVM_TOOLS_LLVM_OBJCOPY_CONFIGMANAGER_H
+#endif // LLVM_TOOLS_LLVM_OBJCOPY_OBJCOPYOPTIONS_H
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index a5963985f78ab..26484d5d8e5b1 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -6,23 +6,22 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm-objcopy.h"
-#include "COFF/COFFConfig.h"
-#include "COFF/COFFObjcopy.h"
-#include "CommonConfig.h"
-#include "ConfigManager.h"
-#include "ELF/ELFConfig.h"
-#include "ELF/ELFObjcopy.h"
-#include "MachO/MachOConfig.h"
-#include "MachO/MachOObjcopy.h"
-#include "wasm/WasmConfig.h"
-#include "wasm/WasmObjcopy.h"
-
+#include "ObjcopyOptions.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/ELF.h"
+#include "llvm/ObjCopy/COFF/COFFConfig.h"
+#include "llvm/ObjCopy/COFF/COFFObjcopy.h"
+#include "llvm/ObjCopy/CommonConfig.h"
+#include "llvm/ObjCopy/ELF/ELFConfig.h"
+#include "llvm/ObjCopy/ELF/ELFObjcopy.h"
+#include "llvm/ObjCopy/MachO/MachOConfig.h"
+#include "llvm/ObjCopy/MachO/MachOObjcopy.h"
+#include "llvm/ObjCopy/ObjCopy.h"
+#include "llvm/ObjCopy/wasm/WasmConfig.h"
+#include "llvm/ObjCopy/wasm/WasmObjcopy.h"
#include "llvm/Object/Archive.h"
#include "llvm/Object/ArchiveWriter.h"
#include "llvm/Object/Binary.h"
@@ -96,40 +95,6 @@ static Expected<DriverConfig> getDriverConfig(ArrayRef<const char *> Args) {
return parseObjcopyOptions(Args, reportWarning);
}
-// For regular archives this function simply calls llvm::writeArchive,
-// For thin archives it writes the archive file itself as well as its members.
-static Error deepWriteArchive(StringRef ArcName,
- ArrayRef<NewArchiveMember> NewMembers,
- bool WriteSymtab, object::Archive::Kind Kind,
- bool Deterministic, bool Thin) {
- if (Error E = writeArchive(ArcName, NewMembers, WriteSymtab, Kind,
- Deterministic, Thin))
- return createFileError(ArcName, std::move(E));
-
- if (!Thin)
- return Error::success();
-
- for (const NewArchiveMember &Member : NewMembers) {
- // For regular files (as is the case for deepWriteArchive),
- // FileOutputBuffer::create will return OnDiskBuffer.
- // OnDiskBuffer uses a temporary file and then renames it. So in reality
- // there is no inefficiency / duplicated in-memory buffers in this case. For
- // now in-memory buffers can not be completely avoided since
- // NewArchiveMember still requires them even though writeArchive does not
- // write them on disk.
- Expected<std::unique_ptr<FileOutputBuffer>> FB =
- FileOutputBuffer::create(Member.MemberName, Member.Buf->getBufferSize(),
- FileOutputBuffer::F_executable);
- if (!FB)
- return FB.takeError();
- std::copy(Member.Buf->getBufferStart(), Member.Buf->getBufferEnd(),
- (*FB)->getBufferStart());
- if (Error E = (*FB)->commit())
- return E;
- }
- return Error::success();
-}
-
/// The function executeObjcopyOnIHex does the dispatch based on the format
/// of the output specified by the command line options.
static Error executeObjcopyOnIHex(ConfigManager &ConfigMgr, MemoryBuffer &In,
@@ -166,102 +131,6 @@ static Error executeObjcopyOnRawBinary(ConfigManager &ConfigMgr,
llvm_unreachable("unsupported output format");
}
-/// The function executeObjcopyOnBinary does the dispatch based on the format
-/// of the input binary (ELF, MachO or COFF).
-static Error executeObjcopyOnBinary(const MultiFormatConfig &Config,
- object::Binary &In, raw_ostream &Out) {
- if (auto *ELFBinary = dyn_cast<object::ELFObjectFileBase>(&In)) {
- Expected<const ELFConfig &> ELFConfig = Config.getELFConfig();
- if (!ELFConfig)
- return ELFConfig.takeError();
-
- return elf::executeObjcopyOnBinary(Config.getCommonConfig(), *ELFConfig,
- *ELFBinary, Out);
- } else if (auto *COFFBinary = dyn_cast<object::COFFObjectFile>(&In)) {
- Expected<const COFFConfig &> COFFConfig = Config.getCOFFConfig();
- if (!COFFConfig)
- return COFFConfig.takeError();
-
- return coff::executeObjcopyOnBinary(Config.getCommonConfig(), *COFFConfig,
- *COFFBinary, Out);
- } else if (auto *MachOBinary = dyn_cast<object::MachOObjectFile>(&In)) {
- Expected<const MachOConfig &> MachOConfig = Config.getMachOConfig();
- if (!MachOConfig)
- return MachOConfig.takeError();
-
- return macho::executeObjcopyOnBinary(Config.getCommonConfig(), *MachOConfig,
- *MachOBinary, Out);
- } else if (auto *MachOUniversalBinary =
- dyn_cast<object::MachOUniversalBinary>(&In)) {
- return macho::executeObjcopyOnMachOUniversalBinary(
- Config, *MachOUniversalBinary, Out);
- } else if (auto *WasmBinary = dyn_cast<object::WasmObjectFile>(&In)) {
- Expected<const WasmConfig &> WasmConfig = Config.getWasmConfig();
- if (!WasmConfig)
- return WasmConfig.takeError();
-
- return objcopy::wasm::executeObjcopyOnBinary(Config.getCommonConfig(),
- *WasmConfig, *WasmBinary, Out);
- } else
- return createStringError(object_error::invalid_file_type,
- "unsupported object file format");
-}
-
-namespace llvm {
-namespace objcopy {
-
-Expected<std::vector<NewArchiveMember>>
-createNewArchiveMembers(const MultiFormatConfig &Config, const Archive &Ar) {
- std::vector<NewArchiveMember> NewArchiveMembers;
- Error Err = Error::success();
- for (const Archive::Child &Child : Ar.children(Err)) {
- Expected<StringRef> ChildNameOrErr = Child.getName();
- if (!ChildNameOrErr)
- return createFileError(Ar.getFileName(), ChildNameOrErr.takeError());
-
- Expected<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary();
- if (!ChildOrErr)
- return createFileError(Ar.getFileName() + "(" + *ChildNameOrErr + ")",
- ChildOrErr.takeError());
-
- SmallVector<char, 0> Buffer;
- raw_svector_ostream MemStream(Buffer);
-
- if (Error E = executeObjcopyOnBinary(Config, *ChildOrErr->get(), MemStream))
- return std::move(E);
-
- Expected<NewArchiveMember> Member = NewArchiveMember::getOldMember(
- Child, Config.getCommonConfig().DeterministicArchives);
- if (!Member)
- return createFileError(Ar.getFileName(), Member.takeError());
-
- Member->Buf = std::make_unique<SmallVectorMemoryBuffer>(
- std::move(Buffer), ChildNameOrErr.get(),
- /*RequiresNullTerminator=*/false);
- Member->MemberName = Member->Buf->getBufferIdentifier();
- NewArchiveMembers.push_back(std::move(*Member));
- }
- if (Err)
- return createFileError(Config.getCommonConfig().InputFilename,
- std::move(Err));
- return std::move(NewArchiveMembers);
-}
-
-} // end namespace objcopy
-} // end namespace llvm
-
-static Error executeObjcopyOnArchive(const ConfigManager &ConfigMgr,
- const object::Archive &Ar) {
- Expected<std::vector<NewArchiveMember>> NewArchiveMembersOrErr =
- createNewArchiveMembers(ConfigMgr, Ar);
- if (!NewArchiveMembersOrErr)
- return NewArchiveMembersOrErr.takeError();
- const CommonConfig &Config = ConfigMgr.getCommonConfig();
- return deepWriteArchive(Config.OutputFilename, *NewArchiveMembersOrErr,
- Ar.hasSymbolTable(), Ar.kind(),
- Config.DeterministicArchives, Ar.isThin());
-}
-
static Error restoreStatOnFile(StringRef Filename,
const sys::fs::file_status &Stat,
const ConfigManager &ConfigMgr) {
diff --git a/llvm/unittests/ObjCopy/CMakeLists.txt b/llvm/unittests/ObjCopy/CMakeLists.txt
new file mode 100644
index 0000000000000..b44fd832e437f
--- /dev/null
+++ b/llvm/unittests/ObjCopy/CMakeLists.txt
@@ -0,0 +1,11 @@
+set(LLVM_LINK_COMPONENTS
+ Object
+ ObjCopy
+ ObjectYAML
+ )
+
+add_llvm_unittest(ObjCopyTests
+ ObjCopyTest.cpp
+ )
+
+target_link_libraries(ObjCopyTests PRIVATE LLVMTestingSupport)
diff --git a/llvm/unittests/ObjCopy/ObjCopyTest.cpp b/llvm/unittests/ObjCopy/ObjCopyTest.cpp
new file mode 100644
index 0000000000000..8d208be988a71
--- /dev/null
+++ b/llvm/unittests/ObjCopy/ObjCopyTest.cpp
@@ -0,0 +1,118 @@
+//===- ObjCopyTest.cpp ----------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ObjCopy/ObjCopy.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ObjCopy/ConfigManager.h"
+#include "llvm/Object/ObjectFile.h"
+#include "llvm/ObjectYAML/yaml2obj.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Support/FileUtilities.h"
+#include "llvm/Testing/Support/Error.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+using namespace object;
+using namespace objcopy;
+using namespace yaml;
+
+void copySimpleInMemoryFileImpl(
+ const char *YamlCreationString,
+ std::function<bool(const Binary &File)> IsValidFormat) {
+ auto ErrHandler = [&](const Twine &Msg) { FAIL() << "Error: " << Msg; };
+
+ // Create Object file from YAML description.
+ SmallVector<char> Storage;
+ std::unique_ptr<ObjectFile> Obj =
+ yaml2ObjectFile(Storage, YamlCreationString, ErrHandler);
+ ASSERT_TRUE(Obj);
+ ASSERT_TRUE(IsValidFormat(*Obj));
+
+ ConfigManager Config;
+ Config.Common.OutputFilename = "a.out";
+
+ // Call executeObjcopyOnBinary()
+ SmallVector<char> DataVector;
+ raw_svector_ostream OutStream(DataVector);
+ Error Err = objcopy::executeObjcopyOnBinary(Config, *Obj.get(), OutStream);
+ ASSERT_FALSE(std::move(Err));
+
+ MemoryBufferRef Buffer(StringRef(DataVector.data(), DataVector.size()),
+ Config.Common.OutputFilename);
+
+ // Check copied file.
+ Expected<std::unique_ptr<Binary>> Result = createBinary(Buffer);
+ ASSERT_THAT_EXPECTED(Result, Succeeded());
+ ASSERT_TRUE(IsValidFormat(**Result));
+}
+
+TEST(CopySimpleInMemoryFile, COFF) {
+ SCOPED_TRACE("CopySimpleInMemoryFileCOFF");
+
+ copySimpleInMemoryFileImpl(
+ R"(
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+ Characteristics: [ ]
+sections:
+ - Name: .text
+ Characteristics: [ ]
+ Alignment: 4
+ SectionData: E800000000C3C3C3
+symbols:
+...
+)",
+ [](const Binary &File) { return File.isCOFF(); });
+}
+
+TEST(CopySimpleInMemoryFile, ELF) {
+ SCOPED_TRACE("CopySimpleInMemoryFileELF");
+
+ copySimpleInMemoryFileImpl(
+ R"(
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL)",
+ [](const Binary &File) { return File.isELF(); });
+}
+
+TEST(CopySimpleInMemoryFile, MachO) {
+ SCOPED_TRACE("CopySimpleInMemoryFileMachO");
+
+ copySimpleInMemoryFileImpl(
+ R"(
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x80000003
+ filetype: 0x00000002
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00218085
+ reserved: 0x00000000
+...
+)",
+ [](const Binary &File) { return File.isMachO(); });
+}
+
+TEST(CopySimpleInMemoryFile, Wasm) {
+ SCOPED_TRACE("CopySimpleInMemoryFileWasm");
+
+ copySimpleInMemoryFileImpl(
+ R"(
+--- !WASM
+FileHeader:
+ Version: 0x00000001
+...
+)",
+ [](const Binary &File) { return File.isWasm(); });
+}
More information about the llvm-commits
mailing list