[llvm] r370472 - [yaml2obj][obj2yaml] - Use a single "Other" field instead of "Other", "Visibility" and "StOther".

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 30 06:39:22 PDT 2019


Author: grimar
Date: Fri Aug 30 06:39:22 2019
New Revision: 370472

URL: http://llvm.org/viewvc/llvm-project?rev=370472&view=rev
Log:
[yaml2obj][obj2yaml] - Use a single "Other" field instead of "Other", "Visibility" and "StOther".

Currenly we can encode the 'st_other' field of symbol using 3 fields.
'Visibility' is used to encode STV_* values.
'Other' is used to encode everything except the visibility, but it can't handle arbitrary values.
'StOther' is used to encode arbitrary values when 'Visibility'/'Other' are not helpfull enough.

'st_other' field is used to encode symbol visibility and platform-dependent
flags and values. Problem to encode it is that it consists of Visibility part (STV_* values)
which are enumeration values and the Other part, which is different and inconsistent.

For MIPS the Other part contains flags for all STO_MIPS_* values except STO_MIPS_MIPS16.
(Like comment in ELFDumper says: "Someones in their infinite wisdom decided to make
STO_MIPS_MIPS16 flag overlapped with other ST_MIPS_xxx flags."...)

And for PPC64 the Other part might actually encode any value.

This patch implements custom logic for handling the st_other and removes
'Visibility' and 'StOther' fields.

Here is an example of a new YAML style this patch allows:

- Name:  foo
  Other: [ 0x4 ]
- Name:  bar
  Other: [ STV_PROTECTED, 4 ]
- Name:  zed
  Other: [ STV_PROTECTED, STO_MIPS_OPTIONAL, 0xf8 ]

Differential revision: https://reviews.llvm.org/D66886

Modified:
    llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h
    llvm/trunk/include/llvm/Support/YAMLTraits.h
    llvm/trunk/lib/ObjectYAML/ELFEmitter.cpp
    llvm/trunk/lib/ObjectYAML/ELFYAML.cpp
    llvm/trunk/lib/Support/YAMLTraits.cpp
    llvm/trunk/test/tools/llvm-objcopy/ELF/localize-hidden.test
    llvm/trunk/test/tools/llvm-objcopy/ELF/symbol-copy.test
    llvm/trunk/test/tools/llvm-objdump/elf-symbol-visibility.test
    llvm/trunk/test/tools/llvm-readobj/elf-symbol-visibility.test
    llvm/trunk/test/tools/obj2yaml/elf-symbol-visibility.yaml
    llvm/trunk/test/tools/yaml2obj/elf-symbol-stother.yaml
    llvm/trunk/test/tools/yaml2obj/elf-symbol-visibility.yaml

Modified: llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h (original)
+++ llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h Fri Aug 30 06:39:22 2019
@@ -54,8 +54,6 @@ LLVM_YAML_STRONG_TYPEDEF(uint64_t, ELF_S
 LLVM_YAML_STRONG_TYPEDEF(uint16_t, ELF_SHN)
 LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STB)
 LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STT)
-LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STV)
-LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STO)
 
 LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_AFL_REG)
 LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_ABI_FP)
@@ -108,11 +106,6 @@ struct Symbol {
   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;
 };
 
 struct SectionOrType {
@@ -402,16 +395,6 @@ struct ScalarEnumerationTraits<ELFYAML::
 };
 
 template <>
-struct ScalarEnumerationTraits<ELFYAML::ELF_STV> {
-  static void enumeration(IO &IO, ELFYAML::ELF_STV &Value);
-};
-
-template <>
-struct ScalarBitSetTraits<ELFYAML::ELF_STO> {
-  static void bitset(IO &IO, ELFYAML::ELF_STO &Value);
-};
-
-template <>
 struct ScalarEnumerationTraits<ELFYAML::ELF_REL> {
   static void enumeration(IO &IO, ELFYAML::ELF_REL &Value);
 };

Modified: llvm/trunk/include/llvm/Support/YAMLTraits.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLTraits.h?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/YAMLTraits.h (original)
+++ llvm/trunk/include/llvm/Support/YAMLTraits.h Fri Aug 30 06:39:22 2019
@@ -748,7 +748,7 @@ public:
   IO(void *Ctxt = nullptr);
   virtual ~IO();
 
-  virtual bool outputting() = 0;
+  virtual bool outputting() const = 0;
 
   virtual unsigned beginSequence() = 0;
   virtual bool preflightElement(unsigned, void *&) = 0;
@@ -842,7 +842,7 @@ public:
       Val = Val | ConstVal;
   }
 
-  void *getContext();
+  void *getContext() const;
   void setContext(void *);
 
   template <typename T> void mapRequired(const char *Key, T &Val) {
@@ -1402,7 +1402,7 @@ public:
   std::error_code error();
 
 private:
-  bool outputting() override;
+  bool outputting() const override;
   bool mapTag(StringRef, bool) override;
   void beginMapping() override;
   void endMapping() override;
@@ -1549,7 +1549,7 @@ public:
   /// anyway.
   void setWriteDefaultValues(bool Write) { WriteDefaultValues = Write; }
 
-  bool outputting() override;
+  bool outputting() const override;
   bool mapTag(StringRef, bool) override;
   void beginMapping() override;
   void endMapping() override;

Modified: llvm/trunk/lib/ObjectYAML/ELFEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/ELFEmitter.cpp?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/ELFEmitter.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/ELFEmitter.cpp Fri Aug 30 06:39:22 2019
@@ -464,12 +464,7 @@ toELFSymbols(NameToIdxMap &SN2I, ArrayRe
     }
     // 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 ? *Sym.Other : 0;
     Symbol.st_size = Sym.Size;
   }
 

Modified: llvm/trunk/lib/ObjectYAML/ELFYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/ELFYAML.cpp?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/ELFYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/ELFYAML.cpp Fri Aug 30 06:39:22 2019
@@ -11,12 +11,14 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/ObjectYAML/ELFYAML.h"
+#include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/BinaryFormat/ELF.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/MipsABIFlags.h"
 #include "llvm/Support/YAMLTraits.h"
+#include "llvm/Support/WithColor.h"
 #include <cassert>
 #include <cstdint>
 
@@ -592,34 +594,6 @@ void ScalarEnumerationTraits<ELFYAML::EL
   IO.enumFallback<Hex8>(Value);
 }
 
-void ScalarEnumerationTraits<ELFYAML::ELF_STV>::enumeration(
-    IO &IO, ELFYAML::ELF_STV &Value) {
-#define ECase(X) IO.enumCase(Value, #X, ELF::X)
-  ECase(STV_DEFAULT);
-  ECase(STV_INTERNAL);
-  ECase(STV_HIDDEN);
-  ECase(STV_PROTECTED);
-#undef ECase
-}
-
-void ScalarBitSetTraits<ELFYAML::ELF_STO>::bitset(IO &IO,
-                                                  ELFYAML::ELF_STO &Value) {
-  const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
-  assert(Object && "The IO context is not initialized");
-#define BCase(X) IO.bitSetCase(Value, #X, ELF::X)
-  switch (Object->Header.Machine) {
-  case ELF::EM_MIPS:
-    BCase(STO_MIPS_OPTIONAL);
-    BCase(STO_MIPS_PLT);
-    BCase(STO_MIPS_PIC);
-    BCase(STO_MIPS_MICROMIPS);
-    break;
-  default:
-    break; // Nothing to do
-  }
-#undef BCase
-#undef BCaseMask
-}
 
 void ScalarEnumerationTraits<ELFYAML::ELF_RSS>::enumeration(
     IO &IO, ELFYAML::ELF_RSS &Value) {
@@ -863,31 +837,112 @@ void MappingTraits<ELFYAML::ProgramHeade
   IO.mapOptional("Offset", Phdr.Offset);
 }
 
+LLVM_YAML_STRONG_TYPEDEF(StringRef, StOtherPiece)
+
+template <> struct ScalarTraits<StOtherPiece> {
+  static void output(const StOtherPiece &Val, void *, raw_ostream &Out) {
+    Out << Val;
+  }
+  static StringRef input(StringRef Scalar, void *, StOtherPiece &Val) {
+    Val = Scalar;
+    return {};
+  }
+  static QuotingType mustQuote(StringRef) { return QuotingType::None; }
+};
+template <> struct SequenceElementTraits<StOtherPiece> {
+  static const bool flow = true;
+};
+
 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;
+  NormalizedOther(IO &IO) : YamlIO(IO) {}
+  NormalizedOther(IO &IO, Optional<uint8_t> Original) : YamlIO(IO) {
+    assert(Original && "This constructor is only used for outputting YAML and "
+                       "assumes a non-empty Original");
+    std::vector<StOtherPiece> Ret;
+    const auto *Object = static_cast<ELFYAML::Object *>(YamlIO.getContext());
+    for (std::pair<StringRef, uint8_t> &P :
+         getFlags(Object->Header.Machine).takeVector()) {
+      uint8_t FlagValue = P.second;
+      if ((*Original & FlagValue) != FlagValue)
+        continue;
+      *Original &= ~FlagValue;
+      Ret.push_back({P.first});
+    }
+
+    if (*Original != 0) {
+      UnknownFlagsHolder = std::to_string(*Original);
+      Ret.push_back({UnknownFlagsHolder});
+    }
+
+    if (!Ret.empty())
+      Other = std::move(Ret);
+  }
+
+  uint8_t toValue(StringRef Name) {
+    const auto *Object = static_cast<ELFYAML::Object *>(YamlIO.getContext());
+    MapVector<StringRef, uint8_t> Flags = getFlags(Object->Header.Machine);
+
+    auto It = Flags.find(Name);
+    if (It != Flags.end())
+      return It->second;
+
+    uint8_t Val;
+    if (to_integer(Name, Val))
+      return Val;
+
+    llvm::WithColor::error()
+        << "an unknown value is used for symbol's 'Other' field: " << Name
+        << ".\n";
+    exit(1);
   }
 
   Optional<uint8_t> denormalize(IO &) {
-    if (!Visibility && !Other)
+    if (!Other)
       return None;
-
     uint8_t Ret = 0;
-    if (Visibility)
-      Ret |= *Visibility;
-    if (Other)
-      Ret |= *Other;
+    for (StOtherPiece &Val : *Other)
+      Ret |= toValue(Val);
     return Ret;
   }
 
-  Optional<ELFYAML::ELF_STV> Visibility;
-  Optional<ELFYAML::ELF_STO> Other;
+  // st_other field is used to encode symbol visibility and platform-dependent
+  // flags and values. This method returns a name to value map that is used for
+  // parsing and encoding this field.
+  MapVector<StringRef, uint8_t> getFlags(unsigned EMachine) {
+    MapVector<StringRef, uint8_t> Map;
+    // STV_* values are just enumeration values. We add them in a reversed order
+    // because when we convert the st_other to named constants when printing
+    // YAML we want to use a maximum number of bits on each step:
+    // when we have st_other == 3, we want to print it as STV_PROTECTED (3), but
+    // not as STV_HIDDEN (2) + STV_INTERNAL (1).
+    Map["STV_PROTECTED"] = ELF::STV_PROTECTED;
+    Map["STV_HIDDEN"] = ELF::STV_HIDDEN;
+    Map["STV_INTERNAL"] = ELF::STV_INTERNAL;
+    // STV_DEFAULT is used to represent the default visibility and has a value
+    // 0. We want to be able to read it from YAML documents, but there is no
+    // reason to print it.
+    if (!YamlIO.outputting())
+      Map["STV_DEFAULT"] = ELF::STV_DEFAULT;
+
+    // MIPS is not consistent. All of the STO_MIPS_* values are bit flags,
+    // except STO_MIPS_MIPS16 which overlaps them. It should be checked and
+    // consumed first when we print the output, because we do not want to print
+    // any other flags that have the same bits instead.
+    if (EMachine == ELF::EM_MIPS) {
+      Map["STO_MIPS_MIPS16"] = ELF::STO_MIPS_MIPS16;
+      Map["STO_MIPS_MICROMIPS"] = ELF::STO_MIPS_MICROMIPS;
+      Map["STO_MIPS_PIC"] = ELF::STO_MIPS_PIC;
+      Map["STO_MIPS_PLT"] = ELF::STO_MIPS_PLT;
+      Map["STO_MIPS_OPTIONAL"] = ELF::STO_MIPS_OPTIONAL;
+    }
+    return Map;
+  }
+
+  const IO &YamlIO;
+  Optional<std::vector<StOtherPiece>> Other;
+  std::string UnknownFlagsHolder;
 };
 
 } // end anonymous namespace
@@ -902,22 +957,13 @@ void MappingTraits<ELFYAML::Symbol>::map
   IO.mapOptional("Value", Symbol.Value, Hex64(0));
   IO.mapOptional("Size", Symbol.Size, Hex64(0));
 
-  // Symbol's Other field is a bit special. It is a bit field that represents
-  // st_other and usually holds symbol visibility. When we write a YAML document
-  // we split it into two fields named "Visibility" and "Other". The latter one
-  // usually holds no value, and so is almost never printed, although some
-  // 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);
+  // Symbol's Other field is a bit special. It is usually a field that
+  // represents st_other and holds the symbol visibility. However, on some
+  // platforms, it can contain bit fields and regular values, or even sometimes a
+  // crazy mix of them (see comments for NormalizedOther). Because of this, we
+  // need special handling.
   MappingNormalization<NormalizedOther, Optional<uint8_t>> Keys(IO,
                                                                 Symbol.Other);
-  IO.mapOptional("Visibility", Keys->Visibility);
   IO.mapOptional("Other", Keys->Other);
 }
 
@@ -927,8 +973,6 @@ StringRef MappingTraits<ELFYAML::Symbol>
     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();
 }
 

Modified: llvm/trunk/lib/Support/YAMLTraits.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLTraits.cpp?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/lib/Support/YAMLTraits.cpp (original)
+++ llvm/trunk/lib/Support/YAMLTraits.cpp Fri Aug 30 06:39:22 2019
@@ -40,7 +40,7 @@ IO::IO(void *Context) : Ctxt(Context) {}
 
 IO::~IO() = default;
 
-void *IO::getContext() {
+void *IO::getContext() const {
   return Ctxt;
 }
 
@@ -79,7 +79,7 @@ void Input::ScalarHNode::anchor() {}
 void Input::MapHNode::anchor() {}
 void Input::SequenceHNode::anchor() {}
 
-bool Input::outputting() {
+bool Input::outputting() const {
   return false;
 }
 
@@ -440,7 +440,7 @@ Output::Output(raw_ostream &yout, void *
 
 Output::~Output() = default;
 
-bool Output::outputting() {
+bool Output::outputting() const {
   return true;
 }
 

Modified: llvm/trunk/test/tools/llvm-objcopy/ELF/localize-hidden.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/localize-hidden.test?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/localize-hidden.test (original)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/localize-hidden.test Fri Aug 30 06:39:22 2019
@@ -34,7 +34,7 @@ Symbols:
     Section:  .text
     Value:    0x1008
     Size:     8
-    Visibility: STV_HIDDEN
+    Other:    [ STV_HIDDEN ]
   - Name:     defaultGlobal
     Type:     STT_FUNC
     Size:     8
@@ -46,14 +46,14 @@ Symbols:
     Section:  .data
     Value:    0x2006
     Size:     2
-    Visibility: STV_HIDDEN
+    Other:    [ STV_HIDDEN ]
     Binding:  STB_GLOBAL
   - Name:     hiddenGlobalCommon
     Type:     STT_OBJECT
     Index:    SHN_COMMON
     Value:    0x2006
     Size:     2
-    Visibility: STV_HIDDEN
+    Other:    [ STV_HIDDEN ]
     Binding:  STB_GLOBAL
   - Name:     undefGlobal
     Type:     STT_FUNC
@@ -64,21 +64,21 @@ Symbols:
     Section:  .data
     Value:    0x2002
     Size:     2
-    Visibility: STV_INTERNAL
+    Other:    [ STV_INTERNAL ]
     Binding:  STB_GLOBAL
   - Name:     protectedGlobal
     Type:     STT_OBJECT
     Section:  .data
     Value:    0x2000
     Size:     4
-    Visibility: STV_PROTECTED
+    Other:    [ STV_PROTECTED ]
     Binding:  STB_GLOBAL
   - Name:     hiddenWeak
     Type:     STT_FUNC
     Section:  .text
     Value:    0x1010
     Size:     8
-    Visibility: STV_HIDDEN
+    Other:    [ STV_HIDDEN ]
     Binding:  STB_WEAK
 
 #CHECK:     Relocations [

Modified: llvm/trunk/test/tools/llvm-objcopy/ELF/symbol-copy.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/symbol-copy.test?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/symbol-copy.test (original)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/symbol-copy.test Fri Aug 30 06:39:22 2019
@@ -33,7 +33,7 @@ Symbols:
     Section:  .text
     Value:    0x1001
     Size:     4
-    Visibility: STV_HIDDEN
+    Other:    [ STV_HIDDEN ]
     Binding:  STB_GLOBAL
   - Name:     foo
     Type:     STT_FUNC
@@ -45,7 +45,7 @@ Symbols:
     Section:  .data
     Value:    0x2002
     Size:     2
-    Visibility: STV_INTERNAL
+    Other:    [ STV_INTERNAL ]
     Binding:  STB_GLOBAL
   - Name:     bar
     Type:     STT_OBJECT

Modified: llvm/trunk/test/tools/llvm-objdump/elf-symbol-visibility.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/elf-symbol-visibility.test?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/elf-symbol-visibility.test (original)
+++ llvm/trunk/test/tools/llvm-objdump/elf-symbol-visibility.test Fri Aug 30 06:39:22 2019
@@ -23,13 +23,13 @@ Symbols:
   - Name:    default
     Section: .text
   - Name:    internal
-    Visibility: STV_INTERNAL
+    Other:   [ STV_INTERNAL ]
     Section: .text
   - Name:    hidden
-    Visibility: STV_HIDDEN
+    Other:   [ STV_HIDDEN ]
     Section: .text
   - Name:    protected
-    Visibility: STV_PROTECTED
+    Other:   [ STV_PROTECTED ]
     Section: .text
   - Name:    mips_pic
     Other:   [ STO_MIPS_PIC ]

Modified: llvm/trunk/test/tools/llvm-readobj/elf-symbol-visibility.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/elf-symbol-visibility.test?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-readobj/elf-symbol-visibility.test (original)
+++ llvm/trunk/test/tools/llvm-readobj/elf-symbol-visibility.test Fri Aug 30 06:39:22 2019
@@ -39,17 +39,17 @@ FileHeader:
   Machine: EM_386
 Symbols:
   - Name: default
-    Visibility: STV_DEFAULT
+    Other: [ STV_DEFAULT ]
     Binding: STB_GLOBAL
   - Name: internal
-    Visibility: STV_INTERNAL
+    Other: [ STV_INTERNAL ]
     Binding: STB_GLOBAL
   - Name: hidden
-    Visibility: STV_HIDDEN
+    Other: [ STV_HIDDEN ]
     Binding: STB_GLOBAL
   - Name: protected
-    Visibility: STV_PROTECTED
+    Other: [ STV_PROTECTED ]
     Binding: STB_GLOBAL
   - Name: other
     Binding: STB_GLOBAL
-    StOther: 4
+    Other: [ 4 ]

Modified: llvm/trunk/test/tools/obj2yaml/elf-symbol-visibility.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/obj2yaml/elf-symbol-visibility.yaml?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/test/tools/obj2yaml/elf-symbol-visibility.yaml (original)
+++ llvm/trunk/test/tools/obj2yaml/elf-symbol-visibility.yaml Fri Aug 30 06:39:22 2019
@@ -10,12 +10,12 @@
 # CHECK-NEXT:   Machine: EM_X86_64
 # CHECK-NEXT: Symbols:
 # CHECK-NEXT:   - Name: default
-# CHECK-NEXT:   - Name:       internal
-# CHECK-NEXT:     Visibility: STV_INTERNAL
-# CHECK-NEXT:   - Name:       hidden
-# CHECK-NEXT:     Visibility: STV_HIDDEN
-# CHECK-NEXT:   - Name:       protected
-# CHECK-NEXT:     Visibility: STV_PROTECTED
+# CHECK-NEXT:   - Name: internal
+# CHECK-NEXT:     Other: [ STV_INTERNAL ]
+# CHECK-NEXT:   - Name: hidden
+# CHECK-NEXT:     Other: [ STV_HIDDEN ]
+# CHECK-NEXT:   - Name: protected
+# CHECK-NEXT:     Other: [ STV_PROTECTED ]
 # CHECK-NEXT: ...
 
 --- !ELF
@@ -25,11 +25,11 @@ FileHeader:
   Type:    ET_REL
   Machine: EM_X86_64
 Symbols:
-  - Name:       default
-    Visibility: STV_DEFAULT
-  - Name:       internal
-    Visibility: STV_INTERNAL
-  - Name:       hidden
-    Visibility: STV_HIDDEN
-  - Name:       protected
-    Visibility: STV_PROTECTED
+  - Name:  default
+    Other: [ STV_DEFAULT ]
+  - Name:  internal
+    Other: [ STV_INTERNAL ]
+  - Name:  hidden
+    Other: [ STV_HIDDEN ]
+  - Name:  protected
+    Other: [ STV_PROTECTED ]

Modified: llvm/trunk/test/tools/yaml2obj/elf-symbol-stother.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/yaml2obj/elf-symbol-stother.yaml?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/test/tools/yaml2obj/elf-symbol-stother.yaml (original)
+++ llvm/trunk/test/tools/yaml2obj/elf-symbol-stother.yaml Fri Aug 30 06:39:22 2019
@@ -4,8 +4,7 @@
 ## to a different machine type to what is specified by the YAML.
 
 # RUN: not yaml2obj --docnum=1 2>&1 %s | FileCheck %s --check-prefix=ERR
-# ERR:      error: unknown bit value
-# ERR-NEXT: Other: [ STO_MIPS_OPTIONAL ]
+# ERR: error: an unknown value is used for symbol's 'Other' field: STO_MIPS_OPTIONAL.
 
 --- !ELF
 FileHeader:
@@ -38,63 +37,23 @@ Symbols:
   - Name:  foo
     Other: [ STO_MIPS_OPTIONAL ]
 
-## Test that instead of using the "Other" field we can use the "StOther" field
-## to set st_other to any arbitrary value.
+## Test that we can mix named and unnamed constants and set
+## st_other to any arbitrary value.
 
 # RUN: yaml2obj --docnum=3 %s > %t3
-# RUN: llvm-readobj --symbols %t3 | FileCheck %s --check-prefix=USE-STOTHER
-# RUN: yaml2obj --docnum=4 %s > %t4
-# RUN: llvm-readobj --symbols %t4 | FileCheck %s --check-prefix=USE-STOTHER
-
-# USE-STOTHER:      Name: foo
-# USE-STOTHER:      Other [
-# USE-STOTHER-SAME: (0x4)
-
-# USE-STOTHER:      Name: bar
-# USE-STOTHER:      Other [
-# USE-STOTHER-SAME: (0xFF)
+# RUN: llvm-readobj --symbols %t3 | FileCheck %s --check-prefix=VALUE
 
---- !ELF
-FileHeader:
-  Class:   ELFCLASS32
-  Data:    ELFDATA2LSB
-  Type:    ET_REL
-  Machine: EM_MIPS
-Symbols:
-  - Name:    foo
-    StOther: 4
-  - Name:    bar
-    StOther: 0xff
-
---- !ELF
-FileHeader:
-  Class:   ELFCLASS32
-  Data:    ELFDATA2LSB
-  Type:    ET_REL
-  Machine: EM_386
-Symbols:
-  - Name:    foo
-    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 ]
+# VALUE:      Name: foo
+# VALUE:      Other [
+# VALUE-SAME: (0x4)
+
+# VALUE:      Name: bar
+# VALUE:      Other [
+# VALUE-SAME: (0x7)
+
+# VALUE:      Name: zed
+# VALUE:      Other [
+# VALUE-SAME: (0xFF)
 
 --- !ELF
 FileHeader:
@@ -103,6 +62,9 @@ FileHeader:
   Type:    ET_REL
   Machine: EM_MIPS
 Symbols:
-  - Name:    foo
-    StOther: 0
-    Visibility: STV_DEFAULT
+  - Name:  foo
+    Other: [ 0x4 ]
+  - Name:  bar
+    Other: [ STV_PROTECTED, 4 ]
+  - Name:  zed
+    Other: [ STV_PROTECTED, STO_MIPS_OPTIONAL, 0xf8 ]

Modified: llvm/trunk/test/tools/yaml2obj/elf-symbol-visibility.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/yaml2obj/elf-symbol-visibility.yaml?rev=370472&r1=370471&r2=370472&view=diff
==============================================================================
--- llvm/trunk/test/tools/yaml2obj/elf-symbol-visibility.yaml (original)
+++ llvm/trunk/test/tools/yaml2obj/elf-symbol-visibility.yaml Fri Aug 30 06:39:22 2019
@@ -3,7 +3,7 @@
 # RUN: yaml2obj %s | llvm-readobj --symbols - | FileCheck --check-prefix OBJ %s
 
 # OBJ:      Symbol {
-# OBJ:        Name: default (1)
+# OBJ:        Name: default1
 # OBJ-NEXT:   Value: 0x0
 # OBJ-NEXT:   Size: 0
 # OBJ-NEXT:   Binding: Local (0x0)
@@ -12,7 +12,16 @@
 # OBJ-NEXT:   Section: Undefined (0x0)
 # OBJ-NEXT: }
 # OBJ-NEXT: Symbol {
-# OBJ-NEXT:   Name: internal (16)
+# OBJ-NEXT:   Name: default2
+# OBJ-NEXT:   Value: 0x0
+# OBJ-NEXT:   Size: 0
+# OBJ-NEXT:   Binding: Local (0x0)
+# OBJ-NEXT:   Type: None (0x0)
+# OBJ-NEXT:   Other: 0
+# OBJ-NEXT:   Section: Undefined (0x0)
+# OBJ-NEXT: }
+# OBJ-NEXT: Symbol {
+# OBJ-NEXT:   Name: internal
 # OBJ-NEXT:   Value: 0x0
 # OBJ-NEXT:   Size: 0
 # OBJ-NEXT:   Binding: Local (0x0)
@@ -23,7 +32,7 @@
 # OBJ-NEXT:   Section: Undefined (0x0)
 # OBJ-NEXT: }
 # OBJ-NEXT: Symbol {
-# OBJ-NEXT:   Name: hidden (9)
+# OBJ-NEXT:   Name: hidden
 # OBJ-NEXT:   Value: 0x0
 # OBJ-NEXT:   Size: 0
 # OBJ-NEXT:   Binding: Local (0x0)
@@ -34,7 +43,7 @@
 # OBJ-NEXT:   Section: Undefined (0x0)
 # OBJ-NEXT: }
 # OBJ-NEXT: Symbol {
-# OBJ-NEXT:   Name: protected (25)
+# OBJ-NEXT:   Name: protected
 # OBJ-NEXT:   Value: 0x0
 # OBJ-NEXT:   Size: 0
 # OBJ-NEXT:   Binding: Local (0x0)
@@ -52,11 +61,12 @@ FileHeader:
   Type:    ET_REL
   Machine: EM_X86_64
 Symbols:
-  - Name:       default
-    Visibility: STV_DEFAULT
-  - Name:       internal
-    Visibility: STV_INTERNAL
-  - Name:       hidden
-    Visibility: STV_HIDDEN
-  - Name:       protected
-    Visibility: STV_PROTECTED
+  - Name:  default1
+  - Name:  default2
+    Other: [ STV_DEFAULT ]
+  - Name:  internal
+    Other: [ STV_INTERNAL ]
+  - Name:  hidden
+    Other: [ STV_HIDDEN ]
+  - Name:  protected
+    Other: [ STV_PROTECTED ]




More information about the llvm-commits mailing list