This update does the following:
  * Moves enum Scope from DefinedAtom.h to Atom.h
  * Adds scope method to AbsoluteAtom class
  * Updates YAML to print scope of AbsoluteAtoms
  * Update Native Reader/Writer to handle this new, "attribute"
  * Adds testcase 
Reviewed and approved by Nick Kledzik

llvm-svn: 166189
diff --git a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
index 45b5702..6fa3025 100644
--- a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
+++ b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
@@ -11,7 +11,6 @@
 // to consume an ELF file and produces atoms out of it.
 //
 //===----------------------------------------------------------------------===//
-
 #include "lld/ReaderWriter/ReaderELF.h"
 #include "lld/Core/File.h"
 #include "lld/Core/Reference.h"
@@ -115,14 +114,18 @@
 /// particular address.  This atom has no content its address will be used by
 /// the writer to fixup references that point to it.
 template<llvm::support::endianness target_endianness, bool is64Bits>
-class ELFAbsoluteAtom final: public AbsoluteAtom {
+class ELFAbsoluteAtom final : public AbsoluteAtom {
+
+  typedef llvm::object::Elf_Sym_Impl<target_endianness, is64Bits> Elf_Sym;
 
 public:
   ELFAbsoluteAtom(const File &file,
                   llvm::StringRef name,
+                  const Elf_Sym *symbol,
                   uint64_t value)
     : _owningFile(file)
     , _name(name)
+    , _symbol(symbol)
     , _value(value)
   {}
 
@@ -130,6 +133,15 @@
     return _owningFile;
   }
 
+  virtual Scope scope() const {
+    if (_symbol->st_other == llvm::ELF::STV_HIDDEN)
+      return scopeLinkageUnit;
+    if (_symbol->getBinding() == llvm::ELF::STB_LOCAL)
+      return scopeTranslationUnit;
+    else
+      return scopeGlobal;
+  }
+
   virtual llvm::StringRef name() const {
     return _name;
   }
@@ -141,6 +153,7 @@
 private:
   const File &_owningFile;
   llvm::StringRef _name;
+  const Elf_Sym *_symbol;
   uint64_t _value;
 };
 
@@ -308,6 +321,7 @@
         ret = typeZeroFill;
       break;
     }
+
     return ret;
   }
 
@@ -319,7 +333,6 @@
         || _symbol->st_shndx == llvm::ELF::SHN_COMMON) {
       return Alignment(llvm::Log2_64(_symbol->st_value));
     }
-
     return Alignment(llvm::Log2_64(_section->sh_addralign));
   }
 
@@ -422,7 +435,6 @@
   llvm::StringRef _sectionName;
   const Elf_Sym *_symbol;
   const Elf_Shdr *_section;
-
   // _contentData will hold the bits that make up the atom.
   llvm::ArrayRef<uint8_t> _contentData;
 
@@ -543,7 +555,7 @@
         auto *newAtom = new (_readerStorage.Allocate
                        <ELFAbsoluteAtom<target_endianness, is64Bits> > ()) 
                         ELFAbsoluteAtom<target_endianness, is64Bits>
-                          (*this, symbolName, symbol->st_value);
+                          (*this, symbolName, symbol, symbol->st_value);
 
         _absoluteAtoms._atoms.push_back(newAtom);
         _symbolToAtomMapping.insert(std::make_pair(symbol, newAtom));