1cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol#
2cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Build targets for a Hexagon-based processor
3cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol#
4cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
5cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Hexagon Environment Checks ###################################################
6cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
7cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Ensure that the user has specified a path to the Hexagon toolchain that they
8cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# wish to use.
9cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignolifeq ($(HEXAGON_TOOLS_PREFIX),)
10cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol$(error "You must supply a HEXAGON_TOOLS_PREFIX environment variable \
11cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol         containing a path to the hexagon toolchain. Example: \
12cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol         export HEXAGON_TOOLS_PREFIX=$$HOME/Qualcomm/HEXAGON_Tools/8.0.07")
13cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignolendif
14cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
15f5295db79842ba1d1e948b43b50683cb4a8361f2Andrew Rossignolifeq ($(IS_NANOAPP_BUILD),)
167dbbe9837ad0cc60387a269f0bd6daa51bcd522bAndrew Rossignolifeq ($(SLPI_PREFIX),)
177dbbe9837ad0cc60387a269f0bd6daa51bcd522bAndrew Rossignol$(error "You must supply an SLPI_PREFIX environment variable \
187dbbe9837ad0cc60387a269f0bd6daa51bcd522bAndrew Rossignol         containing a path to the SLPI source tree. Example: \
197dbbe9837ad0cc60387a269f0bd6daa51bcd522bAndrew Rossignol         export SLPI_PREFIX=$$HOME/slpi_proc")
207dbbe9837ad0cc60387a269f0bd6daa51bcd522bAndrew Rossignolendif
217dbbe9837ad0cc60387a269f0bd6daa51bcd522bAndrew Rossignolendif
227dbbe9837ad0cc60387a269f0bd6daa51bcd522bAndrew Rossignol
23cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Hexagon Tools ################################################################
24cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
25cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew RossignolTARGET_AR = $(HEXAGON_TOOLS_PREFIX)/Tools/bin/hexagon-ar
26cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew RossignolTARGET_CC = $(HEXAGON_TOOLS_PREFIX)/Tools/bin/hexagon-clang
27cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew RossignolTARGET_LD = $(HEXAGON_TOOLS_PREFIX)/Tools/bin/hexagon-link
28cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
29cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Hexagon Compiler Flags #######################################################
30cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
31199aabe891a6b2bc7c9c3c15a22a5c3ae1cb6f9dAlexey Polyudov# Define CUST_H to allow including the customer header file.
32199aabe891a6b2bc7c9c3c15a22a5c3ae1cb6f9dAlexey PolyudovTARGET_CFLAGS += -DCUST_H
33199aabe891a6b2bc7c9c3c15a22a5c3ae1cb6f9dAlexey Polyudov
34cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Add Hexagon compiler flags
35cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew RossignolTARGET_CFLAGS += $(HEXAGON_CFLAGS)
36cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
37cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Enable position independence.
38cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew RossignolTARGET_CFLAGS += -fpic
39cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
40cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Disable splitting double registers.
41cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew RossignolTARGET_CFLAGS += -mllvm -disable-hsdr
42cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
4355095650d5c60ec982e0b9845ef719bb0f3d0a54Brian Duddie# Don't use small data section.
4455095650d5c60ec982e0b9845ef719bb0f3d0a54Brian DuddieTARGET_CFLAGS += -G0
4555095650d5c60ec982e0b9845ef719bb0f3d0a54Brian Duddie
469695b7bc89781c40aeb545ac0e879ff063590bf0Andrew Rossignol# Enable default visibility for FastRPC entry points.
479695b7bc89781c40aeb545ac0e879ff063590bf0Andrew RossignolTARGET_CFLAGS += -D'__QAIC_SKEL_EXPORT=__attribute__((visibility("default")))'
489695b7bc89781c40aeb545ac0e879ff063590bf0Andrew Rossignol
49cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# This code is loaded into a dynamic module. Define this symbol in the event
50cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# that any Qualcomm code needs it.
51cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew RossignolTARGET_CFLAGS += -D__V_DYNAMIC__
52cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
53b9d199936165f42ac7e7eabac1bdb4968d938f4fBrian Duddie# This flag is used by some QC-supplied code to differentiate things intended to
54b9d199936165f42ac7e7eabac1bdb4968d938f4fBrian Duddie# run on Hexagon vs. other architectures
55b9d199936165f42ac7e7eabac1bdb4968d938f4fBrian DuddieTARGET_CFLAGS += -DQDSP6
56b9d199936165f42ac7e7eabac1bdb4968d938f4fBrian Duddie
57f5ea59c5ffcf5d41995f81cee2ae31639f666bd9Andrew Rossignol# Hexagon Shared Object Linker Flags ###########################################
58cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
59548ffded9d7e5f6385c67b0184779a062b53f146Andrew RossignolTARGET_SO_LDFLAGS += --gc-sections
60f5ea59c5ffcf5d41995f81cee2ae31639f666bd9Andrew RossignolTARGET_SO_LDFLAGS += -shared
61f5ea59c5ffcf5d41995f81cee2ae31639f666bd9Andrew RossignolTARGET_SO_LDFLAGS += -call_shared
62ac0b5a00a6d379e13f08b6b034d3fb7c16733281Andrew RossignolTARGET_SO_LDFLAGS += -Bsymbolic
63ac0b5a00a6d379e13f08b6b034d3fb7c16733281Andrew RossignolTARGET_SO_LDFLAGS += --wrap=malloc
64ac0b5a00a6d379e13f08b6b034d3fb7c16733281Andrew RossignolTARGET_SO_LDFLAGS += --wrap=calloc
65ac0b5a00a6d379e13f08b6b034d3fb7c16733281Andrew RossignolTARGET_SO_LDFLAGS += --wrap=free
66ac0b5a00a6d379e13f08b6b034d3fb7c16733281Andrew RossignolTARGET_SO_LDFLAGS += --wrap=realloc
67ac0b5a00a6d379e13f08b6b034d3fb7c16733281Andrew RossignolTARGET_SO_LDFLAGS += --wrap=memalign
68ac0b5a00a6d379e13f08b6b034d3fb7c16733281Andrew RossignolTARGET_SO_LDFLAGS += --wrap=__stack_chk_fail
696311392f838833110fe70be5e231785c8b145536Andrew RossignolTARGET_SO_LDFLAGS += --no-threads
70ac0b5a00a6d379e13f08b6b034d3fb7c16733281Andrew Rossignol
71ac0b5a00a6d379e13f08b6b034d3fb7c16733281Andrew RossignolHEXAGON_LIB_PATH = $(HEXAGON_TOOLS_PREFIX)/Tools/target/hexagon/lib
72ac0b5a00a6d379e13f08b6b034d3fb7c16733281Andrew RossignolTARGET_SO_EARLY_LIBS += $(HEXAGON_LIB_PATH)/$(HEXAGON_ARCH)/G0/pic/initS.o
73ac0b5a00a6d379e13f08b6b034d3fb7c16733281Andrew RossignolTARGET_SO_LATE_LIBS += $(HEXAGON_LIB_PATH)/$(HEXAGON_ARCH)/G0/pic/finiS.o
74cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
75cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Supported Hexagon Architectures ##############################################
76cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
77f8ade8e40280498ec008556a02cb1720b8402530Alexey PolyudovHEXAGON_SUPPORTED_ARCHS = v55 v60 v62 v65
78cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
79cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Environment Checks ###########################################################
80cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
81cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Ensure that an architecture is chosen.
82cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignolifeq ($(filter $(HEXAGON_ARCH), $(HEXAGON_SUPPORTED_ARCHS)),)
83cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol$(error "The HEXAGON_ARCH variable must be set to a supported architecture \
84cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol         ($(HEXAGON_SUPPORTED_ARCHS))")
85cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignolendif
86cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
87cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Target Architecture ##########################################################
88cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
89cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Set the Hexagon architecture.
90cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew RossignolTARGET_CFLAGS += -m$(strip $(HEXAGON_ARCH))
91cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
92cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Optimization Level ###########################################################
93cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
94cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew RossignolTARGET_CFLAGS += -O$(OPT_LEVEL)
95cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
96cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# TODO: Consider disabling this when compiling for >-O0.
97cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew RossignolTARGET_CFLAGS += -D_DEBUG
98cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
99cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol# Variant Specific Sources #####################################################
100cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew Rossignol
101cb0ca9cfdfa880d56d8ce90422a761e61b677cbcAndrew RossignolTARGET_VARIANT_SRCS += $(HEXAGON_SRCS)
102