Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 29 Nov 2014 20:24:18 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r275267 - projects/clang350-import/contrib/llvm/patches
Message-ID:  <201411292024.sATKOIQZ091576@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Sat Nov 29 20:24:18 2014
New Revision: 275267
URL: https://svnweb.freebsd.org/changeset/base/275267

Log:
  Add patch file for r275265.

Added:
  projects/clang350-import/contrib/llvm/patches/patch-18-llvm-r214802-armv6-cp10-cp11.diff

Added: projects/clang350-import/contrib/llvm/patches/patch-18-llvm-r214802-armv6-cp10-cp11.diff
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/clang350-import/contrib/llvm/patches/patch-18-llvm-r214802-armv6-cp10-cp11.diff	Sat Nov 29 20:24:18 2014	(r275267)
@@ -0,0 +1,64 @@
+Pull in r214802 from upstream llvm trunk (by Renato Golin):
+
+  Allow CP10/CP11 operations on ARMv5/v6
+
+  Those registers are VFP/NEON and vector instructions should be used instead,
+  but old cores rely on those co-processors to enable VFP unwinding. This change
+  was prompted by the libc++abi's unwinding routine and is also present in many
+  legacy low-level bare-metal code that we ought to compile/assemble.
+
+  Fixing bug PR20025 and allowing PR20529 to proceed with a fix in libc++abi.
+
+Pull in r214872 from upstream llvm trunk (by Renato Golin):
+
+  Add tests for cp10/cp11 on ARMv5/6
+
+  Tests for ARMv7/8 are already on diagnostics.s
+
+This enables assembling certain ARM instructions used in libgcc.
+
+Introduced here: http://svnweb.freebsd.org/changeset/base/275265
+
+Index: lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+===================================================================
+--- lib/Target/ARM/AsmParser/ARMAsmParser.cpp
++++ lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+@@ -3118,9 +3118,10 @@ static int MatchCoprocessorOperandName(StringRef N
+       return -1;
+     switch (Name[1]) {
+     default:  return -1;
+-    // p10 and p11 are invalid for coproc instructions (reserved for FP/NEON)
+-    case '0': return CoprocOp == 'p'? -1: 10;
+-    case '1': return CoprocOp == 'p'? -1: 11;
++    // CP10 and CP11 are VFP/NEON and so vector instructions should be used.
++    // However, old cores (v5/v6) did use them in that way.
++    case '0': return 10;
++    case '1': return 11;
+     case '2': return 12;
+     case '3': return 13;
+     case '4': return 14;
+@@ -3177,6 +3178,9 @@ ARMAsmParser::parseCoprocNumOperand(OperandVector
+   int Num = MatchCoprocessorOperandName(Tok.getString(), 'p');
+   if (Num == -1)
+     return MatchOperand_NoMatch;
++  // ARMv7 and v8 don't allow cp10/cp11 due to VFP/NEON specific instructions
++  if ((hasV7Ops() || hasV8Ops()) && (Num == 10 || Num == 11))
++    return MatchOperand_NoMatch;
+ 
+   Parser.Lex(); // Eat identifier token.
+   Operands.push_back(ARMOperand::CreateCoprocNum(Num, S));
+Index: test/MC/ARM/coproc-diag.s
+===================================================================
+--- test/MC/ARM/coproc-diag.s
++++ test/MC/ARM/coproc-diag.s
+@@ -0,0 +1,10 @@
++# Special test to make sure we don't error on VFP co-proc access
++@ RUN: llvm-mc -triple=armv5 < %s | FileCheck %s
++@ RUN: llvm-mc -triple=armv6 < %s | FileCheck %s
++
++        @ p10 and p11 are reserved for NEON, but accessible on v5/v6
++        ldc  p10, cr0, [r0], {0x20}
++        ldc2 p11, cr0, [r0], {0x21}
++        ldcl p11, cr0, [r0], {0x20}
++
++@ CHECK-NOT: error: invalid operand for instruction



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201411292024.sATKOIQZ091576>