summaryrefslogtreecommitdiffstats
path: root/lld
diff options
context:
space:
mode:
authorSid Manning <sidneym@codeaurora.org>2012-10-01 23:23:05 +0000
committerSid Manning <sidneym@codeaurora.org>2012-10-01 23:23:05 +0000
commite861d43f656f9916affa68a7c5e9bbacd45b024e (patch)
treec1457a7b498b19a48d9f9d08c95991660e129ffc /lld
parent1d24e56bad707c432fe8f3c6d61d656912007726 (diff)
downloadbcm5719-llvm-e861d43f656f9916affa68a7c5e9bbacd45b024e.tar.gz
bcm5719-llvm-e861d43f656f9916affa68a7c5e9bbacd45b024e.zip
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
Diffstat (limited to 'lld')
-rw-r--r--lld/lib/ReaderWriter/ELF/ReaderELF.cpp38
-rw-r--r--lld/test/elf/Inputs/rodata-test.hexagonbin0 -> 669 bytes
-rw-r--r--lld/test/elf/Inputs/rodata-test.i386bin0 -> 537 bytes
-rw-r--r--lld/test/elf/check.objtxt2
-rw-r--r--lld/test/elf/rodata.objtxt7
-rw-r--r--lld/test/elf/sections.objtxt15
-rw-r--r--lld/tools/lld-core/lld-core.cpp28
7 files changed, 70 insertions, 20 deletions
diff --git a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
index 5aa5e91a78c..365150ae9e0 100644
--- a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
+++ b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
@@ -278,17 +278,37 @@ public:
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 {
diff --git a/lld/test/elf/Inputs/rodata-test.hexagon b/lld/test/elf/Inputs/rodata-test.hexagon
new file mode 100644
index 00000000000..f448748e2ab
--- /dev/null
+++ b/lld/test/elf/Inputs/rodata-test.hexagon
Binary files differ
diff --git a/lld/test/elf/Inputs/rodata-test.i386 b/lld/test/elf/Inputs/rodata-test.i386
new file mode 100644
index 00000000000..09f71eb5996
--- /dev/null
+++ b/lld/test/elf/Inputs/rodata-test.i386
Binary files differ
diff --git a/lld/test/elf/check.objtxt b/lld/test/elf/check.objtxt
index 8a09e661e0c..cb0f6bb9288 100644
--- a/lld/test/elf/check.objtxt
+++ b/lld/test/elf/check.objtxt
@@ -1,5 +1,5 @@
RUN: lld-core -reader ELF %p/Inputs/object-test.elf-i386 | FileCheck %s -check-prefix ELF-i386
-RUN: lld-core -reader ELF %p/Inputs/object-test.elf-hexagon | FileCheck %s -check-prefix ELF-hexagon
+RUN: lld-core -arch hexagon -reader ELF %p/Inputs/object-test.elf-hexagon | FileCheck %s -check-prefix ELF-hexagon
ELF-i386:atoms:
ELF-i386: - name: global_func
diff --git a/lld/test/elf/rodata.objtxt b/lld/test/elf/rodata.objtxt
new file mode 100644
index 00000000000..4773e0c7789
--- /dev/null
+++ b/lld/test/elf/rodata.objtxt
@@ -0,0 +1,7 @@
+RUN: lld-core -reader ELF -writer ELF -o %t1 %p/Inputs/rodata-test.i386 | llvm-objdump -section-headers %t1 | FileCheck -check-prefix=i386 %s
+RUN: lld-core -arch hexagon -reader ELF -writer ELF -o %t2 %p/Inputs/rodata-test.hexagon | llvm-objdump -section-headers %t2 | FileCheck -check-prefix=hexagon %s
+
+ i386: 4 .rodata 000000004
+
+ hexagon: 5 .rodata 000000004
+
diff --git a/lld/test/elf/sections.objtxt b/lld/test/elf/sections.objtxt
index d47d9d17638..84c78711df3 100644
--- a/lld/test/elf/sections.objtxt
+++ b/lld/test/elf/sections.objtxt
@@ -2,13 +2,14 @@ RUN: lld-core -reader ELF -writer ELF -o %t1 %p/Inputs/section-test.i386 | llvm-
RUN: llvm-readobj %t1 | FileCheck -check-prefix=READOBJ %s
RUN: elf-dump --dump-section %t1 | FileCheck -check-prefix=ED %s
-OBJDUMP: 0 000000000 00000000000000000
-OBJDUMP: 1 .text 00000000a 0000000000000014c TEXT DATA
-OBJDUMP: 2 .data 000000004 00000000000000158 DATA
-OBJDUMP: 3 .special 000000004 0000000000000015c DATA
-OBJDUMP: 4 .anotherspecial 000000004 00000000000000160 DATA
-OBJDUMP: 5 .bss 000000000 00000000000000164 BSS
-OBJDUMP: 6 .shstrtab 000000035 00000000000000164
+OBJDUMP: 0 000000000 00000000000000000
+OBJDUMP: 1 .text 00000000a 00000000000000174 TEXT DATA
+OBJDUMP: 2 .data 000000004 00000000000000180 DATA
+OBJDUMP: 3 .bss 000000000 00000000000000184 BSS
+OBJDUMP: 4 .special 000000004 00000000000000184 DATA
+OBJDUMP: 5 .anotherspecial 000000004 00000000000000188 DATA
+OBJDUMP: 6 000000000 0000000000000018c BSS
+OBJDUMP: 7 .shstrtab 000000036 0000000000000018c
READOBJ: File Format : ELF32-i386
READOBJ: Arch : i386
diff --git a/lld/tools/lld-core/lld-core.cpp b/lld/tools/lld-core/lld-core.cpp
index b78ae07680d..9a004cb1816 100644
--- a/lld/tools/lld-core/lld-core.cpp
+++ b/lld/tools/lld-core/lld-core.cpp
@@ -114,7 +114,23 @@ readerSelected("reader",
clEnumValN(readerELF, "ELF", "read as linux would"),
clEnumValEnd));
-
+enum ArchChoice {
+ i386 = llvm::ELF::EM_386,
+ x86_64 = llvm::ELF::EM_X86_64,
+ hexagon = llvm::ELF::EM_HEXAGON
+};
+llvm::cl::opt<ArchChoice>
+archSelected("arch",
+ llvm::cl::desc("Select architecture, only valid with ELF output"),
+ llvm::cl::values(
+ clEnumValN(i386, "i386",
+ "output i386, EM_386 file"),
+ clEnumValN(x86_64,
+ "x86_64", "output x86_64, EM_X86_64 file"),
+ clEnumValN(hexagon,
+ "hexagon", "output Hexagon, EM_HEXAGON file"),
+ clEnumValEnd));
+
class TestingResolverOptions : public ResolverOptions {
public:
@@ -146,12 +162,18 @@ int main(int argc, char *argv[]) {
if (cmdLineOutputFilePath.empty())
cmdLineOutputFilePath.assign("-");
- // create writer for final output
+ // create writer for final output, default to i386 if none selected
+ WriterOptionsELF writerOptionsELF(false, llvm::support::little,
+ llvm::ELF::ET_EXEC,
+ archSelected.getValue() == 0
+ ? i386
+ : archSelected);
+
TestingWriterOptionsYAML writerOptionsYAML(cmdLineDoStubsPass,
cmdLineDoGotPass);
WriterOptionsMachO writerOptionsMachO;
WriterOptionsPECOFF writerOptionsPECOFF;
- WriterOptionsELF writerOptionsELF;
+
Writer* writer = nullptr;
switch ( writeSelected ) {
case writeYAML:
OpenPOWER on IntegriCloud