ReaderWriter: teach PE/COFF backend about ARM NT
authorSaleem Abdulrasool <compnerd@compnerd.org>
Wed, 31 Dec 2014 22:32:21 +0000 (22:32 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Wed, 31 Dec 2014 22:32:21 +0000 (22:32 +0000)
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

lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
lld/test/pecoff/Inputs/armnt-obj.s [new file with mode: 0644]
lld/test/pecoff/Inputs/armnt-obj.yaml [new file with mode: 0644]
lld/test/pecoff/armnt.test [new file with mode: 0644]

index e6b0a74..574badc 100644 (file)
@@ -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();
index 13f6a2e..06d1c03 100644 (file)
@@ -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 (file)
index 0000000..20eeab0
--- /dev/null
@@ -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 (file)
index 0000000..7c53c6f
--- /dev/null
@@ -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 (file)
index 0000000..1cf6cd8
--- /dev/null
@@ -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
+