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 {