summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
diff options
context:
space:
mode:
authorPetr Hosek <phosek@chromium.org>2017-08-04 21:09:26 +0000
committerPetr Hosek <phosek@chromium.org>2017-08-04 21:09:26 +0000
commitc4df10e139a690e60cd332ac34491a4d358aa2c2 (patch)
tree94350218a24d7c09c253ca5a34b6a4951f220a57 /llvm/tools/llvm-objcopy/llvm-objcopy.cpp
parent64426e3ba83b4dba8d802fb4e97643d17f556655 (diff)
downloadbcm5719-llvm-c4df10e139a690e60cd332ac34491a4d358aa2c2.tar.gz
bcm5719-llvm-c4df10e139a690e60cd332ac34491a4d358aa2c2.zip
Reland "[llvm][llvm-objcopy] Added support for outputting to binary in llvm-objcopy"
This change adds the "-O binary" flag which directs llvm-objcopy to output the object file to the same format as GNU objcopy does when given the flag "-O binary". This was done by splitting the Object class into two subclasses ObjectELF and ObjectBianry which each output a different format but relay on the same code to read in the Object in Object. Patch by Jake Ehrlich Differential Revision: https://reviews.llvm.org/D34480 llvm-svn: 310127
Diffstat (limited to 'llvm/tools/llvm-objcopy/llvm-objcopy.cpp')
-rw-r--r--llvm/tools/llvm-objcopy/llvm-objcopy.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 09edc4c3327..9b233951b8d 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -53,13 +53,23 @@ LLVM_ATTRIBUTE_NORETURN void reportError(StringRef File, llvm::Error E) {
cl::opt<std::string> InputFilename(cl::Positional, cl::desc("<input>"));
cl::opt<std::string> OutputFilename(cl::Positional, cl::desc("<output>"),
cl::init("-"));
+cl::opt<std::string>
+ OutputFormat("O", cl::desc("set output format to one of the following:"
+ "\n\tbinary"));
void CopyBinary(const ELFObjectFile<ELF64LE> &ObjFile) {
std::unique_ptr<FileOutputBuffer> Buffer;
- Object<ELF64LE> Obj{ObjFile};
- Obj.finalize();
+ std::unique_ptr<Object<ELF64LE>> Obj;
+ if (!OutputFormat.empty() && OutputFormat != "binary")
+ error("invalid output format '" + OutputFormat + "'");
+
+ if (!OutputFormat.empty() && OutputFormat == "binary")
+ Obj = llvm::make_unique<BinaryObject<ELF64LE>>(ObjFile);
+ else
+ Obj = llvm::make_unique<ELFObject<ELF64LE>>(ObjFile);
+ Obj->finalize();
ErrorOr<std::unique_ptr<FileOutputBuffer>> BufferOrErr =
- FileOutputBuffer::create(OutputFilename, Obj.totalSize(),
+ FileOutputBuffer::create(OutputFilename, Obj->totalSize(),
FileOutputBuffer::F_executable);
if (BufferOrErr.getError())
error("failed to open " + OutputFilename);
@@ -68,7 +78,7 @@ void CopyBinary(const ELFObjectFile<ELF64LE> &ObjFile) {
std::error_code EC;
if (EC)
report_fatal_error(EC.message());
- Obj.write(*Buffer);
+ Obj->write(*Buffer);
if (auto EC = Buffer->commit())
reportError(OutputFilename, EC);
}
OpenPOWER on IntegriCloud