From 65217adcff479aca7b4769e8258f7650a8876c7c Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Thu, 10 Sep 2015 21:44:37 +0000 Subject: llvm-libunwind: Add recipe Apple has contributed libunwind implementation to llvm which is needed for libcxx to work and is equivalent in APIs to HP's libunwind implementation from good old days Signed-off-by: Khem Raj --- ...se-x29-and-x30-for-fp-and-lr-respectively.patch | 65 ++++++++++++++++++++++ recipes-devtools/clang/llvm-libunwind_git.bb | 47 ++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 recipes-devtools/clang/llvm-libunwind/0001-aarch64-Use-x29-and-x30-for-fp-and-lr-respectively.patch create mode 100644 recipes-devtools/clang/llvm-libunwind_git.bb (limited to 'recipes-devtools/clang') diff --git a/recipes-devtools/clang/llvm-libunwind/0001-aarch64-Use-x29-and-x30-for-fp-and-lr-respectively.patch b/recipes-devtools/clang/llvm-libunwind/0001-aarch64-Use-x29-and-x30-for-fp-and-lr-respectively.patch new file mode 100644 index 0000000..0c65dba --- /dev/null +++ b/recipes-devtools/clang/llvm-libunwind/0001-aarch64-Use-x29-and-x30-for-fp-and-lr-respectively.patch @@ -0,0 +1,65 @@ +From 5def58395d2248dfcd3165b4f23ba04b7f355837 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Thu, 10 Sep 2015 21:27:28 +0000 +Subject: [PATCH] aarch64: Use x29 and x30 for fp and lr respectively + +This does not change the code generation with integrated asm +but using x30 and x29 helps compile the code with gnu as. Currently gas +fails to assemble this code with errors as below + +Error: operand X should be an integer register + +Signed-off-by: Khem Raj +--- +Upstream-Status: Submitted[http://reviews.llvm.org/D12777] + + src/UnwindRegistersRestore.S | 6 +++--- + src/UnwindRegistersSave.S | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/src/UnwindRegistersRestore.S b/src/UnwindRegistersRestore.S +index 7d21953..1244d82 100644 +--- a/src/UnwindRegistersRestore.S ++++ b/src/UnwindRegistersRestore.S +@@ -282,8 +282,8 @@ DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind15Registers_arm646jumptoEv) + ldp x22,x23, [x0, #0x0B0] + ldp x24,x25, [x0, #0x0C0] + ldp x26,x27, [x0, #0x0D0] +- ldp x28,fp, [x0, #0x0E0] +- ldr lr, [x0, #0x100] // restore pc into lr ++ ldp x28,x29, [x0, #0x0E0] ++ ldr x30, [x0, #0x100] // restore pc into lr + ldr x1, [x0, #0x0F8] + mov sp,x1 // restore sp + +@@ -306,7 +306,7 @@ DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind15Registers_arm646jumptoEv) + ldr d31, [x0, #0x208] + + ldp x0, x1, [x0, #0x000] // restore x0,x1 +- ret lr // jump to pc ++ ret x30 // jump to pc + + #elif defined(__arm__) && !defined(__APPLE__) + +diff --git a/src/UnwindRegistersSave.S b/src/UnwindRegistersSave.S +index d26908c..80776c8 100644 +--- a/src/UnwindRegistersSave.S ++++ b/src/UnwindRegistersSave.S +@@ -254,11 +254,11 @@ DEFINE_LIBUNWIND_FUNCTION(unw_getcontext) + stp x22,x23, [x0, #0x0B0] + stp x24,x25, [x0, #0x0C0] + stp x26,x27, [x0, #0x0D0] +- stp x28,fp, [x0, #0x0E0] +- str lr, [x0, #0x0F0] ++ stp x28,x29, [x0, #0x0E0] ++ str x30, [x0, #0x0F0] + mov x1,sp + str x1, [x0, #0x0F8] +- str lr, [x0, #0x100] // store return address as pc ++ str x30, [x0, #0x100] // store return address as pc + // skip cpsr + stp d0, d1, [x0, #0x110] + stp d2, d3, [x0, #0x120] +-- +2.5.1 + diff --git a/recipes-devtools/clang/llvm-libunwind_git.bb b/recipes-devtools/clang/llvm-libunwind_git.bb new file mode 100644 index 0000000..4e77dce --- /dev/null +++ b/recipes-devtools/clang/llvm-libunwind_git.bb @@ -0,0 +1,47 @@ +# Copyright (C) 2015 Khem Raj +# Released under the MIT license (see COPYING.MIT for the terms) + +DESCRIPTION = "libunwind implements a stack unwinder, needed to perform C++ exception handling." +HOMEPAGE = "http://llvm.org/" +LICENSE = "MIT & UIUC" +SECTION = "base" +INHIBIT_DEFAULT_DEPS = "1" + +DEPENDS += "clang-cross-${TARGET_ARCH}" + +require clang.inc + +inherit cmake + +DEPENDS += "libcxx" +LIC_FILES_CHKSUM = "file://../libcxx/LICENSE.TXT;md5=149d2e8e8d99e3a2d702997b5f919fd9; \ + " +SRCREV_libunwind = "1d9ef03c3ee017838437e0f3197f2912eebdce5a" +SRC_URI = "\ + git://github.com/llvm-mirror/llvm.git;branch=${BRANCH};name=llvm \ + git://github.com/llvm-mirror/libcxx.git;branch=${BRANCH};name=libcxx;destsuffix=git/projects/libcxx \ + git://github.com/llvm-mirror/libcxxabi.git;branch=${BRANCH};name=libcxxabi;destsuffix=git/projects/libcxxabi \ + git://github.com/llvm-mirror/libunwind.git;branch=master;name=libunwind;destsuffix=git/projects/libunwind \ + file://0001-aarch64-Use-x29-and-x30-for-fp-and-lr-respectively.patch \ + " + +SRCREV_FORMAT = "llvm_libcxx_libcxxabi_libunwind" + +S = "${WORKDIR}/git/projects/libunwind" + +THUMB_TUNE_CCARGS = "" +TUNE_CCARGS += "-ffreestanding -nostdlib" + +EXTRA_OECMAKE += "-DLIBCXXABI_LIBCXX_PATH=${S}/../libcxxabi \ + -DLLVM_PATH=${S}/../../ \ + -DLLVM_ENABLE_LIBCXX=True \ + -DLLVM_ENABLE_LIBCXXABI=True \ + -DLLVM_BUILD_EXTERNAL_COMPILER_RT=True \ + -DLIBCXXABI_ENABLE_SHARED=False \ + -DUNIX=True \ + -DLIBUNWIND_ENABLE_SHARED=False \ + " +do_configure_prepend () { + (cd ${S}/include && ln -sf ../../libcxxabi/include/__cxxabi_config.h) +} +BBCLASSEXTEND = "native nativesdk" -- cgit v1.2.3-54-g00ecf