Index: clang/cmake/caches/Fuchsia-stage2.cmake =================================================================== --- clang/cmake/caches/Fuchsia-stage2.cmake +++ clang/cmake/caches/Fuchsia-stage2.cmake @@ -74,6 +74,9 @@ set(RUNTIMES_${target}_SANITIZER_CXX_ABI "libc++" CACHE STRING "") set(RUNTIMES_${target}_SANITIZER_CXX_ABI_INTREE ON CACHE BOOL "") set(RUNTIMES_${target}_COMPILER_RT_USE_BUILTINS_LIBRARY ON CACHE BOOL "") + + # Use .build-id link. + list(APPEND RUNTIME_BUILD_ID_LINK "${target}") endif() endforeach() @@ -126,6 +129,9 @@ set(RUNTIMES_${target}-fuchsia_LIBCXX_HERMETIC_STATIC_LIBRARY ON CACHE BOOL "") set(RUNTIMES_${target}-fuchsia_LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY OFF CACHE BOOL "") set(RUNTIMES_${target}-fuchsia_LIBCXX_ABI_VERSION 2 CACHE STRING "") + + # Use .build-id link. + list(APPEND RUNTIME_BUILD_ID_LINK "${target}-fuchsia") endforeach() set(LLVM_RUNTIME_SANITIZERS "Address" CACHE STRING "") @@ -134,6 +140,7 @@ set(LLVM_BUILTIN_TARGETS "${BUILTIN_TARGETS}" CACHE STRING "") set(LLVM_RUNTIME_TARGETS "${RUNTIME_TARGETS}" CACHE STRING "") +set(LLVM_RUNTIME_BUILD_ID_LINK_TARGETS "${RUNTIME_BUILD_ID_LINK}" CACHE STRING "") # Setup toolchain. set(LLVM_INSTALL_TOOLCHAIN_ONLY ON CACHE BOOL "") Index: llvm/cmake/modules/LLVMExternalProjectUtils.cmake =================================================================== --- llvm/cmake/modules/LLVMExternalProjectUtils.cmake +++ llvm/cmake/modules/LLVMExternalProjectUtils.cmake @@ -35,12 +35,14 @@ # Extra targets in the subproject to generate targets for # PASSTHROUGH_PREFIXES prefix... # Extra variable prefixes (name is always included) to pass down +# STRIP_TOOL path +# Use provided strip tool instead of the default one. # ) function(llvm_ExternalProject_Add name source_dir) cmake_parse_arguments(ARG "USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN" "SOURCE_DIR" - "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES" + "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL" ${ARGN}) canonicalize_tool_name(${name} nameCanon) if(NOT ARG_TOOLCHAIN_TOOLS) @@ -125,12 +127,16 @@ if(llvm-objcopy IN_LIST TOOLCHAIN_TOOLS) list(APPEND compiler_args -DCMAKE_OBJCOPY=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-objcopy) endif() - if(llvm-strip IN_LIST TOOLCHAIN_TOOLS) + if(llvm-strip IN_LIST TOOLCHAIN_TOOLS AND NOT ARG_STRIP_TOOL) list(APPEND compiler_args -DCMAKE_STRIP=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-strip) endif() list(APPEND ARG_DEPENDS ${TOOLCHAIN_TOOLS}) endif() + if(ARG_STRIP_TOOL) + list(APPEND compiler_args -DCMAKE_STRIP=${ARG_STRIP_TOOL}) + endif() + add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp DEPENDS ${ARG_DEPENDS} Index: llvm/runtimes/CMakeLists.txt =================================================================== --- llvm/runtimes/CMakeLists.txt +++ llvm/runtimes/CMakeLists.txt @@ -318,6 +318,14 @@ list(APPEND runtime_names ${projName}) endforeach() + if(LLVM_RUNTIME_BUILD_ID_LINK_TARGETS) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/llvm-strip-link.in + ${CMAKE_CURRENT_BINARY_DIR}/llvm-strip-link + @ONLY + ) + endif() + function(runtime_default_target) cmake_parse_arguments(ARG "" "" "DEPENDS;PREFIXES" ${ARGN}) @@ -426,6 +434,10 @@ endif() endforeach() + if(target IN_LIST LLVM_RUNTIME_BUILD_ID_LINK_TARGETS) + set(EXTRA_ARGS ${EXTRA_ARGS} STRIP_TOOL ${CMAKE_CURRENT_BINARY_DIR}/llvm-strip-link) + endif() + llvm_ExternalProject_Add(runtimes-${name} ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${${name}_deps} Index: llvm/runtimes/llvm-strip-link.in =================================================================== --- /dev/null +++ llvm/runtimes/llvm-strip-link.in @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import sys +import subprocess + + +ELF_MAGIC = '\x7fELF' + +with open(sys.argv[1], "rb") as f: + buf = f.read(len(ELF_MAGIC)) + if buf != ELF_MAGIC: + sys.exit(0) + +llvm_objcopy = os.path.join('@LLVM_RUNTIME_OUTPUT_INTDIR@', 'llvm-objcopy') +install_dir = os.path.join(os.getenv('DESTDIR', ''), '@CMAKE_INSTALL_PREFIX@') +link_dir = os.path.join(install_dir, 'lib', 'debug', '.build-id') + +sys.exit(subprocess.call([ + llvm_objcopy, + '--strip-sections', + '--build-id-link-dir=' + link_dir, + '--build-id-link-input=.debug', + '--build-id-link-output=', + sys.argv[1], +]))