Skip to content

Commit

Permalink
Revert "[yaml2obj] - Don't allow setting StOther and Other/Visibility…
Browse files Browse the repository at this point in the history
… at the same time."

This reverts commit r370032, it was causing check-llvm failures on
sanitizer-x86_64-linux-bootstrap-msan

llvm-svn: 370198
  • Loading branch information
vlad902 committed Aug 28, 2019
1 parent 14e07d7 commit aba62e9
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 73 deletions.
7 changes: 1 addition & 6 deletions llvm/include/llvm/ObjectYAML/ELFYAML.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,7 @@ struct Symbol {
ELF_STB Binding;
llvm::yaml::Hex64 Value;
llvm::yaml::Hex64 Size;
Optional<uint8_t> Other;

// This can be used to set any custom value for the st_other field
// when it is not possible to do so using the "Other" field, which only takes
// specific named constants.
Optional<uint8_t> StOther;
uint8_t Other;
};

struct SectionOrType {
Expand Down
7 changes: 1 addition & 6 deletions llvm/lib/ObjectYAML/ELFEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -464,12 +464,7 @@ toELFSymbols(NameToIdxMap &SN2I, ArrayRef<ELFYAML::Symbol> Symbols,
}
// else Symbol.st_shndex == SHN_UNDEF (== 0), since it was zero'd earlier.
Symbol.st_value = Sym.Value;

if (Sym.Other)
Symbol.st_other = *Sym.Other;
else if (Sym.StOther)
Symbol.st_other = *Sym.StOther;

Symbol.st_other = Sym.Other;
Symbol.st_size = Sym.Size;
}

Expand Down
50 changes: 18 additions & 32 deletions llvm/lib/ObjectYAML/ELFYAML.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -866,28 +866,15 @@ void MappingTraits<ELFYAML::ProgramHeader>::mapping(
namespace {

struct NormalizedOther {
NormalizedOther(IO &) {}
NormalizedOther(IO &, Optional<uint8_t> Original) {
if (uint8_t Val = *Original & 0x3)
Visibility = Val;
if (uint8_t Val = *Original & ~0x3)
Other = Val;
}

Optional<uint8_t> denormalize(IO &) {
if (!Visibility && !Other)
return None;
NormalizedOther(IO &)
: Visibility(ELFYAML::ELF_STV(0)), Other(ELFYAML::ELF_STO(0)) {}
NormalizedOther(IO &, uint8_t Original)
: Visibility(Original & 0x3), Other(Original & ~0x3) {}

uint8_t Ret = 0;
if (Visibility)
Ret |= *Visibility;
if (Other)
Ret |= *Other;
return Ret;
}
uint8_t denormalize(IO &) { return Visibility | Other; }

Optional<ELFYAML::ELF_STV> Visibility;
Optional<ELFYAML::ELF_STO> Other;
ELFYAML::ELF_STV Visibility;
ELFYAML::ELF_STO Other;
};

} // end anonymous namespace
Expand All @@ -909,16 +896,17 @@ void MappingTraits<ELFYAML::Symbol>::mapping(IO &IO, ELFYAML::Symbol &Symbol) {
// targets (e.g. MIPS) may use it to specify the named bits to set (e.g.
// STO_MIPS_OPTIONAL). For producing broken objects we want to allow writing
// any value to st_other. To do this we allow one more field called "StOther".
// If it is present in a YAML document, we set st_other to its integer value
// whatever it is.
// obj2yaml should not print 'StOther', it should print 'Visibility' and
// 'Other' fields instead.
assert(!IO.outputting() || !Symbol.StOther.hasValue());
IO.mapOptional("StOther", Symbol.StOther);
MappingNormalization<NormalizedOther, Optional<uint8_t>> Keys(IO,
Symbol.Other);
IO.mapOptional("Visibility", Keys->Visibility);
IO.mapOptional("Other", Keys->Other);
// If it is present in a YAML document, we set st_other to that integer,
// ignoring the other fields.
Optional<llvm::yaml::Hex64> Other;
IO.mapOptional("StOther", Other);
if (Other) {
Symbol.Other = *Other;
} else {
MappingNormalization<NormalizedOther, uint8_t> Keys(IO, Symbol.Other);
IO.mapOptional("Visibility", Keys->Visibility, ELFYAML::ELF_STV(0));
IO.mapOptional("Other", Keys->Other, ELFYAML::ELF_STO(0));
}
}

StringRef MappingTraits<ELFYAML::Symbol>::validate(IO &IO,
Expand All @@ -927,8 +915,6 @@ StringRef MappingTraits<ELFYAML::Symbol>::validate(IO &IO,
return "Index and Section cannot both be specified for Symbol";
if (Symbol.NameIndex && !Symbol.Name.empty())
return "Name and NameIndex cannot both be specified for Symbol";
if (Symbol.StOther && Symbol.Other)
return "StOther cannot be specified for Symbol with either Visibility or Other";
return StringRef();
}

Expand Down
29 changes: 0 additions & 29 deletions llvm/test/tools/yaml2obj/elf-symbol-stother.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -77,32 +77,3 @@ Symbols:
StOther: 4
- Name: bar
StOther: 0xff

## Check we can't set StOther for a symbol if Visibility or Other is also specified.

# RUN: not yaml2obj --docnum=5 2>&1 %s | FileCheck %s --check-prefix=ERR2
# RUN: not yaml2obj --docnum=6 2>&1 %s | FileCheck %s --check-prefix=ERR2

# ERR2: error: StOther cannot be specified for Symbol with either Visibility or Other

--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_MIPS
Symbols:
- Name: foo
StOther: 0
Other: [ STO_MIPS_OPTIONAL ]

--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_MIPS
Symbols:
- Name: foo
StOther: 0
Visibility: STV_DEFAULT

0 comments on commit aba62e9

Please sign in to comment.