# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# RISC-V linker parameters.
riscv_linker_script = '@0@/@1@'.format(meson.source_root(), files(['flash_link.ld'])[0])
riscv_linker_args = [
  # The linker script includes an autogenerated definition of the available
  # memory regions. The include path is given relative to the source root, so we
  # need to add the source root to the linker lookup path (which is the same for
  # libraries and linker scripts.
  '-Wl,-L,@0@'.format(meson.source_root()),
  '-Wl,-T,@0@'.format(riscv_linker_script),
  # Depending on the compiler and its configuration (*), |--build-id| is passed
  # to the linker, causing the insertion of a ".note.gnu.build-id" section into
  # the ELF file. We do not use the build ID. Achieve consistent behavior and
  # potentially a small improvement in linking time by not computing the build
  # ID in the first place.
  #
  # * GCC built with |--enable-linker-build-id|, clang before 3.9 or built with
  #   |-DENABLE_LINKER_BUILD_ID|.
  '-Wl,--build-id=none',
]

# RISC-V startup library. Every RISC-V executable should depend on this target.
#
# The crt defines the interrupt vector, so requires definitions for all the
# declarations in `sw/device/lib/testing/test_framework/ottf_isrs.S`.
riscv_crt = declare_dependency(
  link_args: riscv_linker_args,
  # The following assembly files need to be included as a source, not a
  # static library, so that their custom sections can be picked up when
  # linking.
  sources: [
    # This contains the contents of the `.crt` section which does the initial
    # setup before jumping to `main`.
    'flash_crt.S',
    # This contains the interrupt vector definition, as used by the crt to
    # initialize mtvec.
    'ibex_interrupt_vectors.S',
  ],
  dependencies: [
    freestanding_headers,
    sw_lib_crt,
    sw_lib_mem,
    sw_lib_irq,
    top_earlgrey,
  ],
  # This argument exists solely so that Meson realizes that riscv_linker_script
  # is part of the dependency graph. This seems to be the only way to convince
  # Meson to behave in this way, for the following reasons:
  # - The dependencies arg can only include artifacts from declare_dependency().
  # - We can't put linker scripts into the sources list, since Meson has no
  #   clue how to deal with them.
  # - custom_target() doesn't help, because we can't convince Meson to depend on
  #   a custom_target() unless it produces source files.
  # - If we go with static_library, sources needs to be non-empty in order for
  #   Meson to correctly treat it as a cross-compile target (otherwise, we get
  #   linker errors). This is because Meson guesses the type of a target based
  #   off of the file extensions of the source files.
  link_with: static_library(
    'riscv_linker_script_dep_shim',
    sources: ['empty.c'],
    link_depends: [riscv_linker_script],
  )
)
