Build: LLVM toolchain support for MPS4 platforms

Signed-off-by: Anton Komlev <anton.komlev@arm.com>
Change-Id: I0566509a9be0aea610eac2b0db95a3f343d4c3b0
diff --git a/bl1/bl1_1/CMakeLists.txt b/bl1/bl1_1/CMakeLists.txt
index 434a48d..f2f762e 100644
--- a/bl1/bl1_1/CMakeLists.txt
+++ b/bl1/bl1_1/CMakeLists.txt
@@ -24,6 +24,7 @@
         $<$<C_COMPILER_ID:GNU>:-Wl,-Map=${CMAKE_BINARY_DIR}/bin/bl1_1.map>
         $<$<C_COMPILER_ID:ARMClang>:--map>
         $<$<C_COMPILER_ID:IAR>:--map\;${CMAKE_BINARY_DIR}/bin/bl1_1.map>
+        $<$<C_COMPILER_ID:Clang>:LINKER:-Map=${CMAKE_BINARY_DIR}/bin/bl1_1.map>
 )
 
 target_compile_options(bl1_1
@@ -71,6 +72,7 @@
         $<$<C_COMPILER_ID:GNU>:-E\;-xc>
         $<$<C_COMPILER_ID:ARMClang>:-E\;-xc>
         $<$<C_COMPILER_ID:IAR>:--preprocess=ns\;$<TARGET_OBJECTS:signing_layout_bl1_2>>
+        $<$<C_COMPILER_ID:Clang>:-E\;-xc>
 )
 target_link_libraries(signing_layout_bl1_2
     PRIVATE
@@ -88,7 +90,7 @@
 
 add_custom_command(OUTPUT bl1_2_padded.bin bl1_2_padded_hash.bin
     OUTPUT ${bin_dir}/bl1_2_padded.bin ${bin_dir}/bl1_2_padded_hash.bin
-    DEPENDS $<TARGET_FILE_DIR:bl1_2>/bl1_2.bin bl1_2_bin signing_layout_bl1_2
+    DEPENDS bl1_2_bin signing_layout_bl1_2
     DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/scripts/create_bl1_2_img.py
     COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/create_bl1_2_img.py
                     --input_file $<TARGET_FILE_DIR:bl1_2>/bl1_2.bin
diff --git a/bl1/bl1_2/CMakeLists.txt b/bl1/bl1_2/CMakeLists.txt
index cacab03..843b7fe 100644
--- a/bl1/bl1_2/CMakeLists.txt
+++ b/bl1/bl1_2/CMakeLists.txt
@@ -26,6 +26,7 @@
         $<$<C_COMPILER_ID:GNU>:-Wl,-Map=${CMAKE_BINARY_DIR}/bin/bl1_2.map>
         $<$<C_COMPILER_ID:ARMClang>:--map>
         $<$<C_COMPILER_ID:IAR>:--map\;${CMAKE_BINARY_DIR}/bin/bl1_2.map>
+        $<$<C_COMPILER_ID:Clang>:-Wl,-Map=${CMAKE_BINARY_DIR}/bin/bl1_2.map>
 )
 
 target_compile_options(bl1_2
@@ -87,6 +88,7 @@
         $<$<C_COMPILER_ID:GNU>:-E\;-xc>
         $<$<C_COMPILER_ID:ARMClang>:-E\;-xc>
         $<$<C_COMPILER_ID:IAR>:--preprocess=ns\;$<TARGET_OBJECTS:signing_layout_bl2>>
+        $<$<C_COMPILER_ID:Clang>:-E\;-xc>
 )
 target_link_libraries(signing_layout_bl2
     PRIVATE
@@ -106,7 +108,7 @@
 
 add_custom_command(OUTPUT bl2_signed.bin bl2_signed_hash.bin
     OUTPUT ${bin_dir}/bl2_signed.bin ${bin_dir}/bl2_signed_hash.bin
-    DEPENDS $<TARGET_FILE_DIR:bl2>/bl2.bin bl2_bin signing_layout_bl2
+    DEPENDS bl2_bin signing_layout_bl2
     DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/scripts/create_bl2_img.py
     COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/create_bl2_img.py
                     --input_file $<TARGET_FILE_DIR:bl2>/bl2.bin
diff --git a/platform/ext/common/provisioning_bundle/CMakeLists.txt b/platform/ext/common/provisioning_bundle/CMakeLists.txt
index 26f6bd9..220b1a9 100644
--- a/platform/ext/common/provisioning_bundle/CMakeLists.txt
+++ b/platform/ext/common/provisioning_bundle/CMakeLists.txt
@@ -33,6 +33,7 @@
         $<$<C_COMPILER_ID:ARMClang>:${CMAKE_CURRENT_SOURCE_DIR}/provisioning_bundle.sct>
         $<$<C_COMPILER_ID:GNU>:${CMAKE_CURRENT_SOURCE_DIR}/provisioning_bundle.ld>
         $<$<C_COMPILER_ID:IAR>:${CMAKE_CURRENT_SOURCE_DIR}/provisioning_bundle.icf>
+        $<$<C_COMPILER_ID:Clang>:${CMAKE_CURRENT_SOURCE_DIR}/provisioning_bundle.ldc>
     )
 endif()
 
@@ -41,6 +42,7 @@
         $<$<C_COMPILER_ID:GNU>:-Wl,-Map=${CMAKE_BINARY_DIR}/bin/provisioning_bundle.map>
         $<$<C_COMPILER_ID:ARMClang>:--map>
         $<$<C_COMPILER_ID:IAR>:--map\;${CMAKE_BINARY_DIR}/bin/provisioning_bundle.map>
+        $<$<C_COMPILER_ID:Clang>:-Wl,-Map=${CMAKE_BINARY_DIR}/bin/provisioning_bundle.map>
 )
 
 target_link_options(provisioning_bundle
diff --git a/platform/ext/common/provisioning_bundle/provisioning_bundle.ldc b/platform/ext/common/provisioning_bundle/provisioning_bundle.ldc
new file mode 100644
index 0000000..f5afb51
--- /dev/null
+++ b/platform/ext/common/provisioning_bundle/provisioning_bundle.ldc
@@ -0,0 +1,62 @@
+;/*
+; * Copyright (c) 2021-2024 Arm Limited. All rights reserved.
+; *
+; * Licensed under the Apache License, Version 2.0 (the "License");
+; * you may not use this file except in compliance with the License.
+; * You may obtain a copy of the License at
+; *
+; *     http://www.apache.org/licenses/LICENSE-2.0
+; *
+; * Unless required by applicable law or agreed to in writing, software
+; * distributed under the License is distributed on an "AS IS" BASIS,
+; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; * See the License for the specific language governing permissions and
+; * limitations under the License.
+; *
+; *
+; * This file is derivative of CMSIS V5.00 gcc_arm.ld
+; */
+
+/* Linker script to configure memory regions. */
+/* This file will be run trough the pre-processor. */
+
+#include "region_defs.h"
+
+MEMORY
+{
+    CODE (rx) : ORIGIN = PROVISIONING_BUNDLE_CODE_START, LENGTH = PROVISIONING_BUNDLE_CODE_SIZE
+    DATA (rw) : ORIGIN = PROVISIONING_BUNDLE_DATA_START, LENGTH = PROVISIONING_BUNDLE_DATA_SIZE
+    VALUES (r) : ORIGIN = PROVISIONING_BUNDLE_VALUES_START, LENGTH = PROVISIONING_BUNDLE_VALUES_SIZE
+}
+
+ENTRY(do_provisioning)
+
+SECTIONS
+{
+    CODE :
+    {
+        *provisioning_code.o(DO_PROVISION)
+        *(.text*)
+    } > CODE
+
+    RW_DATA :
+    {
+        *(COMMON .data*)
+    } > DATA
+
+    RO_DATA :
+    {
+        *(EXCLUDE_FILE (*provisioning_data.o) .rodata*)
+    } > DATA
+
+    BSS_DATA :
+    {
+        *(.bss*)
+    } > DATA
+
+    VALUES :
+    {
+        *provisioning_data.o(.rodata.data)
+    } > VALUES
+
+}
diff --git a/platform/ext/target/arm/mps4/common/common.cmake b/platform/ext/target/arm/mps4/common/common.cmake
index a15fbbc..6156b94 100644
--- a/platform/ext/target/arm/mps4/common/common.cmake
+++ b/platform/ext/target/arm/mps4/common/common.cmake
@@ -14,6 +14,7 @@
     $<$<C_COMPILER_ID:ARMClang>:${CMAKE_BINARY_DIR}/generated/platform/ext/common/armclang/tfm_isolation_s.sct>
     $<$<C_COMPILER_ID:GNU>:${CMAKE_BINARY_DIR}/generated/platform/ext/common/gcc/tfm_isolation_s.ld>
     $<$<C_COMPILER_ID:IAR>:${CMAKE_BINARY_DIR}/generated/platform/ext/common/iar/tfm_isolation_s.icf>
+    $<$<C_COMPILER_ID:Clang>:${CMAKE_BINARY_DIR}/generated/platform/ext/common/llvm/tfm_isolation_s.ld>
 )
 
 # Specify the location of platform specific build dependencies.
@@ -32,6 +33,7 @@
         $<$<C_COMPILER_ID:ARMClang>:${PLATFORM_DIR}/ext/common/armclang/tfm_common_bl2.sct>
         $<$<C_COMPILER_ID:GNU>:${PLATFORM_DIR}/ext/common/gcc/tfm_common_bl2.ld>
         $<$<C_COMPILER_ID:IAR>:${PLATFORM_DIR}/ext/common/iar/tfm_common_bl2.icf>
+	$<$<C_COMPILER_ID:Clang>:${PLATFORM_DIR}/ext/common/llvm/tfm_common_bl2.ld>
     )
 
     target_compile_options(bl2_scatter
@@ -282,6 +284,7 @@
     $<$<C_COMPILER_ID:ARMClang>:${CMAKE_CURRENT_LIST_DIR}/device/source/armclang/mps4_corstone3xx_bl1_1.sct>
     $<$<C_COMPILER_ID:GNU>:${CMAKE_CURRENT_LIST_DIR}/device/source/gcc/mps4_corstone3xx_bl1_1.ld>
     $<$<C_COMPILER_ID:IAR>:${CMAKE_CURRENT_LIST_DIR}/device/source/iar/mps4_corstone3xx_bl1_1.icf>
+    $<$<C_COMPILER_ID:Clang>:${CMAKE_CURRENT_LIST_DIR}/device/source/llvm/mps4_corstone3xx_bl1_1.ld>
 )
 
 target_compile_options(bl1_1_scatter
@@ -345,6 +348,7 @@
     $<$<C_COMPILER_ID:ARMClang>:${CMAKE_CURRENT_LIST_DIR}/device/source/armclang/mps4_corstone3xx_bl1_2.sct>
     $<$<C_COMPILER_ID:GNU>:${CMAKE_CURRENT_LIST_DIR}/device/source/gcc/mps4_corstone3xx_bl1_2.ld>
     $<$<C_COMPILER_ID:IAR>:${CMAKE_CURRENT_LIST_DIR}/device/source/iar/mps4_corstone3xx_bl1_2.icf>
+    $<$<C_COMPILER_ID:Clang>:${CMAKE_CURRENT_LIST_DIR}/device/source/llvm/mps4_corstone3xx_bl1_2.ld>
 )
 
 target_compile_options(bl1_2_scatter
@@ -465,5 +469,6 @@
     install(FILES       ${PLATFORM_DIR}/ext/common/armclang/tfm_common_ns.sct
                         ${PLATFORM_DIR}/ext/common/gcc/tfm_common_ns.ld
                         ${PLATFORM_DIR}/ext/common/iar/tfm_common_ns.icf
+                        ${PLATFORM_DIR}/ext/common/llvm/tfm_common_ns.ldc
             DESTINATION ${INSTALL_PLATFORM_NS_DIR}/linker_scripts)
 endif()
diff --git a/platform/ext/target/arm/mps4/common/device/source/llvm/mps4_corstone3xx_bl1_1.ld b/platform/ext/target/arm/mps4/common/device/source/llvm/mps4_corstone3xx_bl1_1.ld
new file mode 100644
index 0000000..a8f9d4d
--- /dev/null
+++ b/platform/ext/target/arm/mps4/common/device/source/llvm/mps4_corstone3xx_bl1_1.ld
@@ -0,0 +1,96 @@
+;/*
+; * Copyright (c) 2021-2024 Arm Limited. All rights reserved.
+; *
+; * Licensed under the Apache License, Version 2.0 (the "License");
+; * you may not use this file except in compliance with the License.
+; * You may obtain a copy of the License at
+; *
+; *     http://www.apache.org/licenses/LICENSE-2.0
+; *
+; * Unless required by applicable law or agreed to in writing, software
+; * distributed under the License is distributed on an "AS IS" BASIS,
+; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; * See the License for the specific language governing permissions and
+; * limitations under the License.
+; *
+; *
+; * This file is derivative of gcc/mps4_corstone3xx_bl1_1.ld
+; */
+
+/* Linker script to configure memory regions. */
+/* This file will be run trough the pre-processor. */
+
+#include "region_defs.h"
+
+MEMORY
+{
+    FLASH (rx)  : ORIGIN = BL1_1_CODE_START, LENGTH = BL1_1_CODE_SIZE
+    RAM   (rwx) : ORIGIN = BL1_1_DATA_START, LENGTH = BL1_1_DATA_SIZE
+}
+
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+    .text :
+    {
+        __vectors_start = .;
+        KEEP(*(.vectors))
+        __vectors_end = .;
+
+        *(.text*)
+        *(.rodata*)
+    } > FLASH
+
+    .ARM.extab :
+    {
+        *(.ARM.extab*)
+    } > FLASH
+
+    __exidx_start = .;
+    .ARM.exidx :
+    {
+        *(.ARM.exidx*)
+    } > FLASH
+
+    __etext = ALIGN(4);
+
+    .tfm_bl2_shared_data (NOLOAD) : ALIGN(32)
+    {
+        . += BOOT_TFM_SHARED_DATA_SIZE;
+    } > RAM
+
+    . = BL1_1_DATA_START;
+    .data : AT (__etext)
+    {
+        *(.data*)
+	} > RAM
+    __data_start = ADDR(.data);
+    __data_source = LOADADDR(.data);
+    __data_size = SIZEOF(.data);
+
+    .bss (NOLOAD) : ALIGN(4)
+    {
+        *(.bss*)
+        . = ALIGN(4);
+        __tls_base = . ;                /* to satisfy crt0 */
+        __arm32_tls_tcb_offset = . ;    /* to satisfy crt0 */
+    } > RAM
+    __bss_start = ADDR(.bss);
+    __bss_size = SIZEOF(.bss);
+
+    .msp_stack (NOLOAD) : ALIGN(32)
+    {
+        . += BL1_1_MSP_STACK_SIZE;
+    } > RAM
+    __stack_seal = ADDR(.msp_stack) + SIZEOF(.msp_stack) - 0x8;
+    Image$$ARM_LIB_STACK$$ZI$$Base = ADDR(.msp_stack);
+    Image$$ARM_LIB_STACK$$ZI$$Limit = __stack_seal;
+
+    .heap (NOLOAD) : ALIGN(8)
+    {
+        . += BL1_1_HEAP_SIZE;
+    } > RAM
+    __heap_start = ADDR(.heap);
+    __heap_end = ADDR(.heap) + SIZEOF(.heap);
+}
diff --git a/platform/ext/target/arm/mps4/common/device/source/llvm/mps4_corstone3xx_bl1_2.ld b/platform/ext/target/arm/mps4/common/device/source/llvm/mps4_corstone3xx_bl1_2.ld
new file mode 100644
index 0000000..223ad36
--- /dev/null
+++ b/platform/ext/target/arm/mps4/common/device/source/llvm/mps4_corstone3xx_bl1_2.ld
@@ -0,0 +1,103 @@
+;/*
+; * Copyright (c) 2021-2024 Arm Limited. All rights reserved.
+; *
+; * Licensed under the Apache License, Version 2.0 (the "License");
+; * you may not use this file except in compliance with the License.
+; * You may obtain a copy of the License at
+; *
+; *     http://www.apache.org/licenses/LICENSE-2.0
+; *
+; * Unless required by applicable law or agreed to in writing, software
+; * distributed under the License is distributed on an "AS IS" BASIS,
+; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; * See the License for the specific language governing permissions and
+; * limitations under the License.
+; *
+; *
+; * This file is derivative of gcc/mps4_corstone3xx_bl1_2.ld
+; */
+
+/* Linker script to configure memory regions. */
+/* This file will be run trough the pre-processor. */
+
+#include "region_defs.h"
+
+MEMORY
+{
+    FLASH (rx)  : ORIGIN = BL1_2_CODE_START, LENGTH = BL1_2_CODE_SIZE
+    RAM   (rwx) : ORIGIN = BL1_2_DATA_START, LENGTH = BL1_2_DATA_SIZE
+}
+
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+    .text :
+    {
+        __vectors_start = .;
+        KEEP(*(.vectors))
+        __vectors_end = .;
+
+        *(.text*)
+        *(.rodata*)
+    } > FLASH
+
+    .ARM.extab :
+    {
+        *(.ARM.extab*)
+    } > FLASH
+
+    __exidx_start = .;
+    .ARM.exidx :
+    {
+        *(.ARM.exidx*)
+    } > FLASH
+
+    __etext = ALIGN(4);
+
+    .tfm_bl2_shared_data (NOLOAD) : ALIGN(32)
+    {
+        . += BOOT_TFM_SHARED_DATA_SIZE;
+    } > RAM
+
+    . = BL1_2_DATA_START;
+    Image$$BL1_2_ER_DATA_START$$Base = .;
+
+    .data : AT (__etext)
+    {
+        *(.data*)
+    } > RAM
+    __data_start = ADDR(.data);
+    __data_source = LOADADDR(.data);
+    __data_size = SIZEOF(.data);
+
+    .bss (NOLOAD) : ALIGN(4)
+    {
+        *(.bss*)
+        . = ALIGN(4);
+        __tls_base = . ;                /* to satisfy crt0 */
+        __arm32_tls_tcb_offset = . ;    /* to satisfy crt0 */
+    } > RAM
+    __bss_start = ADDR(.bss);
+    __bss_size = SIZEOF(.bss);
+
+    .msp_stack (NOLOAD) : ALIGN(32)
+    {
+        . += BL1_2_MSP_STACK_SIZE;
+    } > RAM
+    __stack_seal = ADDR(.msp_stack) + SIZEOF(.msp_stack) - 0x8;
+    Image$$ARM_LIB_STACK$$ZI$$Base = ADDR(.msp_stack);
+    Image$$ARM_LIB_STACK$$ZI$$Limit = __stack_seal;
+
+    .heap (NOLOAD) : ALIGN(8)
+    {
+        . += BL1_2_HEAP_SIZE;
+    } > RAM
+    __heap_start = ADDR(.heap);
+    __heap_end = ADDR(.heap) + SIZEOF(.heap);
+
+    Image$$BL1_2_ER_DATA_LIMIT$$Base = .;
+
+    Image$$BL1_1_ER_DATA_START$$Base = BL1_1_DATA_START;
+    Image$$BL1_1_ER_DATA_LIMIT$$Base = BL1_1_DATA_START + BL1_1_DATA_SIZE;
+}
diff --git a/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt b/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt
index a9a218c..fa3d101 100644
--- a/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt
+++ b/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt
@@ -31,18 +31,20 @@
     $<$<C_COMPILER_ID:ARMClang>:${CMAKE_CURRENT_SOURCE_DIR}/../bundle_common/provisioning_bundle.sct>
     $<$<C_COMPILER_ID:GNU>:${CMAKE_CURRENT_SOURCE_DIR}/../bundle_common/provisioning_bundle.ld>
     $<$<C_COMPILER_ID:IAR>:${CMAKE_CURRENT_SOURCE_DIR}/../bundle_common/provisioning_bundle.icf>
+    $<$<C_COMPILER_ID:Clang>:${CMAKE_CURRENT_SOURCE_DIR}/../bundle_common/provisioning_bundle.ldc>
 )
 
 target_link_options(cm_provisioning_bundle
     PRIVATE
         $<$<C_COMPILER_ID:GNU>:-Wl,-Map=${CMAKE_BINARY_DIR}/bin/cm_provisioning_bundle.map>
-        $<$<C_COMPILER_ID:ARMClang>:--map>
+        $<$<C_COMPILER_ID:ARMClang>:--map --entry=do_provision>
         $<$<C_COMPILER_ID:IAR>:--map\;${CMAKE_BINARY_DIR}/bin/cm_provisioning_bundle.map>
+        $<$<C_COMPILER_ID:Clang>:-Wl,-Map=${CMAKE_BINARY_DIR}/bin/cm_provisioning_bundle.map>
 )
 
 target_link_options(cm_provisioning_bundle
     PRIVATE
-        --entry=do_provision
+        $<$<NOT:$<C_COMPILER_ID:Clang>>:--entry=do_provision>
 )
 
 target_sources(cm_provisioning_bundle
diff --git a/platform/ext/target/arm/mps4/common/provisioning/bundle_common/provisioning_bundle.ldc b/platform/ext/target/arm/mps4/common/provisioning/bundle_common/provisioning_bundle.ldc
new file mode 100644
index 0000000..83ee9bd
--- /dev/null
+++ b/platform/ext/target/arm/mps4/common/provisioning/bundle_common/provisioning_bundle.ldc
@@ -0,0 +1,62 @@
+;/*
+; * Copyright (c) 2021-2024 Arm Limited. All rights reserved.
+; *
+; * Licensed under the Apache License, Version 2.0 (the "License");
+; * you may not use this file except in compliance with the License.
+; * You may obtain a copy of the License at
+; *
+; *     http://www.apache.org/licenses/LICENSE-2.0
+; *
+; * Unless required by applicable law or agreed to in writing, software
+; * distributed under the License is distributed on an "AS IS" BASIS,
+; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; * See the License for the specific language governing permissions and
+; * limitations under the License.
+; *
+; *
+; * This file is derivative of CMSIS V5.00 gcc_arm.ld
+; */
+
+/* Linker script to configure memory regions. */
+/* This file will be run trough the pre-processor. */
+
+#include "region_defs.h"
+
+MEMORY
+{
+    CODE (rx) : ORIGIN = PROVISIONING_BUNDLE_CODE_START, LENGTH = PROVISIONING_BUNDLE_CODE_SIZE
+    DATA (rw) : ORIGIN = PROVISIONING_BUNDLE_DATA_START, LENGTH = PROVISIONING_BUNDLE_DATA_SIZE
+    VALUES (r) : ORIGIN = PROVISIONING_BUNDLE_VALUES_START, LENGTH = PROVISIONING_BUNDLE_VALUES_SIZE
+}
+
+ENTRY(do_provision)
+
+SECTIONS
+{
+    CODE :
+    {
+        *provisioning_code.o(DO_PROVISION)
+        *(.text*)
+    } > CODE
+
+    RW_DATA :
+    {
+        *(COMMON .data*)
+    } > DATA
+
+    RO_DATA :
+    {
+        *(EXCLUDE_FILE (*provisioning_data.o) .rodata*)
+    } > DATA
+
+    BSS_DATA :
+    {
+        *(.bss*)
+    } > DATA
+
+    VALUES :
+    {
+        *provisioning_data.o(.rodata.data)
+    } > VALUES
+
+}
diff --git a/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt b/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt
index 9102d45..e446b66 100644
--- a/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt
+++ b/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt
@@ -34,6 +34,7 @@
     $<$<C_COMPILER_ID:ARMClang>:${CMAKE_CURRENT_SOURCE_DIR}/../bundle_common/provisioning_bundle.sct>
     $<$<C_COMPILER_ID:GNU>:${CMAKE_CURRENT_SOURCE_DIR}/../bundle_common/provisioning_bundle.ld>
     $<$<C_COMPILER_ID:IAR>:${CMAKE_CURRENT_SOURCE_DIR}/../bundle_common/provisioning_bundle.icf>
+    $<$<C_COMPILER_ID:Clang>:${CMAKE_CURRENT_SOURCE_DIR}/../bundle_common/provisioning_bundle.ldc>
 )
 
 target_link_options(dm_provisioning_bundle
@@ -41,11 +42,12 @@
         $<$<C_COMPILER_ID:GNU>:-Wl,-Map=${CMAKE_BINARY_DIR}/bin/dm_provisioning_bundle.map>
         $<$<C_COMPILER_ID:ARMClang>:--map>
         $<$<C_COMPILER_ID:IAR>:--map\;${CMAKE_BINARY_DIR}/bin/dm_provisioning_bundle.map>
+        $<$<C_COMPILER_ID:Clang>:-Wl,-Map=${CMAKE_BINARY_DIR}/bin/dm_provisioning_bundle.map>
 )
 
 target_link_options(dm_provisioning_bundle
     PRIVATE
-        --entry=do_provision
+       $<$<NOT:$<C_COMPILER_ID:Clang>>:--entry=do_provision>
 )
 
 target_sources(dm_provisioning_bundle
diff --git a/secure_fw/CMakeLists.txt b/secure_fw/CMakeLists.txt
index de39ad4..c627566 100644
--- a/secure_fw/CMakeLists.txt
+++ b/secure_fw/CMakeLists.txt
@@ -95,6 +95,7 @@
     PROPERTIES
     COMPILE_FLAGS $<$<C_COMPILER_ID:GNU>:-Wno-unused-parameter>
     COMPILE_FLAGS $<$<C_COMPILER_ID:ARMClang>:-Wno-unused-parameter>
+    COMPILE_FLAGS $<$<C_COMPILER_ID:Clang>:-Wno-unused-parameter>
 )
 
 target_sources(tfm_sprt
diff --git a/toolchain_LLVM.cmake b/toolchain_LLVM.cmake
index d0f88f7..ffa0158 100644
--- a/toolchain_LLVM.cmake
+++ b/toolchain_LLVM.cmake
@@ -66,10 +66,10 @@
 endif()
 
 set(BL1_COMPILER_CP_FLAG -mfloat-abi=soft)
-set(BL1_LINKER_CP_OPTION -mfloat-abi=soft)
+set(BL1_LINKER_CP_OPTION -mfloat-abi=soft -lcrt0 -ldummyhost)
 
 set(BL2_COMPILER_CP_FLAG -mfloat-abi=soft)
-set(BL2_LINKER_CP_OPTION -mfloat-abi=soft)
+set(BL2_LINKER_CP_OPTION -mfloat-abi=soft -lcrt0 -ldummyhost)
 
 add_compile_options(
      -Wno-ignored-optimization-argument
@@ -204,7 +204,7 @@
         # ${symbol_provider}_shared_symbols - a custom target is always considered out-of-date
         # To only link when necessary, depend on ${symbol_provider} instead
         set_property(TARGET ${target} APPEND PROPERTY LINK_DEPENDS $<TARGET_OBJECTS:${symbol_provider}>)
-        target_link_options(${target} PRIVATE LINKER:-R$<TARGET_FILE_DIR:${symbol_provider}>/${symbol_provider}${CODE_SHARING_INPUT_FILE_SUFFIX})
+        target_link_options(${target} PRIVATE LINKER:--just-symbols $<TARGET_FILE_DIR:${symbol_provider}>/${symbol_provider}${CODE_SHARING_INPUT_FILE_SUFFIX})
     endforeach()
 endmacro()