[lld] r225082 - ReaderWriter: teach the writer about IMAGE_REL_ARM_BRANCH24T
Saleem Abdulrasool
compnerd at compnerd.org
Fri Jan 2 10:52:00 PST 2015
Author: compnerd
Date: Fri Jan 2 12:51:59 2015
New Revision: 225082
URL: http://llvm.org/viewvc/llvm-project?rev=225082&view=rev
Log:
ReaderWriter: teach the writer about IMAGE_REL_ARM_BRANCH24T
This adds support for IMAGE_REL_ARM_BRANCH24T relocations. Similar to the
IMAGE_REL_ARM_BLX32T relocation, this relocation requires munging an
instruction. The instruction encoding is quite similar, allowing us to reuse
the same munging implementation. This is needed by the entry point stubs for
modules provided by MSVCRT.
Added:
lld/trunk/test/pecoff/Inputs/armnt-branch24t.obj.yaml
lld/trunk/test/pecoff/Inputs/armnt-branch24t.s
lld/trunk/test/pecoff/armnt-branch24t.test
Modified:
lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=225082&r1=225081&r2=225082&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Fri Jan 2 12:51:59 2015
@@ -561,10 +561,12 @@ static void applyThumbMoveImmediate(ulit
static void applyThumbBranchImmediate(ulittle16_t *bl, int32_t imm) {
// BL(T1): |11110|S|imm10|11|J1|1|J2|imm11|
// imm32 = sext S:I1:I2:imm10:imm11:'0'
+ // B.W(T4): |11110|S|imm10|10|J1|1|J2|imm11|
+ // imm32 = sext S:I1:I2:imm10:imm11:'0'
//
// I1 = ~(J1 ^ S), I2 = ~(J2 ^ S)
- assert((~abs(imm) & (-1 << 24)) && "bl out of range");
+ assert((~abs(imm) & (-1 << 24)) && "bl/b.w out of range");
uint32_t S = (imm < 0 ? 1 : 0);
uint32_t J1 = ((~imm & 0x00800000) >> 23) ^ S;
@@ -602,6 +604,10 @@ void AtomChunk::applyRelocationsARM(uint
applyThumbMoveImmediate(&RelocSite16[0], (TargetAddr + ImageBase) >> 0);
applyThumbMoveImmediate(&RelocSite16[2], (TargetAddr + ImageBase) >> 16);
break;
+ case llvm::COFF::IMAGE_REL_ARM_BRANCH24T:
+ applyThumbBranchImmediate(RelocSite16,
+ TargetAddr - AtomRVA[Atom] - AtomOffset - 4);
+ break;
case llvm::COFF::IMAGE_REL_ARM_BLX23T:
applyThumbBranchImmediate(RelocSite16,
TargetAddr - AtomRVA[Atom] - AtomOffset - 4);
Added: lld/trunk/test/pecoff/Inputs/armnt-branch24t.obj.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/armnt-branch24t.obj.yaml?rev=225082&view=auto
==============================================================================
--- lld/trunk/test/pecoff/Inputs/armnt-branch24t.obj.yaml (added)
+++ lld/trunk/test/pecoff/Inputs/armnt-branch24t.obj.yaml Fri Jan 2 12:51:59 2015
@@ -0,0 +1,39 @@
+---
+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: 704700BF202000F000B8
+ Relocations:
+ - VirtualAddress: 6
+ SymbolName: identity
+ Type: 20
+symbols:
+ - Name: .text
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ SectionDefinition:
+ Length: 10
+ NumberOfRelocations: 1
+ NumberOfLinenumbers: 0
+ CheckSum: 0
+ Number: 1
+ - Name: identity
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_FUNCTION
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+ - Name: function
+ Value: 4
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_FUNCTION
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+...
Added: lld/trunk/test/pecoff/Inputs/armnt-branch24t.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/armnt-branch24t.s?rev=225082&view=auto
==============================================================================
--- lld/trunk/test/pecoff/Inputs/armnt-branch24t.s (added)
+++ lld/trunk/test/pecoff/Inputs/armnt-branch24t.s Fri Jan 2 12:51:59 2015
@@ -0,0 +1,27 @@
+
+@ int ___declspec(noinline) identity(int i) { return i; }
+@ int function(void) { return identity(32); }
+
+ .syntax unified
+ .thumb
+ .text
+
+ .def identity
+ .scl 2
+ .type 32
+ .endef
+ .global identity
+ .align 2
+ .code16
+ .thumb_func
+identity:
+ bx lr
+
+ .def function
+ .scl 2
+ .type 32
+ .endef
+function:
+ movs r0, #32
+ b identity
+
Added: lld/trunk/test/pecoff/armnt-branch24t.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/armnt-branch24t.test?rev=225082&view=auto
==============================================================================
--- lld/trunk/test/pecoff/armnt-branch24t.test (added)
+++ lld/trunk/test/pecoff/armnt-branch24t.test Fri Jan 2 12:51:59 2015
@@ -0,0 +1,18 @@
+# RUN: yaml2obj -format coff -o %t.obj %p/Inputs/armnt-branch24t.obj.yaml
+# RUN: llvm-objdump -d %t.obj | FileCheck %s -check-prefix BEFORE
+# RUN: lld -flavor link /entry:function /subsystem:console /out:%t.exe %t.obj
+# RUN: llvm-objdump -d %t.exe | FileCheck %s -check-prefix AFTER
+
+BEFORE: Disassembly of section .text:
+BEFORE: 0: 70 47 bx lr
+BEFORE: 2: 00 bf nop
+BEFORE: 4: 20 20 movs r0, #32
+BEFORE: 6: 00 f0 00 b8 b.w #0
+
+AFTER: Disassembly of section .text:
+AFTER: .text:
+AFTER: 1000: 70 47 bx lr
+AFTER: 1002: 00 bf nop
+AFTER: 1004: 20 20 movs r0, #32
+AFTER: 1006: ff f7 fb bf b.w #-10
+
More information about the llvm-commits
mailing list