Index: llvm/trunk/test/tools/llvm-objcopy/elf32be.test =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/elf32be.test +++ llvm/trunk/test/tools/llvm-objcopy/elf32be.test @@ -0,0 +1,28 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000010 + Size: 64 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: "00000000" + +# CHECK: Class: 32-bit +# CHECK: DataEncoding: BigEndian + +# CHECK: Name: .bss +# CHECK: Name: .text +# CHECK: Name: .shstrtab Index: llvm/trunk/test/tools/llvm-objcopy/elf32le.test =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/elf32le.test +++ llvm/trunk/test/tools/llvm-objcopy/elf32le.test @@ -0,0 +1,28 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000010 + Size: 64 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: "00000000" + +# CHECK: Class: 32-bit +# CHECK: DataEncoding: LittleEndian + +# CHECK: Name: .bss +# CHECK: Name: .text +# CHECK: Name: .shstrtab Index: llvm/trunk/test/tools/llvm-objcopy/elf64be.test =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/elf64be.test +++ llvm/trunk/test/tools/llvm-objcopy/elf64be.test @@ -0,0 +1,28 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2MSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_ALLOC ] + AddressAlign: 0x0000000000000010 + Size: 64 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: "00000000" + +# CHECK: Class: 64-bit +# CHECK: DataEncoding: BigEndian + +# CHECK: Name: .bss +# CHECK: Name: .text +# CHECK: Name: .shstrtab Index: llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp =================================================================== --- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp +++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp @@ -142,18 +142,19 @@ WriteObjectFile(DWOFile, File); } -void CopyBinary(const ELFObjectFile &ObjFile) { - std::unique_ptr> Obj; +template +void CopyBinary(const ELFObjectFile &ObjFile) { + std::unique_ptr> Obj; if (!OutputFormat.empty() && OutputFormat != "binary") error("invalid output format '" + OutputFormat + "'"); if (!OutputFormat.empty() && OutputFormat == "binary") - Obj = llvm::make_unique>(ObjFile); + Obj = llvm::make_unique>(ObjFile); else - Obj = llvm::make_unique>(ObjFile); + Obj = llvm::make_unique>(ObjFile); if (!SplitDWO.empty()) - SplitDWOToFile(ObjFile, SplitDWO.getValue()); + SplitDWOToFile(ObjFile, SplitDWO.getValue()); SectionPred RemovePred = [](const SectionBase &) { return false; }; @@ -225,7 +226,19 @@ if (!BinaryOrErr) reportError(InputFilename, BinaryOrErr.takeError()); Binary &Binary = *BinaryOrErr.get().getBinary(); - if (ELFObjectFile *o = dyn_cast>(&Binary)) { + if (auto *o = dyn_cast>(&Binary)) { + CopyBinary(*o); + return 0; + } + if (auto *o = dyn_cast>(&Binary)) { + CopyBinary(*o); + return 0; + } + if (auto *o = dyn_cast>(&Binary)) { + CopyBinary(*o); + return 0; + } + if (auto *o = dyn_cast>(&Binary)) { CopyBinary(*o); return 0; }