MC: support FK_SecRel_4 for Windows on ARM
authorSaleem Abdulrasool <compnerd@compnerd.org>
Sun, 4 May 2014 23:13:15 +0000 (23:13 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Sun, 4 May 2014 23:13:15 +0000 (23:13 +0000)
Add handling for FK_SecRel_4 (4-byte section relative relocations).  These are
used by the generation of DWARF debug information (the abbrevations use section
relative relocations).  This will also be used in generation of CodeView line
tables.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207941 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp
test/MC/ARM/coff-debugging-secrel.ll [new file with mode: 0644]

index aade4328db37fa25bc6501020f81d3000a48c02c..ad73e84bf532c2ab276b9f3cc3b11d63e31f4a82 100644 (file)
@@ -316,6 +316,8 @@ static unsigned adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
   case FK_Data_2:
   case FK_Data_4:
     return Value;
+  case FK_SecRel_4:
+    return Value;
   case ARM::fixup_arm_movt_hi16:
     if (!IsPCRel)
       Value >>= 16;
@@ -662,6 +664,9 @@ static unsigned getFixupKindNumBytes(unsigned Kind) {
   case ARM::fixup_t2_movt_hi16:
   case ARM::fixup_t2_movw_lo16:
     return 4;
+
+  case FK_SecRel_4:
+    return 4;
   }
 }
 
index 2372693636acf7d5e0e7f594961fac1c12425b2f..e3e6802fd3cee648d2c9be169a61377ff694bc7c 100644 (file)
@@ -49,6 +49,8 @@ unsigned ARMWinCOFFObjectWriter::getRelocType(const MCValue &Target,
     default:
       return COFF::IMAGE_REL_ARM_ADDR32;
     }
+  case FK_SecRel_4:
+    return COFF::IMAGE_REL_ARM_SECREL;
   case ARM::fixup_t2_condbranch:
     return COFF::IMAGE_REL_ARM_BRANCH20T;
   case ARM::fixup_t2_uncondbranch:
diff --git a/test/MC/ARM/coff-debugging-secrel.ll b/test/MC/ARM/coff-debugging-secrel.ll
new file mode 100644 (file)
index 0000000..928f4b1
--- /dev/null
@@ -0,0 +1,41 @@
+; RUN: llc -mtriple thumbv7--windows-itanium -filetype obj -o - %s \
+; RUN:     | llvm-readobj -r - | FileCheck %s
+
+; ModuleID = '/Users/compnerd/work/llvm/test/MC/ARM/reduced.c'
+target datalayout = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-v128:64:128-a:0:32-n32-S64"
+target triple = "thumbv7--windows-itanium"
+
+define arm_aapcs_vfpcc void @function() {
+entry:
+  ret void, !dbg !0
+}
+
+!llvm.dbg.cu = !{!7}
+!llvm.module.flags = !{!9, !10}
+
+!0 = metadata !{i32 1, i32 0, metadata !1, null}
+!1 = metadata !{i32 786478, metadata !2, metadata !3, metadata !"function", metadata !"function", metadata !"", i32 1, metadata !4, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, void ()* @function, null, null, metadata !6, i32 1} ; [ DW_TAG_subprogram ], [line 1], [def], [function]
+!2 = metadata !{metadata !"/Users/compnerd/work/llvm/test/MC/ARM/reduced.c", metadata !"/Users/compnerd/work/llvm"}
+!3 = metadata !{i32 786473, metadata !2} ; [ DW_TAG_file_type] [/Users/compnerd/work/llvm/test/MC/ARM/reduced.c]
+!4 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ], [line 0, size 0, align 0, offset 0] [from ]
+!5 = metadata !{null}
+!6 = metadata !{}
+!7 = metadata !{i32 786449, metadata !2, i32 12, metadata !"clang version 3.5.0", i1 false, metadata !"", i32 0, metadata !6, metadata !6, metadata !8, metadata !6, metadata !6, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/Users/compnerd/work/llvm/test/MC/ARM/reduced.c] [DW_LANG_C99]
+!8 = metadata !{metadata !1}
+!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
+!10 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
+
+; CHECK: Relocations [
+; CHECK:   Section {{.*}} .debug_info {
+; CHECK:     0x6 IMAGE_REL_ARM_SECREL .debug_abbrev
+; CHECK:     0xC IMAGE_REL_ARM_SECREL .debug_str
+; CHECK:     0x12 IMAGE_REL_ARM_SECREL .debug_str
+; CHECK:     0x16 IMAGE_REL_ARM_SECREL .debug_line
+; CHECK:     0x1A IMAGE_REL_ARM_SECREL .debug_str
+; CHECK:     0x27 IMAGE_REL_ARM_SECREL .debug_str
+; CHECK:   }
+; CHECK:   Section {{.*}}.debug_pubnames {
+; CHECK:     0x6 IMAGE_REL_ARM_SECREL .debug_info
+; CHECK:   }
+; CHECK: ]
+