Skip to content

Commit b0b65ca

Browse files
committed
[llvm-objcopy] Support full list of bfd targets that lld uses.
Summary: This change takes the full list of bfd targets that lld supports (see `ScriptParser.cpp`), including generic handling for `*-freebsd` targets (which uses the same settings but with a FreeBSD OSABI). In particular this adds mips support for `--output-target` (but not yet via `--binary-architecture`). lld and llvm-objcopy use their own different custom data structures, so I'd prefer to check this in as-is (add support directly in llvm-objcopy, including all the test coverage) and do a separate NFC patch(s) that consolidate the two by putting this mapping into libobject. See [[ https://bugs.llvm.org/show_bug.cgi?id=41462 | PR41462 ]]. Reviewers: jhenderson, jakehehrlich, espindola, alexshap, arichardson Reviewed By: arichardson Subscribers: fedor.sergeev, emaste, sdardis, krytarowski, atanasyan, llvm-commits, MaskRay, arichardson Tags: #llvm Differential Revision: https://reviews.llvm.org/D60773 llvm-svn: 358562
1 parent 277754c commit b0b65ca

File tree

4 files changed

+145
-48
lines changed

4 files changed

+145
-48
lines changed

llvm/test/tools/llvm-objcopy/ELF/bad-output-format.test

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
# RUN: not llvm-objcopy -O xyz %t.o %t.2.o 2>&1 \
44
# RUN: | FileCheck %s --check-prefix=BAD-OUTPUT-FORMAT
55

6+
# FreeBSD has some special output format parsing that looks up the name without
7+
# the trailing "-freebsd". Make sure we include the full output format name.
8+
# RUN: not llvm-objcopy -O xyz-freebsd %t.o %t.2.o 2>&1 \
9+
# RUN: | FileCheck %s --check-prefix=BAD-OUTPUT-FORMAT-BSD
10+
611
!ELF
712
FileHeader:
813
Class: ELFCLASS32
@@ -11,3 +16,4 @@ FileHeader:
1116
Machine: EM_386
1217

1318
# BAD-OUTPUT-FORMAT: Invalid output format: 'xyz'
19+
# BAD-OUTPUT-FORMAT-BSD: Invalid output format: 'xyz-freebsd'

llvm/test/tools/llvm-objcopy/ELF/cross-arch-headers.test

Lines changed: 95 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,88 @@
66

77
# Without --output-format, the format should match the input.
88
# RUN: llvm-objcopy %t.o %t.default.o --split-dwo=%t.default.dwo
9-
# RUN: llvm-readobj --file-headers %t.default.o | FileCheck %s --check-prefixes=CHECK,DEFAULT,32
10-
# RUN: llvm-readobj --file-headers %t.default.dwo | FileCheck %s --check-prefixes=CHECK,DEFAULT,32
9+
# RUN: llvm-readobj --file-headers %t.default.o | FileCheck %s --check-prefixes=CHECK,LE,DEFAULT,32
10+
# RUN: llvm-readobj --file-headers %t.default.dwo | FileCheck %s --check-prefixes=CHECK,LE,DEFAULT,32
1111

1212
# RUN: llvm-objcopy %t.o -O elf32-i386 %t.elf32_i386.o --split-dwo=%t.elf32_i386.dwo
13-
# RUN: llvm-readobj --file-headers %t.elf32_i386.o | FileCheck %s --check-prefixes=CHECK,I386,32,SYSV
14-
# RUN: llvm-readobj --file-headers %t.elf32_i386.dwo | FileCheck %s --check-prefixes=CHECK,I386,32,SYSV
13+
# RUN: llvm-readobj --file-headers %t.elf32_i386.o | FileCheck %s --check-prefixes=CHECK,LE,I386,32,SYSV
14+
# RUN: llvm-readobj --file-headers %t.elf32_i386.dwo | FileCheck %s --check-prefixes=CHECK,LE,I386,32,SYSV
1515

1616
# RUN: llvm-objcopy %t.o -O elf32-i386-freebsd %t.elf32_i386_freebsd.o --split-dwo=%t.elf32_i386_freebsd.dwo
17-
# RUN: llvm-readobj --file-headers %t.elf32_i386_freebsd.o | FileCheck %s --check-prefixes=CHECK,I386,32,FREEBSD
18-
# RUN: llvm-readobj --file-headers %t.elf32_i386_freebsd.dwo | FileCheck %s --check-prefixes=CHECK,I386,32,FREEBSD
17+
# RUN: llvm-readobj --file-headers %t.elf32_i386_freebsd.o | FileCheck %s --check-prefixes=CHECK,LE,I386,32,FREEBSD
18+
# RUN: llvm-readobj --file-headers %t.elf32_i386_freebsd.dwo | FileCheck %s --check-prefixes=CHECK,LE,I386,32,FREEBSD
19+
20+
# RUN: llvm-objcopy %t.o -O elf32-iamcu %t.elf32_iamcu.o --split-dwo=%t.elf32_iamcu.dwo
21+
# RUN: llvm-readobj --file-headers %t.elf32_iamcu.o | FileCheck %s --check-prefixes=CHECK,LE,IAMCU,32,SYSV
22+
# RUN: llvm-readobj --file-headers %t.elf32_iamcu.dwo | FileCheck %s --check-prefixes=CHECK,LE,IAMCU,32,SYSV
23+
24+
# RUN: llvm-objcopy %t.o -O elf32-littlearm %t.elf32_littlearm.o --split-dwo=%t.elf32_littlearm.dwo
25+
# RUN: llvm-readobj --file-headers %t.elf32_littlearm.o | FileCheck %s --check-prefixes=CHECK,LE,ARM,32,SYSV
26+
# RUN: llvm-readobj --file-headers %t.elf32_littlearm.dwo | FileCheck %s --check-prefixes=CHECK,LE,ARM,32,SYSV
27+
28+
# RUN: llvm-objcopy %t.o -O elf64-aarch64 %t.elf64_aarch64.o --split-dwo=%t.elf64_aarch64.dwo
29+
# RUN: llvm-readobj --file-headers %t.elf64_aarch64.o | FileCheck %s --check-prefixes=CHECK,LE,AARCH,64,SYSV
30+
# RUN: llvm-readobj --file-headers %t.elf64_aarch64.dwo | FileCheck %s --check-prefixes=CHECK,LE,AARCH,64,SYSV
31+
32+
# RUN: llvm-objcopy %t.o -O elf64-littleaarch64 %t.elf64_littleaarch64.o --split-dwo=%t.elf64_littleaarch64.dwo
33+
# RUN: llvm-readobj --file-headers %t.elf64_littleaarch64.o | FileCheck %s --check-prefixes=CHECK,LE,AARCH,64,SYSV
34+
# RUN: llvm-readobj --file-headers %t.elf64_littleaarch64.dwo | FileCheck %s --check-prefixes=CHECK,LE,AARCH,64,SYSV
35+
36+
# RUN: llvm-objcopy %t.o -O elf32-powerpc %t.elf32_powerpc.o --split-dwo=%t.elf32_powerpc.dwo
37+
# RUN: llvm-readobj --file-headers %t.elf32_powerpc.o | FileCheck %s --check-prefixes=CHECK,BE,PPC,32,SYSV
38+
# RUN: llvm-readobj --file-headers %t.elf32_powerpc.dwo | FileCheck %s --check-prefixes=CHECK,BE,PPC,32,SYSV
39+
40+
# RUN: llvm-objcopy %t.o -O elf64-powerpc %t.elf64_powerpc.o --split-dwo=%t.elf64_powerpc.dwo
41+
# RUN: llvm-readobj --file-headers %t.elf64_powerpc.o | FileCheck %s --check-prefixes=CHECK,BE,PPC64BE,64,SYSV
42+
# RUN: llvm-readobj --file-headers %t.elf64_powerpc.dwo | FileCheck %s --check-prefixes=CHECK,BE,PPC64BE,64,SYSV
1943

2044
# RUN: llvm-objcopy %t.o -O elf32-powerpcle %t.elf32_ppcle.o --split-dwo=%t.elf32_ppcle.dwo
21-
# RUN: llvm-readobj --file-headers %t.elf32_ppcle.o | FileCheck %s --check-prefixes=CHECK,PPC,32,SYSV
22-
# RUN: llvm-readobj --file-headers %t.elf32_ppcle.dwo | FileCheck %s --check-prefixes=CHECK,PPC,32,SYSV
45+
# RUN: llvm-readobj --file-headers %t.elf32_ppcle.o | FileCheck %s --check-prefixes=CHECK,LE,PPC,32,SYSV
46+
# RUN: llvm-readobj --file-headers %t.elf32_ppcle.dwo | FileCheck %s --check-prefixes=CHECK,LE,PPC,32,SYSV
2347

2448
# RUN: llvm-objcopy %t.o -O elf32-x86-64 %t.elf32_x86_64.o --split-dwo=%t.elf32_x86_64.dwo
25-
# RUN: llvm-readobj --file-headers %t.elf32_x86_64.o | FileCheck %s --check-prefixes=CHECK,X86-64,32,SYSV
26-
# RUN: llvm-readobj --file-headers %t.elf32_x86_64.dwo | FileCheck %s --check-prefixes=CHECK,X86-64,32,SYSV
49+
# RUN: llvm-readobj --file-headers %t.elf32_x86_64.o | FileCheck %s --check-prefixes=CHECK,LE,X86-64,32,SYSV
50+
# RUN: llvm-readobj --file-headers %t.elf32_x86_64.dwo | FileCheck %s --check-prefixes=CHECK,LE,X86-64,32,SYSV
2751

2852
# RUN: llvm-objcopy %t.o -O elf64-powerpcle %t.elf64_ppcle.o --split-dwo=%t.elf64_ppcle.dwo
29-
# RUN: llvm-readobj --file-headers %t.elf64_ppcle.o | FileCheck %s --check-prefixes=CHECK,PPC64,64,SYSV
30-
# RUN: llvm-readobj --file-headers %t.elf64_ppcle.dwo | FileCheck %s --check-prefixes=CHECK,PPC64,64,SYSV
53+
# RUN: llvm-readobj --file-headers %t.elf64_ppcle.o | FileCheck %s --check-prefixes=CHECK,LE,PPC64LE,64,SYSV
54+
# RUN: llvm-readobj --file-headers %t.elf64_ppcle.dwo | FileCheck %s --check-prefixes=CHECK,LE,PPC64LE,64,SYSV
3155

3256
# RUN: llvm-objcopy %t.o -O elf64-x86-64 %t.elf64_x86_64.o --split-dwo=%t.elf64_x86_64.dwo
33-
# RUN: llvm-readobj --file-headers %t.elf64_x86_64.o | FileCheck %s --check-prefixes=CHECK,X86-64,64,SYSV
34-
# RUN: llvm-readobj --file-headers %t.elf64_x86_64.dwo | FileCheck %s --check-prefixes=CHECK,X86-64,64,SYSV
57+
# RUN: llvm-readobj --file-headers %t.elf64_x86_64.o | FileCheck %s --check-prefixes=CHECK,LE,X86-64,64,SYSV
58+
# RUN: llvm-readobj --file-headers %t.elf64_x86_64.dwo | FileCheck %s --check-prefixes=CHECK,LE,X86-64,64,SYSV
3559

3660
# RUN: llvm-objcopy %t.o -O elf64-x86-64-freebsd %t.elf64_x86_64_freebsd.o --split-dwo=%t.elf64_x86_64_freebsd.dwo
37-
# RUN: llvm-readobj --file-headers %t.elf64_x86_64_freebsd.o | FileCheck %s --check-prefixes=CHECK,X86-64,64,FREEBSD
38-
# RUN: llvm-readobj --file-headers %t.elf64_x86_64_freebsd.dwo | FileCheck %s --check-prefixes=CHECK,X86-64,64,FREEBSD
61+
# RUN: llvm-readobj --file-headers %t.elf64_x86_64_freebsd.o | FileCheck %s --check-prefixes=CHECK,LE,X86-64,64,FREEBSD
62+
# RUN: llvm-readobj --file-headers %t.elf64_x86_64_freebsd.dwo | FileCheck %s --check-prefixes=CHECK,LE,X86-64,64,FREEBSD
63+
64+
# RUN: llvm-objcopy %t.o -O elf32-tradbigmips %t.elf32_tradbigmips.o --split-dwo=%t.elf32_tradbigmips.dwo
65+
# RUN: llvm-readobj --file-headers %t.elf32_tradbigmips.o | FileCheck %s --check-prefixes=CHECK,BE,MIPS,MIPSBE,32,SYSV
66+
# RUN: llvm-readobj --file-headers %t.elf32_tradbigmips.dwo | FileCheck %s --check-prefixes=CHECK,BE,MIPS,MIPSBE,32,SYSV
67+
68+
# RUN: llvm-objcopy %t.o -O elf32-bigmips %t.elf32_bigmips.o --split-dwo=%t.elf32_bigmips.dwo
69+
# RUN: llvm-readobj --file-headers %t.elf32_bigmips.o | FileCheck %s --check-prefixes=CHECK,BE,MIPS,MIPSBE,32,SYSV
70+
# RUN: llvm-readobj --file-headers %t.elf32_bigmips.dwo | FileCheck %s --check-prefixes=CHECK,BE,MIPS,MIPSBE,32,SYSV
71+
72+
# RUN: llvm-objcopy %t.o -O elf32-ntradbigmips %t.elf32_ntradbigmips.o --split-dwo=%t.elf32_ntradbigmips.dwo
73+
# RUN: llvm-readobj --file-headers %t.elf32_ntradbigmips.o | FileCheck %s --check-prefixes=CHECK,BE,MIPS,MIPSBE,32,SYSV
74+
# RUN: llvm-readobj --file-headers %t.elf32_ntradbigmips.dwo | FileCheck %s --check-prefixes=CHECK,BE,MIPS,MIPSBE,32,SYSV
75+
76+
# RUN: llvm-objcopy %t.o -O elf32-tradlittlemips %t.elf32_tradlittlemips.o --split-dwo=%t.elf32_tradlittlemips.dwo
77+
# RUN: llvm-readobj --file-headers %t.elf32_tradlittlemips.o | FileCheck %s --check-prefixes=CHECK,LE,MIPS,MIPSLE,32,SYSV
78+
# RUN: llvm-readobj --file-headers %t.elf32_tradlittlemips.dwo | FileCheck %s --check-prefixes=CHECK,LE,MIPS,MIPSLE,32,SYSV
79+
80+
# RUN: llvm-objcopy %t.o -O elf32-ntradlittlemips %t.elf32_ntradlittlemips.o --split-dwo=%t.elf32_ntradlittlemips.dwo
81+
# RUN: llvm-readobj --file-headers %t.elf32_ntradlittlemips.o | FileCheck %s --check-prefixes=CHECK,LE,MIPS,MIPSLE,32,SYSV
82+
# RUN: llvm-readobj --file-headers %t.elf32_ntradlittlemips.dwo | FileCheck %s --check-prefixes=CHECK,LE,MIPS,MIPSLE,32,SYSV
83+
84+
# RUN: llvm-objcopy %t.o -O elf64-tradbigmips %t.elf64_tradbigmips.o --split-dwo=%t.elf64_tradbigmips.dwo
85+
# RUN: llvm-readobj --file-headers %t.elf64_tradbigmips.o | FileCheck %s --check-prefixes=CHECK,BE,MIPS,MIPS64BE,64,SYSV
86+
# RUN: llvm-readobj --file-headers %t.elf64_tradbigmips.dwo | FileCheck %s --check-prefixes=CHECK,BE,MIPS,MIPS64BE,64,SYSV
87+
88+
# RUN: llvm-objcopy %t.o -O elf64-tradlittlemips %t.elf64_tradlittlemips.o --split-dwo=%t.elf64_tradlittlemips.dwo
89+
# RUN: llvm-readobj --file-headers %t.elf64_tradlittlemips.o | FileCheck %s --check-prefixes=CHECK,LE,MIPS,MIPS64LE,64,SYSV
90+
# RUN: llvm-readobj --file-headers %t.elf64_tradlittlemips.dwo | FileCheck %s --check-prefixes=CHECK,LE,MIPS,MIPS64LE,64,SYSV
3991

4092
!ELF
4193
FileHeader:
@@ -68,29 +120,47 @@ Symbols:
68120
# 32-SAME: ELF32-
69121
# 64-SAME: ELF64-
70122
# I386-SAME: i386
123+
# IAMCU-SAME: iamcu
124+
# AARCH-SAME: aarch64
125+
# ARM-SAME: arm-little
126+
# MIPS-SAME: mips
71127
# PPC-SAME: ppc{{$}}
72-
# PPC64-SAME: ppc64
128+
# PPC64BE-SAME: ppc64{{$}}
129+
# PPC64LE-SAME: ppc64{{$}}
73130
# X86-64-SAME: x86-64
74131
# DEFAULT-SAME: unknown
75132

76-
# I386-NEXT: Arch: i386
77-
# PPC-NEXT: Arch: powerpc{{$}}
78-
# PPC64-NEXT: Arch: powerpc64le
79-
# X86-64-NEXT: Arch: x86_64
80-
# DEFAULT-NEXT: Arch: unknown
133+
# I386-NEXT: Arch: i386
134+
# IAMCU-NEXT: Arch: i386
135+
# AARCH-NEXT: Arch: aarch64
136+
# ARM-NEXT: Arch: arm
137+
# MIPSBE-NEXT: Arch: mips{{$}}
138+
# MIPSLE-NEXT: Arch: mipsel{{$}}
139+
# MIPS64BE-NEXT: Arch: mips64{{$}}
140+
# MIPS64LE-NEXT: Arch: mips64el{{$}}
141+
# PPC-NEXT: Arch: powerpc{{$}}
142+
# PPC64BE-NEXT: Arch: powerpc64{{$}}
143+
# PPC64LE-NEXT: Arch: powerpc64le
144+
# X86-64-NEXT: Arch: x86_64
145+
# DEFAULT-NEXT: Arch: unknown
81146

82147
# 32-NEXT: AddressSize: 32bit
83148
# 64-NEXT: AddressSize: 64bit
84149

85-
# 32: Class: 32-bit
86-
# 64: Class: 64-bit
87-
# CHECK: DataEncoding: LittleEndian
150+
# 32: Class: 32-bit
151+
# 64: Class: 64-bit
152+
# LE: DataEncoding: LittleEndian
153+
# BE: DataEncoding: BigEndian
88154

89155
# SYSV: OS/ABI: SystemV (0x0)
90156
# FREEBSD: OS/ABI: FreeBSD (0x9)
91157
# DEFAULT: OS/ABI: Standalone (0xFF)
92158

159+
# AARCH: Machine: EM_AARCH64 (0xB7)
160+
# ARM: Machine: EM_ARM (0x28)
93161
# I386: Machine: EM_386 (0x3)
162+
# IAMCU: Machine: EM_IAMCU (0x6)
163+
# MIPS: Machine: EM_MIPS (0x8)
94164
# PPC: Machine: EM_PPC (0x14)
95165
# PPC64: Machine: EM_PPC64 (0x15)
96166
# X86-64: Machine: EM_X86_64 (0x3E)

llvm/tools/llvm-objcopy/CopyConfig.cpp

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -253,14 +253,14 @@ static Expected<NewSymbolInfo> parseNewSymbolInfo(StringRef FlagValue) {
253253
}
254254

255255
static const StringMap<MachineInfo> ArchMap{
256-
// Name, {EMachine, OS/ABI, 64bit, LittleEndian}
257-
{"aarch64", {ELF::EM_AARCH64, ELF::ELFOSABI_NONE, true, true}},
258-
{"arm", {ELF::EM_ARM, ELF::ELFOSABI_NONE, false, true}},
259-
{"i386", {ELF::EM_386, ELF::ELFOSABI_NONE, false, true}},
260-
{"i386:x86-64", {ELF::EM_X86_64, ELF::ELFOSABI_NONE, true, true}},
261-
{"powerpc:common64", {ELF::EM_PPC64, ELF::ELFOSABI_NONE, true, true}},
262-
{"sparc", {ELF::EM_SPARC, ELF::ELFOSABI_NONE, false, true}},
263-
{"x86-64", {ELF::EM_X86_64, ELF::ELFOSABI_NONE, true, true}},
256+
// Name, {EMachine, 64bit, LittleEndian}
257+
{"aarch64", {ELF::EM_AARCH64, true, true}},
258+
{"arm", {ELF::EM_ARM, false, true}},
259+
{"i386", {ELF::EM_386, false, true}},
260+
{"i386:x86-64", {ELF::EM_X86_64, true, true}},
261+
{"powerpc:common64", {ELF::EM_PPC64, true, true}},
262+
{"sparc", {ELF::EM_SPARC, false, true}},
263+
{"x86-64", {ELF::EM_X86_64, true, true}},
264264
};
265265

266266
static Expected<const MachineInfo &> getMachineInfo(StringRef Arch) {
@@ -271,26 +271,41 @@ static Expected<const MachineInfo &> getMachineInfo(StringRef Arch) {
271271
return Iter->getValue();
272272
}
273273

274+
// FIXME: consolidate with the bfd parsing used by lld.
274275
static const StringMap<MachineInfo> OutputFormatMap{
275-
// Name, {EMachine, OSABI, 64bit, LittleEndian}
276-
{"elf32-i386", {ELF::EM_386, ELF::ELFOSABI_NONE, false, true}},
277-
{"elf32-i386-freebsd", {ELF::EM_386, ELF::ELFOSABI_FREEBSD, false, true}},
278-
{"elf32-powerpcle", {ELF::EM_PPC, ELF::ELFOSABI_NONE, false, true}},
279-
{"elf32-x86-64", {ELF::EM_X86_64, ELF::ELFOSABI_NONE, false, true}},
280-
{"elf64-powerpcle", {ELF::EM_PPC64, ELF::ELFOSABI_NONE, true, true}},
281-
{"elf64-x86-64", {ELF::EM_X86_64, ELF::ELFOSABI_NONE, true, true}},
282-
{"elf64-x86-64-freebsd",
283-
{ELF::EM_X86_64, ELF::ELFOSABI_FREEBSD, true, true}},
276+
// Name, {EMachine, 64bit, LittleEndian}
277+
{"elf32-i386", {ELF::EM_386, false, true}},
278+
{"elf32-iamcu", {ELF::EM_IAMCU, false, true}},
279+
{"elf32-littlearm", {ELF::EM_ARM, false, true}},
280+
{"elf32-x86-64", {ELF::EM_X86_64, false, true}},
281+
{"elf64-aarch64", {ELF::EM_AARCH64, true, true}},
282+
{"elf64-littleaarch64", {ELF::EM_AARCH64, true, true}},
283+
{"elf32-powerpc", {ELF::EM_PPC, false, false}},
284+
{"elf32-powerpcle", {ELF::EM_PPC, false, true}},
285+
{"elf64-powerpc", {ELF::EM_PPC64, true, false}},
286+
{"elf64-powerpcle", {ELF::EM_PPC64, true, true}},
287+
{"elf64-x86-64", {ELF::EM_X86_64, true, true}},
288+
{"elf32-tradbigmips", {ELF::EM_MIPS, false, false}},
289+
{"elf32-bigmips", {ELF::EM_MIPS, false, false}},
290+
{"elf32-ntradbigmips", {ELF::EM_MIPS, false, false}},
291+
{"elf32-tradlittlemips", {ELF::EM_MIPS, false, true}},
292+
{"elf32-ntradlittlemips", {ELF::EM_MIPS, false, true}},
293+
{"elf64-tradbigmips", {ELF::EM_MIPS, true, false}},
294+
{"elf64-tradlittlemips", {ELF::EM_MIPS, true, true}},
284295
};
285296

286-
static Expected<const MachineInfo &>
287-
getOutputFormatMachineInfo(StringRef Format) {
297+
static Expected<MachineInfo> getOutputFormatMachineInfo(StringRef Format) {
298+
StringRef OriginalFormat = Format;
299+
bool IsFreeBSD = Format.consume_back("-freebsd");
288300
auto Iter = OutputFormatMap.find(Format);
289301
if (Iter == std::end(OutputFormatMap))
290302
return createStringError(errc::invalid_argument,
291303
"Invalid output format: '%s'",
292-
Format.str().c_str());
293-
return Iter->getValue();
304+
OriginalFormat.str().c_str());
305+
MachineInfo MI = Iter->getValue();
306+
if (IsFreeBSD)
307+
MI.OSABI = ELF::ELFOSABI_FREEBSD;
308+
return {MI};
294309
}
295310

296311
static Error addSymbolsFromFile(std::vector<NameOrRegex> &Symbols,
@@ -431,8 +446,7 @@ Expected<DriverConfig> parseObjcopyOptions(ArrayRef<const char *> ArgsArr) {
431446
Config.BinaryArch = *MI;
432447
}
433448
if (!Config.OutputFormat.empty() && Config.OutputFormat != "binary") {
434-
Expected<const MachineInfo &> MI =
435-
getOutputFormatMachineInfo(Config.OutputFormat);
449+
Expected<MachineInfo> MI = getOutputFormatMachineInfo(Config.OutputFormat);
436450
if (!MI)
437451
return MI.takeError();
438452
Config.OutputArch = *MI;

llvm/tools/llvm-objcopy/CopyConfig.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ namespace objcopy {
3030
// lets us map architecture names to ELF types and the e_machine value of the
3131
// ELF file.
3232
struct MachineInfo {
33+
MachineInfo(uint16_t EM, uint8_t ABI, bool Is64, bool IsLittle)
34+
: EMachine(EM), OSABI(ABI), Is64Bit(Is64), IsLittleEndian(IsLittle) {}
35+
// Alternative constructor that defaults to NONE for OSABI.
36+
MachineInfo(uint16_t EM, bool Is64, bool IsLittle)
37+
: MachineInfo(EM, ELF::ELFOSABI_NONE, Is64, IsLittle) {}
38+
// Default constructor for unset fields.
39+
MachineInfo() : MachineInfo(0, 0, false, false) {}
3340
uint16_t EMachine;
3441
uint8_t OSABI;
3542
bool Is64Bit;

0 commit comments

Comments
 (0)