This change:
  * Updates ReaderELF.cpp contentType method to match ELF.h's logic and now handle
    typeData
  * Add -arch to ldd-core testdriver
  * Add testcase to check typeData
  * Update others to stay in sync with this change.

llvm-svn: 164976
diff --git a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
index 5aa5e91..365150a 100644
--- a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
+++ b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
@@ -278,17 +278,37 @@
 
   virtual ContentType contentType() const {
 
-    if (_symbol->getType() == llvm::ELF::STT_FUNC)
-      return typeCode;
+    ContentType ret = typeUnknown;
 
-    if ((_symbol->getType() == llvm::ELF::STT_COMMON)
-        || _symbol->st_shndx == llvm::ELF::SHN_COMMON)
-      return typeZeroFill;
 
-    if (_symbol->getType() == llvm::ELF::STT_OBJECT)
-      return typeData;
-
-    return typeUnknown;
+    switch (_section->sh_type) {
+    case llvm::ELF::SHT_PROGBITS:
+    case llvm::ELF::SHT_DYNAMIC:
+      switch (_section->sh_flags) {
+      case (llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR):
+        ret = typeCode;
+        break;
+      case (llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE):
+        ret = typeData;
+        break;
+      case llvm::ELF::SHF_ALLOC:
+      case (llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_MERGE):
+      case (llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_MERGE |
+            llvm::ELF::SHF_STRINGS):
+        ret = typeConstant;
+        break;
+      }
+      break;
+    case llvm::ELF::SHT_NOBITS:
+      ret = typeZeroFill;
+      break;
+    case llvm::ELF::SHT_NULL:
+      if ((_symbol->getType() == llvm::ELF::STT_COMMON)
+          || _symbol->st_shndx == llvm::ELF::SHN_COMMON)
+        ret = typeZeroFill;
+      break;
+    }
+    return ret;
   }
 
   virtual Alignment alignment() const {