7e080fa289
This is a reland of commit 11a338000b
Adds "aarch64" as a `uname -m` possibility for ARM64.
TEST=manual testing
Original change's description:
> [pkg/vm] Handle cross compilation in the precompiler2 script.
>
> When cross compiling, gen_snapshot for the host architecture is in
> ${BUILD_DIR}/clang_<arch>/gen_snapshot.
>
> TEST=manual testing with native X64 and cross-compiling ARM64 on X64.
>
> Change-Id: I9f6af045675612651c659683081aca3e65acad1b
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/404421
> Reviewed-by: Slava Egorov <vegorov@google.com>
Change-Id: I4fb4812dfa96ba582ca3bedbfd68d58ce2a4ab5b
Cq-Include-Trybots: luci.dart.try:benchmark-linux-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/405780
Reviewed-by: Slava Egorov <vegorov@google.com>
185 lines
5.1 KiB
Bash
Executable File
185 lines
5.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
|
# for details. All rights reserved. Use of this source code is governed by a
|
|
# BSD-style license that can be found in the LICENSE file.
|
|
|
|
# Script for generating AOT snapshot using Dart 2 pipeline: Fasta with
|
|
# strong mode enabled, AOT specific Kernel-to-Kernel transformations and
|
|
# Dart VM precompiler with strong mode semantics and reified generics.
|
|
|
|
# Parse incoming arguments and extract the value of --packages option if any
|
|
# was passed. Split options (--xyz) and non-options into two separate arrays.
|
|
# All options will be passed to gen_snapshot, while --packages will be
|
|
# passed to Fasta.
|
|
|
|
set -e
|
|
|
|
function follow_links() {
|
|
local file="$1"
|
|
while [ -h "$file" ]; do
|
|
# On Mac OS, readlink -f doesn't work.
|
|
file="$(readlink "$file")"
|
|
done
|
|
echo "$file"
|
|
}
|
|
|
|
# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
|
|
PROG_NAME="$(follow_links "$BASH_SOURCE")"
|
|
|
|
# Handle the case where dart-sdk/bin has been symlinked to.
|
|
CUR_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
|
|
|
|
SDK_DIR="$CUR_DIR/../../.."
|
|
|
|
. "$CUR_DIR/shared_functions.sh"
|
|
|
|
OPTIONS=()
|
|
GEN_KERNEL_OPTIONS=()
|
|
PACKAGES=
|
|
BUILD_ASM=0
|
|
|
|
ARGV=()
|
|
for arg in "$@"; do
|
|
case $arg in
|
|
--packages=sdk)
|
|
PACKAGES="$SDK_DIR/.dart_tool/package_config.json"
|
|
;;
|
|
--packages=*)
|
|
PACKAGES="$arg"
|
|
;;
|
|
--enable-asserts | \
|
|
--sound-null-safety | \
|
|
--no-sound-null-safety | \
|
|
--enable-experiment=*)
|
|
GEN_KERNEL_OPTIONS+=("$arg")
|
|
OPTIONS+=("$arg")
|
|
;;
|
|
--tfa | \
|
|
--no-tfa | \
|
|
--protobuf-tree-shaker-v2 | \
|
|
--minimal-kernel | \
|
|
--no-embed-sources | \
|
|
--dynamic-interface=* | \
|
|
-D* )
|
|
GEN_KERNEL_OPTIONS+=("$arg")
|
|
;;
|
|
--build-assembly)
|
|
BUILD_ASM=1
|
|
;;
|
|
-v*)
|
|
set -x
|
|
;;
|
|
--*)
|
|
OPTIONS+=("$arg")
|
|
;;
|
|
*)
|
|
ARGV+=("$arg")
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ "${#ARGV[@]}" -ne 2 ]; then
|
|
echo "Usage: $0 [options] <source> <snapshot>"
|
|
exit 1
|
|
fi
|
|
|
|
SOURCE_FILE="${ARGV[0]}"
|
|
SNAPSHOT_FILE="${ARGV[1]}"
|
|
|
|
if [ $BUILD_ASM -eq 1 ]; then
|
|
GEN_SNAPSHOT_OPTION="--snapshot-kind=app-aot-assembly"
|
|
GEN_SNAPSHOT_FILENAME="--assembly=${SNAPSHOT_FILE}.S"
|
|
else
|
|
GEN_SNAPSHOT_OPTION="--snapshot-kind=app-aot-elf"
|
|
GEN_SNAPSHOT_FILENAME="--elf=${SNAPSHOT_FILE}"
|
|
fi
|
|
|
|
if [[ `uname` == 'Darwin' ]]; then
|
|
OUT_DIR="$SDK_DIR/xcodebuild"
|
|
else
|
|
OUT_DIR="$SDK_DIR/out"
|
|
fi
|
|
|
|
HOST_ARCH="$(host_arch)"
|
|
|
|
export DART_CONFIGURATION=${DART_CONFIGURATION:-Release$HOST_ARCH}
|
|
TARGET_ARCH="$(parse_target_arch "$DART_CONFIGURATION")"
|
|
BUILD_DIR="$OUT_DIR/$DART_CONFIGURATION"
|
|
if [ ! -d "$BUILD_DIR" ]; then
|
|
echo "$BUILD_DIR is not a directory" >&2
|
|
exit 1
|
|
fi
|
|
|
|
function find_dart {
|
|
local tools_dart="${SDK_DIR}/tools/sdks/dart-sdk/bin/dart"
|
|
if [ -f "$tools_dart" ]; then
|
|
echo "$tools_dart"
|
|
else
|
|
local host_dart=""
|
|
if is_cross_compiled "$HOST_ARCH" "$TARGET_ARCH"; then
|
|
host_dart="$OUT_DIR/Release$HOST_ARCH/dart"
|
|
else
|
|
host_dart="$BUILD_DIR/dart"
|
|
fi
|
|
if [ ! -f "$host_dart" ]; then
|
|
echo "Cannot find dart at either $tools_dart or $host_dart" >&2
|
|
exit 1
|
|
fi
|
|
echo "$host_dart"
|
|
fi
|
|
}
|
|
|
|
DART="$(find_dart)"
|
|
|
|
function gen_kernel() {
|
|
if [[ "$DART_GN_ARGS" == *"precompile_tools=true"* ]]; then
|
|
# Precompile gen_kernel to an AOT app.
|
|
ninja -C "$BUILD_DIR" gen_kernel.exe
|
|
"$BUILD_DIR/gen_kernel.exe" $@
|
|
else
|
|
$DART ${DART_VM_FLAGS} "${SDK_DIR}/pkg/vm/bin/gen_kernel.dart" $@
|
|
fi
|
|
}
|
|
|
|
# Step 1: Generate Kernel binary from the input Dart source.
|
|
gen_kernel --platform "${BUILD_DIR}/vm_platform_strong.dill" \
|
|
--aot \
|
|
"${GEN_KERNEL_OPTIONS[@]}" \
|
|
$PACKAGES \
|
|
-o "$SNAPSHOT_FILE.dill" \
|
|
"$SOURCE_FILE"
|
|
|
|
GEN_SNAPSHOT="gen_snapshot"
|
|
# If the target architecture differs from the host architecture, use
|
|
# gen_snapshot for the host architecture for cross compilation, which is
|
|
# denoted by an X between the build mode and the architecture name,
|
|
# e.g., ReleaseXARM64 on X64.
|
|
if [[ "$DART_CONFIGURATION" =~ (Debug|Release|Product)X[^6] ]] && \
|
|
is_cross_compiled "$HOST_ARCH" "$TARGET_ARCH"; then
|
|
case "$HOST_ARCH" in
|
|
"X64")
|
|
GEN_SNAPSHOT="clang_x64/${GEN_SNAPSHOT}"
|
|
;;
|
|
"ARM64")
|
|
GEN_SNAPSHOT="clang_arm64/${GEN_SNAPSHOT}"
|
|
;;
|
|
*)
|
|
echo "Unexpected host architecture $HOST_ARCH for cross compilation" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
# Step 2: Generate snapshot from the Kernel binary.
|
|
${BUILD_DIR}/${GEN_SNAPSHOT} \
|
|
${GEN_SNAPSHOT_FLAGS} \
|
|
"$GEN_SNAPSHOT_OPTION" \
|
|
"$GEN_SNAPSHOT_FILENAME" \
|
|
"${OPTIONS[@]}" \
|
|
"$SNAPSHOT_FILE.dill"
|
|
|
|
# Step 3: Assemble the assembly file into an ELF object.
|
|
if [ $BUILD_ASM -eq 1 ]; then
|
|
gcc -shared -o "$SNAPSHOT_FILE" "${SNAPSHOT_FILE}.S"
|
|
fi
|