[llvm] r281324 - [ARM] Add ".code 32" to functions in the ARM instruction set

Pablo Barrio via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 13 05:18:16 PDT 2016


Author: pabbar01
Date: Tue Sep 13 07:18:15 2016
New Revision: 281324

URL: http://llvm.org/viewvc/llvm-project?rev=281324&view=rev
Log:
[ARM] Add ".code 32" to functions in the ARM instruction set

Before, only Thumb functions were marked as ".code 16". These
".code x" directives are effective until the next directive of its
kind is encountered. Therefore, in code with interleaved ARM and
Thumb functions, it was possible to declare a function as ARM and
end up with a Thumb function after assembly. A test has been added.

An existing test has also been fixed to take this change into
account.

Reviewers: aschwaighofer, t.p.northover, jmolloy, rengolin

Subscribers: aemerson, rengolin, llvm-commits

Differential Revision: https://reviews.llvm.org/D24337

Added:
    llvm/trunk/test/CodeGen/ARM/interwork.ll
Modified:
    llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
    llvm/trunk/test/DebugInfo/ARM/header.ll

Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=281324&r1=281323&r2=281324&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Tue Sep 13 07:18:15 2016
@@ -74,8 +74,9 @@ void ARMAsmPrinter::EmitFunctionEntryLab
   if (AFI->isThumbFunction()) {
     OutStreamer->EmitAssemblerFlag(MCAF_Code16);
     OutStreamer->EmitThumbFunc(CurrentFnSym);
+  } else {
+    OutStreamer->EmitAssemblerFlag(MCAF_Code32);
   }
-
   OutStreamer->EmitLabel(CurrentFnSym);
 }
 

Added: llvm/trunk/test/CodeGen/ARM/interwork.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/interwork.ll?rev=281324&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/interwork.ll (added)
+++ llvm/trunk/test/CodeGen/ARM/interwork.ll Tue Sep 13 07:18:15 2016
@@ -0,0 +1,23 @@
+; One file may have multiple functions targeted at different (ARM, Thumb)
+; instruction sets. Passing this information to the linker and the assembler
+; is done through the ".code 16" and ".code 32" directives.
+;
+; RUN: llc -mtriple=arm-arm-none-eabi %s -o - | FileCheck %s
+
+define void @ft() #0 {
+; CHECK: .code 16
+; CHECK: .thumb_func
+; CHECK-LABEL: ft:
+entry:
+  ret void
+}
+
+define void @fz() #1 {
+; CHECK: .code 32
+; CHECK-LABEL: fz:
+entry:
+  ret void
+}
+
+attributes #0 = { "target-features"="+thumb-mode" }
+attributes #1 = { "target-features"="-thumb-mode" }

Modified: llvm/trunk/test/DebugInfo/ARM/header.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/ARM/header.ll?rev=281324&r1=281323&r2=281324&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/ARM/header.ll (original)
+++ llvm/trunk/test/DebugInfo/ARM/header.ll Tue Sep 13 07:18:15 2016
@@ -8,7 +8,8 @@
 ; CHECK-NEXT: .syntax unified
 ; CHECK-NEXT: .globl  _f
 ; CHECK-NEXT: .p2align  2
-; CHECK-NEXT: _f:                    @ @f
+; CHECK-NEXT: .code 32                    @ @f
+; CHECK-NEXT: _f:
 
 ; CHECK:  .section        __DWARF,__debug_str,regular,debug
 
@@ -21,7 +22,7 @@ define void @f() !dbg !4 {
 !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "foo", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
 !1 = !DIFile(filename: "/foo/test.c", directory: "/foo")
 !2 = !{}
-!4 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !2)
+!4 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 2, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !2)
 !5 = !DISubroutineType(types: !6)
 !6 = !{null}
 !7 = !{i32 2, !"Dwarf Version", i32 4}




More information about the llvm-commits mailing list