summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2014-12-31 22:32:21 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2014-12-31 22:32:21 +0000
commit0ba09e6b843995837862e841e0184d4af19e1b05 (patch)
treefc13200f8189e9879e2a533cdacc2430bf19f9ad
parent508d29d5b7aa6df8a700d95c69692fec41506c24 (diff)
downloadbcm5719-llvm-0ba09e6b843995837862e841e0184d4af19e1b05.tar.gz
bcm5719-llvm-0ba09e6b843995837862e841e0184d4af19e1b05.zip
ReaderWriter: teach PE/COFF backend about ARM NT
This teaches lld about the ARM NT object types. Add a trivial test to ensure that it can handle ARM NT object file inputs. It is still unable to perform the necessary relocations for ARM NT, but this allows the linker to at least read the objects. llvm-svn: 225052
-rw-r--r--lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp3
-rw-r--r--lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp3
-rw-r--r--lld/test/pecoff/Inputs/armnt-obj.s12
-rw-r--r--lld/test/pecoff/Inputs/armnt-obj.yaml29
-rw-r--r--lld/test/pecoff/armnt.test6
5 files changed, 53 insertions, 0 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
index e6b0a741ee3..574badc6286 100644
--- a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
@@ -932,6 +932,9 @@ std::error_code FileCOFF::getReferenceArch(Reference::KindArch &result) {
case llvm::COFF::IMAGE_FILE_MACHINE_AMD64:
result = Reference::KindArch::x86_64;
return std::error_code();
+ case llvm::COFF::IMAGE_FILE_MACHINE_ARMNT:
+ result = Reference::KindArch::ARM;
+ return std::error_code();
case llvm::COFF::IMAGE_FILE_MACHINE_UNKNOWN:
result = Reference::KindArch::all;
return std::error_code();
diff --git a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
index 13f6a2e3a36..06d1c030bf4 100644
--- a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
@@ -697,6 +697,9 @@ void AtomChunk::addBaseRelocations(std::vector<uint64_t> &relocSites) const {
case llvm::COFF::IMAGE_FILE_MACHINE_AMD64:
relType = llvm::COFF::IMAGE_REL_AMD64_ADDR64;
break;
+ case llvm::COFF::IMAGE_FILE_MACHINE_ARMNT:
+ relType = llvm::COFF::IMAGE_REL_ARM_ADDR32;
+ break;
}
for (const auto *layout : _atomLayouts) {
diff --git a/lld/test/pecoff/Inputs/armnt-obj.s b/lld/test/pecoff/Inputs/armnt-obj.s
new file mode 100644
index 00000000000..20eeab0e1dd
--- /dev/null
+++ b/lld/test/pecoff/Inputs/armnt-obj.s
@@ -0,0 +1,12 @@
+
+ .syntax unified
+ .thumb
+ .text
+
+ .def main
+ .scl 2
+ .type 32
+ .endef
+main:
+ bx lr
+
diff --git a/lld/test/pecoff/Inputs/armnt-obj.yaml b/lld/test/pecoff/Inputs/armnt-obj.yaml
new file mode 100644
index 00000000000..7c53c6f0069
--- /dev/null
+++ b/lld/test/pecoff/Inputs/armnt-obj.yaml
@@ -0,0 +1,29 @@
+---
+header:
+ Machine: IMAGE_FILE_MACHINE_ARMNT
+ Characteristics: [ ]
+sections:
+ - Name: .text
+ Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_PURGEABLE, IMAGE_SCN_MEM_16BIT, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+ Alignment: 4
+ SectionData: '7047'
+symbols:
+ - Name: .text
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ SectionDefinition:
+ Length: 2
+ NumberOfRelocations: 0
+ NumberOfLinenumbers: 0
+ CheckSum: 0
+ Number: 1
+ - Name: main
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_FUNCTION
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+...
diff --git a/lld/test/pecoff/armnt.test b/lld/test/pecoff/armnt.test
new file mode 100644
index 00000000000..1cf6cd8114a
--- /dev/null
+++ b/lld/test/pecoff/armnt.test
@@ -0,0 +1,6 @@
+# RUN: yaml2obj -format coff -o %t.obj %p/Inputs/armnt-obj.yaml
+# RUN: lld -flavor link /out:%t.dll /subsystem:console /entry:main %t.obj
+# RUN: llvm-readobj -sections %t.dll | FileCheck %s
+
+CHECK: Format: COFF-ARM
+
OpenPOWER on IntegriCloud