Skip to content

Commit d6c85fc

Browse files
authored
Reapply "Allow "[[FLAGS=<none>]]" value in the ELF Fileheader Flags field (#143845)" (#151094)
This fixes the issues with 0b054e2 This reverts commit b80ce05.
1 parent d7f77b2 commit d6c85fc

File tree

6 files changed

+65
-4
lines changed

6 files changed

+65
-4
lines changed

llvm/include/llvm/ObjectYAML/ELFYAML.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ struct FileHeader {
117117
llvm::yaml::Hex8 ABIVersion;
118118
ELF_ET Type;
119119
std::optional<ELF_EM> Machine;
120-
ELF_EF Flags;
120+
std::optional<ELF_EF> Flags;
121121
llvm::yaml::Hex64 Entry;
122122
std::optional<StringRef> SectionHeaderStringTable;
123123

llvm/lib/ObjectYAML/ELFEmitter.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,11 @@ void ELFState<ELFT>::writeELFHeader(raw_ostream &OS) {
481481

482482
Header.e_version = EV_CURRENT;
483483
Header.e_entry = Doc.Header.Entry;
484-
Header.e_flags = Doc.Header.Flags;
484+
if (Doc.Header.Flags)
485+
Header.e_flags = *Doc.Header.Flags;
486+
else
487+
Header.e_flags = 0;
488+
485489
Header.e_ehsize = sizeof(Elf_Ehdr);
486490

487491
if (Doc.Header.EPhOff)

llvm/lib/ObjectYAML/ELFYAML.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1160,7 +1160,7 @@ void MappingTraits<ELFYAML::FileHeader>::mapping(IO &IO,
11601160
IO.mapOptional("ABIVersion", FileHdr.ABIVersion, Hex8(0));
11611161
IO.mapRequired("Type", FileHdr.Type);
11621162
IO.mapOptional("Machine", FileHdr.Machine);
1163-
IO.mapOptional("Flags", FileHdr.Flags, ELFYAML::ELF_EF(0));
1163+
IO.mapOptional("Flags", FileHdr.Flags);
11641164
IO.mapOptional("Entry", FileHdr.Entry, Hex64(0));
11651165
IO.mapOptional("SectionHeaderStringTable", FileHdr.SectionHeaderStringTable);
11661166

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
## Check how obj2yaml dumps e_flags field.
2+
3+
--- !ELF
4+
FileHeader:
5+
Class: ELFCLASS64
6+
Data: ELFDATA2MSB
7+
Type: ET_EXEC
8+
Machine: EM_SPARC32PLUS
9+
Flags: [ [[FLAGS]] ]
10+
11+
# RUN: yaml2obj -DFLAGS="EF_SPARC_32PLUS " %s -o %t2
12+
# RUN: obj2yaml %t2 | FileCheck %s --check-prefix=FLAG
13+
14+
# FLAG: --- !ELF
15+
# FLAG-NEXT: FileHeader:
16+
# FLAG-NEXT: Class: ELFCLASS64
17+
# FLAG-NEXT: Data: ELFDATA2MSB
18+
# FLAG-NEXT: Type: ET_EXEC
19+
# FLAG-NEXT: Machine: EM_SPARC32PLUS
20+
# FLAG-NEXT: Flags: [ EF_SPARC_32PLUS ]
21+
22+
# RUN: yaml2obj -DFLAGS="EF_SPARC_HAL_R1 " %s -o %t3
23+
# RUN: obj2yaml %t3 | FileCheck %s --check-prefix=FLAG2
24+
25+
# FLAG2: --- !ELF
26+
# FLAG2-NEXT: FileHeader:
27+
# FLAG2-NEXT: Class: ELFCLASS64
28+
# FLAG2-NEXT: Data: ELFDATA2MSB
29+
# FLAG2-NEXT: Type: ET_EXEC
30+
# FLAG2-NEXT: Machine: EM_SPARC32PLUS
31+
# FLAG2-NEXT: Flags: [ EF_SPARC_HAL_R1 ]
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
## Test for FileHeader Flags.
2+
3+
## When FLAGS variable isn't defined, the e_flags value is 0.
4+
## Otherwise, it's the specified value.
5+
6+
# RUN: yaml2obj %s -o %t
7+
# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=NO-FLAG
8+
9+
# RUN: yaml2obj %s -o %t -DFLAGS=[EF_SPARC_32PLUS]
10+
# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=FLAG
11+
12+
!ELF
13+
FileHeader:
14+
Class: ELFCLASS32
15+
Data: ELFDATA2LSB
16+
Type: ET_EXEC
17+
Machine: EM_SPARC32PLUS
18+
Flags: [[FLAGS=<none>]]
19+
20+
# NO-FLAG: Flags [ (0x0)
21+
# NO-FLAG-NEXT: ]
22+
23+
# FLAG: Flags [ (0x100)
24+
# FLAG-NEXT: EF_SPARC_32PLUS (0x100)
25+
# FLAG-NEXT: ]

llvm/tools/obj2yaml/elf2yaml.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,8 @@ template <class ELFT> Expected<ELFYAML::Object *> ELFDumper<ELFT>::dump() {
281281
Y->Header.Type = Obj.getHeader().e_type;
282282
if (Obj.getHeader().e_machine != 0)
283283
Y->Header.Machine = ELFYAML::ELF_EM(Obj.getHeader().e_machine);
284-
Y->Header.Flags = Obj.getHeader().e_flags;
284+
if (Obj.getHeader().e_flags != 0)
285+
Y->Header.Flags = ELFYAML::ELF_EF(Obj.getHeader().e_flags);
285286
Y->Header.Entry = Obj.getHeader().e_entry;
286287

287288
// Dump sections

0 commit comments

Comments
 (0)