From nobody Tue Jan 28 01:00:10 2025 X-Original-To: dev-commits-ports-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Yhn570Yk5z5lcP4; Tue, 28 Jan 2025 01:00:11 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Yhn5671bHz3qRG; Tue, 28 Jan 2025 01:00:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738026011; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=HgfyFRc9Pngsva2Kb0Vu5TGlrxYFlxC8xP2lsJOFA0M=; b=Al9vMAcorWVc0gKYk33f4Ns9BeNlr4ovtFqwziOx3IwYxPIY/TbITRRkwc6b1yuKdIoFjp Q4AbYqKIXwbJSMXEBoJ32AX/gDoQMV67exD8U3hpo6d/cwtZ0AeSWDhToCUrhMJ7EAt/1B IC5TSyqsSc5n44Fz92HNciUTms0xQAc2c+sz5h2JNkaR6Jp9gFxGy/h6LA1MjAud8D1Cgx 53mx3lnrEWNqxnyrzgnGHjeB3us2Hth/38pNMtu8U3s5O3LJcHgEactxm3Tfiptf99TWhq Pj9rAaABy29TC6UTIG/fW2tjVB76j0e0IzUQsj8KZsUXLSp8qDasqncP0zKJsg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1738026011; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=HgfyFRc9Pngsva2Kb0Vu5TGlrxYFlxC8xP2lsJOFA0M=; b=GxWWu2yVeAKOVA7OmKcTIKTzUAQ0X3bFBlhDMbciXkb2mVYg4eAPXJeWFFWmeLTB0hSAiL 68JAurQ50cLFY4jDle9wYdCRuwNBkFZEAyDQj1AV6ZEVemVsu9GXnKV4C8OSg73lBS51M2 H8749uqYw3RWmsAGpb6vtRcLD2J0CdG0usPGFfV6mdMK1GomN4IUDrUsGhsQaCYAJ1c5K3 RsmOhvLBQHirisINWWMS+BI2j3FSv8T8CEdPVbHi0kWnXo0zwgYXPSkpz62Vk9rZ55FsTO 53ZB08zxZi9JfbwLQyNqiaBC4JTXlkuZtDRZV49aQjuMONL6UPZ/QfU+h8JLQQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1738026011; a=rsa-sha256; cv=none; b=km+s1U0KAzDQejevzOkydIMTMB0fYE6TXLFcA4DU7gvGN+Nrj7Wp2HrrchOFIyNmXbweIn fJWMApLEc8LHuWPTv7yo1q+U9j7n0P978e76KFMu5mxNEbOjt0jRE1G0rU+4vrHXSzAHR7 jjVjSPXQgyvMjnkhjT/Unv9Wury3E3NAJZO3mNGJAMs7X8mhA5kkjl0VxA2hed2F6J0LIl 4lO9PPSHGrzB1fskvdkI8ZHL4jirCQaR2EEQMtsVXV6uEQ1c1YBgUhKpg46Y0GX6Kk5316 LgCMQg8oTtkXILLzS5SucIKB7KkxURfV7JBzQHzSVDnBN/KoOvZgFH2pmoDz6A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Yhn566QZHzsWZ; Tue, 28 Jan 2025 01:00:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 50S10Au1049978; Tue, 28 Jan 2025 01:00:10 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 50S10A8f049965; Tue, 28 Jan 2025 01:00:10 GMT (envelope-from git) Date: Tue, 28 Jan 2025 01:00:10 GMT Message-Id: <202501280100.50S10A8f049965@gitrepo.freebsd.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org From: Brooks Davis Subject: git: 68d58a0fbe72 - main - devel/llvm-{cheri,morello}: better target native ABI List-Id: Commits to the main branch of the FreeBSD ports repository List-Archive: https://lists.freebsd.org/archives/dev-commits-ports-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-ports-main@freebsd.org Sender: owner-dev-commits-ports-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: brooks X-Git-Repository: ports X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 68d58a0fbe72522de65e082488c5d29bf7d9deea Auto-Submitted: auto-generated The branch main has been updated by brooks: URL: https://cgit.FreeBSD.org/ports/commit/?id=68d58a0fbe72522de65e082488c5d29bf7d9deea commit 68d58a0fbe72522de65e082488c5d29bf7d9deea Author: Brooks Davis AuthorDate: 2025-01-27 20:56:36 +0000 Commit: Brooks Davis CommitDate: 2025-01-28 01:00:01 +0000 devel/llvm-{cheri,morello}: better target native ABI Make the wrapper script for llvm-cheri and llvm-morello add the necessicary ABI flags for the targeted CheriBSD version when targeting a CHERI platform with a CheriBSD sysroot. Normally Clang targets the native ABI when no arguments are given, but on CheriBSD we currently run a hybrd CHERI LLVM on CHERI systems and want to target purecap CHERI by default. We also need to support toolchain versions with different defaults and our ABI is evolving rapidly as we explore fine-grained compartmentalization. We have used a prior version of this wrapper to build >10K packages for Morello. While here, fix install when ${LOCALBASE}/llvm-* is not on the same filesystem as ${LOCALBASE}. --- devel/llvm-cheri/Makefile | 24 ++- devel/llvm-cheri/files/wrapper-cheri.sh.in | 202 +++++++++++++++++++++ .../{llvm-wrapper.sh.in => wrapper-cheriot.sh.in} | 0 3 files changed, 218 insertions(+), 8 deletions(-) diff --git a/devel/llvm-cheri/Makefile b/devel/llvm-cheri/Makefile index 1949d035097c..d34af337a860 100644 --- a/devel/llvm-cheri/Makefile +++ b/devel/llvm-cheri/Makefile @@ -1,6 +1,6 @@ PORTNAME= llvm PORTVERSION= ${LLVM_MAJOR}.0.d${SNAPDATE} -PORTREVISION= 1 +PORTREVISION= 2 CATEGORIES= devel lang PKGNAMESUFFIX= ${LLVM_SUFFIX} @@ -45,8 +45,16 @@ SHEBANG_FILES= \ llvm/utils/lit/lit.py \ llvm/utils/llvm-lit/llvm-lit.in -SUB_FILES+= llvm-wrapper.sh -SUB_LIST+= LLVM_PREFIX="${LLVM_PREFIX}" LLVM_SUFFIX="${LLVM_SUFFIX}" +.if ${LLVM_SUFFIX} == "-cheriot" +WRAPPER= wrapper-cheriot.sh +.else +WRAPPER= wrapper-cheri.sh +.endif +SUB_FILES+= ${WRAPPER} +SUB_LIST+= \ + CONFIGURE_TARGET="${CONFIGURE_TARGET}" \ + LLVM_PREFIX="${LLVM_PREFIX}" \ + LLVM_SUFFIX="${LLVM_SUFFIX}" CMAKE_INSTALL_PREFIX= ${LLVM_PREFIX} CMAKE_SOURCE_PATH= ${WRKSRC}/llvm @@ -205,7 +213,7 @@ post-patch-LLD-on: ${PATCH_WRKSRC}/lld/docs/conf.py post-install: - ${INSTALL_SCRIPT} ${WRKDIR}/llvm-wrapper.sh \ + ${INSTALL_SCRIPT} ${WRKDIR}/${WRAPPER} \ ${STAGEDIR}${PREFIX}/bin/${COMMAND_PREFIX}${FIRST_COMMAND}${COMMAND_SUFFIX} .for command in ${COMMANDS:C/^/XXXX/1:NXXXX*} ${LN} -f ${STAGEDIR}${PREFIX}/bin/${COMMAND_PREFIX}${FIRST_COMMAND}${COMMAND_SUFFIX} \ @@ -251,18 +259,18 @@ post-install-EXTRAS-on: post-install-LIT-on: ${INSTALL_SCRIPT} ${PATCH_WRKSRC}/llvm/utils/lit/lit.py \ ${STAGEDIR}${LLVM_PREFIX}/bin/lit - ${LN} -f ${STAGEDIR}${LLVM_PREFIX}/bin/lit \ + ${LN} -sf ${STAGEDIR}${LLVM_PREFIX}/bin/lit \ ${STAGEDIR}${LLVM_PREFIX}/bin/llvm-lit - ${LN} -f ${STAGEDIR}${LLVM_PREFIX}/bin/lit \ + ${LN} -sf ${STAGEDIR}${LLVM_PREFIX}/bin/lit \ ${STAGEDIR}${PREFIX}/bin/${COMMAND_PREFIX}lit${LLVM_SUFFIX} - ${LN} -f ${STAGEDIR}${LLVM_PREFIX}/bin/lit \ + ${LN} -sf ${STAGEDIR}${LLVM_PREFIX}/bin/lit \ ${STAGEDIR}${PREFIX}/bin/${COMMAND_PREFIX}llvm-lit${LLVM_SUFFIX} ${MKDIR} ${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}/${LIT_MOD_NAME} ${INSTALL_DATA} ${WRKSRC}/llvm/utils/lit/lit/*.py \ ${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}/${LIT_MOD_NAME} ${INSTALL_PROGRAM} ${WRKDIR}/.build/bin/FileCheck \ ${STAGEDIR}${LLVM_PREFIX}/bin/ - ${LN} -f ${STAGEDIR}${LLVM_PREFIX}/bin/FileCheck \ + ${LN} -sf ${STAGEDIR}${LLVM_PREFIX}/bin/FileCheck \ ${STAGEDIR}${PREFIX}/bin/${COMMAND_PREFIX}FileCheck${COMMAND_SUFFIX} post-install-LLD-on: diff --git a/devel/llvm-cheri/files/wrapper-cheri.sh.in b/devel/llvm-cheri/files/wrapper-cheri.sh.in new file mode 100644 index 000000000000..2e6b66b81be4 --- /dev/null +++ b/devel/llvm-cheri/files/wrapper-cheri.sh.in @@ -0,0 +1,202 @@ +#!/bin/sh +#- +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2022 SRI International +# +# This software was developed by SRI International and the University of +# Cambridge Computer Laboratory (Department of Computer Science and +# Technology) under Defense Advanced Research Projects Agency (DARPA) +# Contract No. HR001122C0110 ("ETC"). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +LOCALBASE="%%LOCALBASE%%" +LLVM_PREFIX="%%LLVM_PREFIX%%" +LLVM_SUFFIX="%%LLVM_SUFFIX%%" +_TARGET=${_TARGET:-%%CONFIGURE_TARGET%%} +_SYSROOT=${_SYSROOT:-""} + +VERBOSE=${VERBOSE:-0} + +err() +{ + ret=$1 + shift + echo >&2 "$@" + exit "$ret" +} + +debug() +{ + if [ "$VERBOSE" -ne 0 ]; then + echo >&2 "$@" + fi +} + +run() +{ + debug "Running:" "$@" + "$@" +} + +run_tool() +{ + local tool=$1 + shift + run env LD_LIBRARY_PATH="${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}${LLVM_PREFIX}/lib" \ + "${LLVM_PREFIX}/bin/$tool" "$@" +} + +set_sysroot() +{ + local sysroot="$1" + # Clang doesn't seem to care if the sysroot exists, but we'll + # blow up trying to get __CheriBSD_version if it doesn't so require + # it to exist. + if [ ! -d "$sysroot" ]; then + err 1 "nonexistant sysroot: '$sysroot'" + fi + _SYSROOT="$sysroot" +} + +set_target() +{ + local target="$1" + case "$target" in + *-*-*) + _TARGET="$target" + ;; + *) + echo "malformed target triple: '$target'" + ;; + esac +} + +tool=$0 +[ -L "$tool" ] && tool=$(/bin/realpath $tool) +tool=${tool##*/} +basetool=${tool%${LLVM_SUFFIX}} + +next_arg_is_target=0 +next_arg_is_sysroot=0 +for arg in "$@"; do + if [ $next_arg_is_target -ne 0 ]; then + set_target "$arg" + next_arg_is_target=0 + continue + fi + if [ $next_arg_is_sysroot -ne 0 ]; then + set_sysroot "$arg" + next_arg_is_sysroot=0 + continue + fi + case "$arg" in + --sysroot) + next_arg_is_sysroot=1 + ;; + --sysroot=*) + set_sysroot "${arg#--sysroot=}" + ;; + -target) + next_arg_is_target=1 + ;; + --target=*) + set_target "${arg#--target=}" + ;; + esac +done +if [ $next_arg_is_target -ne 0 ]; then + err 1 "-target without target argument" +fi + +if [ -z "$CHERIBSD_VERSION" -a -e "${_SYSROOT}/usr/include/sys/param.h" ]; then + CHERIBSD_VERSION=$(awk '/^#define[[:space:]]+__CheriBSD_version/{print $3}' ${_SYSROOT}/usr/include/sys/param.h) +fi +if [ -z "$CHERIBSD_VERSION" ]; then + CHERIBSD_VERSION=0 +fi + +arch_cflags= +arch_objdump_flags= + +# If we're targeting CheriBSD, assume we want to produce CHERI binaries +# (either hybrid or purecap) and choose which one based on the default +# libc in the sysroot. This isn't quite right, but isn't much worse +# than a misguided -mcpu flag. +if [ $CHERIBSD_VERSION -gt 0 ]; then + case "$_TARGET" in + aarch64-*-freebsd*) + if run_tool llvm-readelf -h ${_SYSROOT}/lib/libc.so.7 | grep -q "Flags:.*purecap"; then + tls_flags= + vararg_flags= + if [ "$CHERIBSD_VERSION" -le 20220314 ]; then + tls_flags="-femulated-tls" + elif [ "$CHERIBSD_VERSION" -le 20220828 ]; then + vararg_flags="-Xclang -morello-vararg=new" + elif [ "$CHERIBSD_VERSION" -le 20230804 ]; then + vararg_flags="-Xclang -morello-vararg=new -Xclang -morello-bounded-memargs=caller-only" + else + vararg_flags="-Xclang -morello-vararg=new -Xclang -morello-bounded-memargs" + fi + + arch_cflags="-march=morello -mabi=purecap $tls_flags $vararg_flags" + arch_objdump_flags="--mattr=+morello" + else + vararg_flags= + if [ "$CHERIBSD_VERSION" -gt 20220314 ]; then + vararg_flags="-Xclang -morello-vararg=new" + fi + arch_cflags="-march=morello $vararg_flags" + arch_objdump_flags="--mattr=+morello" + fi + ;; + riscv64-*-freebsd*) + if run_tool llvm-readelf -h ${_SYSROOT}/lib/libc.so.7 | grep -q "Flags:.*cheriabi"; then + mabi=l64pc128d + else + mabi=lp64d + fi + arch_cflags="-march=rv64gcxcheri -mabi=$mabi -mno-relax" + ;; + esac +fi + +case $basetool in +clang|clang++|clang-cpp) + toolflags=$arch_cflags + ;; +ld.lld|ld64.lld) + # no flags should be required as ld can see what it's doing from + # the binaries + toolflags= + ;; +objdump) + toolflags=$arch_objdump_flags + ;; +*) + debug no special args for $tool + ;; +esac + +run_tool "${basetool}" $toolflags "$@" diff --git a/devel/llvm-cheri/files/llvm-wrapper.sh.in b/devel/llvm-cheri/files/wrapper-cheriot.sh.in similarity index 100% rename from devel/llvm-cheri/files/llvm-wrapper.sh.in rename to devel/llvm-cheri/files/wrapper-cheriot.sh.in