############################################################################
# arch/tricore/src/common/ToolchainTasking.defs
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.  The
# ASF licenses this file to you 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.
#
############################################################################

#
# Supported toolchains
#
# Each toolchain definition should set:
#
#  CROSSDEV         The GNU toolchain triple (command prefix)
#  ARCHCPUFLAGS     CPU-specific flags selecting the instruction set
#                   FPU options, etc.
#  ARCHOPTIMIZATION The optimization level that results in
#                   reliable code generation.
#

ifeq ($(CONFIG_DEBUG_CUSTOMOPT),y)
  ARCHOPTIMIZATION += $(CONFIG_DEBUG_OPTLEVEL)
else ifeq ($(CONFIG_DEBUG_FULLOPT),y)
  ifeq ($(CONFIG_ARCH_TOOLCHAIN_CLANG),y)
    ARCHOPTIMIZATION += -Oz
  else
    ARCHOPTIMIZATION += -Os
  endif
endif

# Tasking toolchain

CC                = cctc
CXX               = cptc
CPP               = cptc $(ARCHOPTIMIZATION)
LD                = cctc
STRIP             = strip --strip-unneeded
AR                = artc -r
NM                = nm
OBJCOPY           = objcopy
OBJDUMP           = elfdump

ARCHOPTIMIZATION += --lsl-core=vtc
LDFLAGS          += --lsl-core=vtc
ARCHOPTIMIZATION += --iso=17
ARCHOPTIMIZATION += --language=+gcc,+volatile,-strings,-kanji

# pragma align <4> (default: 0)

ARCHOPTIMIZATION += --align=4

# Always use 32-bit integers for enumeration

ARCHOPTIMIZATION += --integer-enumeration

# tradeoff between speed (-t0) and size (-t4) (default: 4)

ARCHOPTIMIZATION += --tradeoff=2

# enable symbolic debug information

ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
  ARCHOPTIMIZATION += --debug-info=default
  ARCHOPTIMIZATION += --keep-temporary-files
  ARCHOPTIMIZATION += $(CONFIG_DEBUG_SYMBOLS_LEVEL)
endif

# merge source code with assembly output

ARCHOPTIMIZATION += --source

# generate alignment depending on assume_if hints

ARCHOPTIMIZATION += --branch-target-align


# Since nuttx uses too many of GNU extensions in the implementation of
# FPU-related library functions, which is not supported in tasking,
# so currently we cannot use FPU-related configurations to manage it.
#
# Just set fp-model to Double Precision:
# --fp-model[=<flag>,...]         floating-point model (default: cFlnrSTz)
#   0                               alias for --fp-model=CFLNRStZ (strict)
#   1                               alias for --fp-model=cFLNRSTZ (precise)
#   2                               alias for --fp-model=cFlnrSTz (fast-dp)
#   3                               alias for --fp-model=cflnrSTz (fast-sp)

ARCHOPTIMIZATION += --fp-model=2
LDFLAGS          += --fp-model=2
LDFLAGS          += -lfp_fpu

LDFLAGS          += --hex-format=s -Wl-OtxYcL -Wl-mcrfiklsmnoduq
LDFLAGS          += -lrt

# ctc W500: ["stdio/lib_libvsprintf.c" 884/29] expression without effect
# ctc W507: ["mm_heap/mm_malloc.c" 238/64] variable "nodesize" is possibly uninitialized
# ctc W508: ["misc/lib_impure.c" 1/1] empty source file
# ctc W525: ["getopt.c" 678/3] discarded 'const' qualifier at assignment: conversion from char const * to char *
# ctc W527: ["stdlib/lib_strtold.c" 565/23] constant of type "double" saturated
# ctc W526: ["include/sys/epoll.h" 87/5] enumeration constant shall be representable as 'int'
# ctc W529: ["wchar/lib_mbrtowc.c" 88/35] overflow in constant expression of type "unsigned long int"
# ctc W544: ["wqueue/kwork_thread.c" 210/32] unreachable code
# ctc W549: ["unistd/lib_getopt_common.c" 544/15] condition is always true
# ctc W553: ["vfs/fs_fcntl.c" 231/7] no 'break' or comment before case label
# ctc W557: ["common/tricore_main.c" 58/11] possible infinite loop
# ctc W560: ["tmpfs/fs_tmpfs.c" 232/25] possible truncation at implicit conversion to type "unsigned short int"
# ctc W562: ["mm_heap/mm_memalign.c" 70/20] unary minus applied to unsigned value
# ctc W558: ["include/nuttx/power/regulator.h" 224/36] struct/union/enum definition in parameter declaration
# ctc W587: ["stdlib/lib_strtold.c" 571/23] underflow on constant of type "double"
# ctc W588: ["misc/lib_glob.c" 150/13] dead assignment to "i" eliminated
# ctc W589: ["inode/fs_inodesearch.c" 72/8] pointer assumed to be nonzero - test removed

TASKING_WARNINGS  = 500,507,508,525,526,527,529,544,549,553,560,562,557,558,587,588,589

ARCHOPTIMIZATION += --pass-c=--no-warnings=$(TASKING_WARNINGS)

# Loadable module definitions

CMODULEFLAGS = $(CFLAGS) -fvisibility=hidden
LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)

# ELF module definitions

CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden

LDELFFLAGS = -r -e __start
LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)elf$(DELIM)gnu-elf.ld)