Build: Enable C++ support during compilation

Adds support for CXX to TF-M's build system. This is required for any
secure partitions that wish to make use of C++, for example, and avoids
manual changes being applied to TF-M when C++ needs to be enabled in
projects.

Signed-off-by: Rajkumar Kanagaraj <rajkumar.kanagaraj@linaro.org>
Change-Id: Id8f9842776589a8e9315d6a1059e1330b368a45c
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 380168b..e8ac067 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -43,7 +43,7 @@
 include(${TFM_TOOLCHAIN_FILE})
 set(CMAKE_PROJECT_INCLUDE_BEFORE ${CMAKE_SOURCE_DIR}/cmake/disable_compiler_detection.cmake)
 
-project("Trusted Firmware M" VERSION ${TFM_VERSION} LANGUAGES C ASM)
+project("Trusted Firmware M" VERSION ${TFM_VERSION} LANGUAGES C CXX ASM)
 tfm_toolchain_reload_compiler()
 
 # Synchronise the install path variables. If CMAKE_INSTALL_PREFIX is manually
diff --git a/cmake/disable_compiler_detection.cmake b/cmake/disable_compiler_detection.cmake
index ebafca0..215221a 100644
--- a/cmake/disable_compiler_detection.cmake
+++ b/cmake/disable_compiler_detection.cmake
@@ -7,3 +7,4 @@
 
 #Stop cmake running compiler tests.
 set (CMAKE_C_COMPILER_FORCED true)
+set (CMAKE_CXX_COMPILER_FORCED true)
diff --git a/platform/ext/common/gcc/tfm_common_s.ld b/platform/ext/common/gcc/tfm_common_s.ld
index 29561d7..fe370e6 100644
--- a/platform/ext/common/gcc/tfm_common_s.ld
+++ b/platform/ext/common/gcc/tfm_common_s.ld
@@ -194,7 +194,6 @@
     Image$$ER_CODE_SRAM$$Limit = ADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM);
 #endif
 
-#if TFM_LVL != 1
     .ARM.extab :
     {
         *(.ARM.extab* .gnu.linkonce.armextab.*)
@@ -207,8 +206,6 @@
     } > FLASH
     __exidx_end = .;
 
-#endif /* TFM_LVL != 1 */
-
     .ER_TFM_CODE : ALIGN(4)
     {
         *startup*(.text*)
diff --git a/toolchain_ARMCLANG.cmake b/toolchain_ARMCLANG.cmake
index f90f94a..5d3f682 100644
--- a/toolchain_ARMCLANG.cmake
+++ b/toolchain_ARMCLANG.cmake
@@ -9,6 +9,7 @@
 SET(CMAKE_SYSTEM_NAME Generic)
 
 set(CMAKE_C_COMPILER armclang)
+set(CMAKE_CXX_COMPILER armclang)
 set(CMAKE_ASM_COMPILER armasm)
 
 set(LINKER_VENEER_OUTPUT_FLAG --import_cmse_lib_out=)
@@ -24,25 +25,27 @@
     set_property(DIRECTORY PROPERTY COMPILE_OPTIONS "")
 
     add_compile_options(
-        $<$<COMPILE_LANGUAGE:C>:-Wno-ignored-optimization-argument>
-        $<$<COMPILE_LANGUAGE:C>:-Wno-unused-command-line-argument>
-        $<$<COMPILE_LANGUAGE:C>:-Wall>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-ignored-optimization-argument>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-unused-command-line-argument>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wall>
         # Don't error when the MBEDTLS_NULL_ENTROPY warning is shown
-        $<$<COMPILE_LANGUAGE:C>:-Wno-error=cpp>
-        $<$<COMPILE_LANGUAGE:C>:-c>
-        $<$<COMPILE_LANGUAGE:C>:-fdata-sections>
-        $<$<COMPILE_LANGUAGE:C>:-ffunction-sections>
-        $<$<COMPILE_LANGUAGE:C>:-fno-builtin>
-        $<$<COMPILE_LANGUAGE:C>:-fshort-enums>
-        $<$<COMPILE_LANGUAGE:C>:-fshort-wchar>
-        $<$<COMPILE_LANGUAGE:C>:-funsigned-char>
-        $<$<COMPILE_LANGUAGE:C>:-masm=auto>
-        $<$<COMPILE_LANGUAGE:C>:-nostdlib>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-error=cpp>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-c>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fdata-sections>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-ffunction-sections>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fno-builtin>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fshort-enums>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fshort-wchar>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-funsigned-char>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-masm=auto>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-nostdlib>
         $<$<COMPILE_LANGUAGE:C>:-std=c99>
-        $<$<COMPILE_LANGUAGE:C>:-mfpu=none>
+        $<$<COMPILE_LANGUAGE:CXX>:-std=c++11>
+        $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-mfpu=none>
         $<$<COMPILE_LANGUAGE:ASM>:--fpu=none>
         $<$<COMPILE_LANGUAGE:ASM>:--cpu=${CMAKE_ASM_CPU_FLAG}>
         $<$<AND:$<COMPILE_LANGUAGE:C>,$<BOOL:${TFM_DEBUG_SYMBOLS}>>:-g>
+        $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:${TFM_DEBUG_SYMBOLS}>>:-g>
     )
 endmacro()
 
@@ -116,6 +119,7 @@
     set(CMAKE_SYSTEM_ARCH            ${TFM_SYSTEM_ARCHITECTURE})
 
     set(CMAKE_C_COMPILER_TARGET      arm-${CROSS_COMPILE})
+    set(CMAKE_CXX_COMPILER_TARGET    arm-${CROSS_COMPILE})
     set(CMAKE_ASM_COMPILER_TARGET    arm-${CROSS_COMPILE})
 
     # MVE is currently not supported in case of armclang
@@ -135,6 +139,8 @@
     include(Compiler/ARMClang)
     set(CMAKE_C_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
     set(CMAKE_C_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
+    set(CMAKE_CXX_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
+    set(CMAKE_CXX_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
     set(CMAKE_ASM_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
     set(CMAKE_ASM_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
 endmacro()
@@ -145,6 +151,7 @@
     tfm_toolchain_reset_linker_flags()
 
     unset(CMAKE_C_FLAGS_INIT)
+    unset(CMAKE_CXX_FLAGS_INIT)
     unset(CMAKE_C_LINK_FLAGS)
     unset(CMAKE_ASM_FLAGS_INIT)
     unset(CMAKE_ASM_LINK_FLAGS)
@@ -173,18 +180,23 @@
     if (DEFINED TFM_SYSTEM_PROCESSOR)
         set(CMAKE_C_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
         set(CMAKE_C_LINK_FLAGS   "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
+        set(CMAKE_CXX_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
         set(CMAKE_ASM_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
         # But armlink doesn't support this +dsp syntax
         string(REGEX REPLACE "\\+nodsp" "" CMAKE_C_LINK_FLAGS   "${CMAKE_C_LINK_FLAGS}")
+        string(REGEX REPLACE "\\+nodsp" "" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
         string(REGEX REPLACE "\\+nodsp" "" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
         # And uses different syntax for +nofp
         string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_C_LINK_FLAGS   "${CMAKE_C_LINK_FLAGS}")
+        string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
         string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
 
         string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_C_LINK_FLAGS   "${CMAKE_C_LINK_FLAGS}")
+        string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
         string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
     else()
         set(CMAKE_C_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
+        set(CMAKE_CXX_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
     endif()
 
     # Workaround for issues with --depend-single-line with armasm and Ninja
diff --git a/toolchain_GNUARM.cmake b/toolchain_GNUARM.cmake
index 7978eac..d044ed4 100644
--- a/toolchain_GNUARM.cmake
+++ b/toolchain_GNUARM.cmake
@@ -14,6 +14,10 @@
     message(FATAL_ERROR "Could not find compiler: '${CROSS_COMPILE}-gcc'")
 endif()
 
+if(CMAKE_CXX_COMPILER STREQUAL "CMAKE_CXX_COMPILER-NOTFOUND")
+    message(FATAL_ERROR "Could not find compiler: '${CROSS_COMPILE}-g++'")
+endif()
+
 set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
 
 set(LINKER_VENEER_OUTPUT_FLAG -Wl,--cmse-implib,--out-implib=)
@@ -48,7 +52,8 @@
         -funsigned-char
         -mthumb
         -nostdlib
-        -std=c99
+        $<$<COMPILE_LANGUAGE:C>:-std=c99>
+        $<$<COMPILE_LANGUAGE:CXX>:-std=c++11>
         $<$<OR:$<BOOL:${TFM_DEBUG_SYMBOLS}>,$<BOOL:${TFM_CODE_COVERAGE}>>:-g>
     )
 endmacro()
@@ -166,21 +171,25 @@
     endif()
 
     unset(CMAKE_C_FLAGS_INIT)
+    unset(CMAKE_CXX_FLAGS_INIT)
     unset(CMAKE_ASM_FLAGS_INIT)
 
     if (CMAKE_SYSTEM_PROCESSOR)
         set(CMAKE_C_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
+        set(CMAKE_CXX_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
         set(CMAKE_ASM_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
         set(CMAKE_C_LINK_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
         set(CMAKE_ASM_LINK_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
     else()
         set(CMAKE_C_FLAGS_INIT "-march=${CMAKE_SYSTEM_ARCH}")
+        set(CMAKE_CXX_FLAGS_INIT "-march=${CMAKE_SYSTEM_ARCH}")
         set(CMAKE_ASM_FLAGS_INIT "-march=${CMAKE_SYSTEM_ARCH}")
         set(CMAKE_C_LINK_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
         set(CMAKE_ASM_LINK_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
     endif()
 
     set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS_INIT})
+    set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS_INIT})
     set(CMAKE_ASM_FLAGS ${CMAKE_ASM_FLAGS_INIT})
 
     set(BL2_COMPILER_CP_FLAG -mfloat-abi=soft)