summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/ObjectYAML/ELFYAML.h7
-rw-r--r--llvm/lib/ObjectYAML/ELFEmitter.cpp7
-rw-r--r--llvm/lib/ObjectYAML/ELFYAML.cpp50
-rw-r--r--llvm/test/tools/yaml2obj/elf-symbol-stother.yaml29
4 files changed, 20 insertions, 73 deletions
diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h
index 91a279bd7aa..a282f329945 100644
--- a/llvm/include/llvm/ObjectYAML/ELFYAML.h
+++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h
@@ -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 {
diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp
index 96b13e4e530..6a2d28e16e2 100644
--- a/llvm/lib/ObjectYAML/ELFEmitter.cpp
+++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp
@@ -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;
}
diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp
index fe6be47d8fd..e7db190eb0a 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -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
@@ -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,
@@ -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();
}
diff --git a/llvm/test/tools/yaml2obj/elf-symbol-stother.yaml b/llvm/test/tools/yaml2obj/elf-symbol-stother.yaml
index 32f392f3986..c867b9ec898 100644
--- a/llvm/test/tools/yaml2obj/elf-symbol-stother.yaml
+++ b/llvm/test/tools/yaml2obj/elf-symbol-stother.yaml
@@ -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
OpenPOWER on IntegriCloud