summaryrefslogtreecommitdiff
path: root/scripts/build/arch/sh.sh
blob: 1911b200e8f61a0524f5b23c144e326eac26742b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# Compute sh-specific values

CT_DoArchTupleValues () {
    # The architecture part of the tuple:
    CT_TARGET_ARCH="${CT_ARCH_SH_VARIANT}${CT_ARCH_SUFFIX:-${target_endian_eb}}"

    # Endianness stuff (uses non-standard CFLAGS). If both are compiled, let the
    # compiler's default or multilib iterator be used.
    case "${CT_ARCH_ENDIAN}" in
        big)    CT_ARCH_ENDIAN_CFLAG=-mb;;
        little) CT_ARCH_ENDIAN_CFLAG=-ml;;
    esac

    # Instead of -m{soft,hard}-float, uses CPU type
    CT_ARCH_FLOAT_CFLAG=
    case "${CT_ARCH_SH_VARIANT}" in
        sh3)    CT_ARCH_ARCH_CFLAG=-m3;;
        sh4*|sh2*)
            # softfp is not possible for SuperH, no need to test for it.
            case "${CT_ARCH_FLOAT}" in
                hard)
                    CT_ARCH_ARCH_CFLAG="-m${CT_ARCH_SH_VARIANT##sh}"
                    ;;
                soft)
                    CT_ARCH_ARCH_CFLAG="-m${CT_ARCH_SH_VARIANT##sh}-nofpu"
                    ;;
            esac
            ;;
    esac
}

CT_DoArchMultilibList() {
    local save_ifs="${IFS}"
    local new
    local x

    # In a configuration for SuperH, GCC list of multilibs shall not include
    # the default CPU. E.g. if configuring for sh4-*-*, we need to remove
    # "sh4" or "m4" from the multilib list. Otherwise, the resulting compiler
    # will fail when that CPU is selected explicitly "sh4-multilib-linux-gnu-gcc -m4 ..."
    # as it will fail to find the sysroot with that suffix. This applies to both
    # the CPU type inferred from the target tuple (CT_ARCH_SH_VARIANT) as well as
    # the default CPU configured with --with-cpu (CT_ARCH_CPU).
    IFS=,
    for x in ${CT_CC_GCC_MULTILIB_LIST}; do
        if [ "${x}" = "${CT_ARCH_SH_VARIANT}" -o "sh${x#m}" = "${CT_ARCH_SH_VARIANT}" ]; then
            CT_DoLog WARN "Ignoring '${x}' in multilib list: it is the default multilib"
            continue
        fi
        if [ "${x}" = "${CT_ARCH_CPU}" -o "sh${x#m}" = "${CT_ARCH_CPU}" ]; then
            CT_DoLog WARN "Ignoring '${x}' in multilib list: it is the default multilib"
            continue
        fi
        new="${new:+${new},}${x}"
    done
    IFS="${save_ifs}"
    CT_CC_GCC_MULTILIB_LIST="${new}"
    CT_DoLog DEBUG "Adjusted CT_CC_GCC_MULTILIB_LIST to '${CT_CC_GCC_MULTILIB_LIST}'"
}

#------------------------------------------------------------------------------
# Get multilib architecture-specific target
# Usage: CT_DoArchMultilibTarget "target variable" "multilib flags"
CT_DoArchMultilibTarget ()
{
    local target_var="${1}"; shift
    local -a multi_flags=( "$@" )
    local target_
    local newcpu

    for m in "${multi_flags[@]}"; do
        case "${m}" in
            -m4*) newcpu=sh4;;
            -m3*) newcpu=sh3;;
            -m2*) newcpu=sh2;;
            -m1*) newcpu=sh1;;
        esac
    done

    eval target_=\"\${${target_var}}\"

    # Strip CPU name and append the new one if an option has been seen.
    if [ -n "${newcpu}" ]; then
        target_="${newcpu}-${target_#*-}"
    fi

    # Set the target variable
    eval ${target_var}=\"${target_}\"
}

# Adjust target tuple for GLIBC
CT_DoArchGlibcAdjustTuple() {
    local target_var="${1}"
    local target_

    eval target_=\"\${${target_var}}\"

    case "${target_}" in
        sh-*)
            # Glibc does not build unless configured with 'shX-*' tuple.
            # Since we ended up here, no architecture variant has been
            # specified, so the only source of default is CT_ARCH_CPU.
            # GCC defaults to sh1, but this Glibc cannot compile for it.
            if [ -n "${CT_ARCH_CPU}" ]; then
                target_=${target_/#sh-/${CT_ARCH_CPU}-}
                CT_DoLog DEBUG "Adjusted target tuple ${target_}"
            else
                CT_Abort "GNU C library cannot build for sh1 (GCC default). " \
                        "Specify architecture variant or the default CPU type."
            fi
            ;;
    esac

    # Set the target variable
    eval ${target_var}=\"${target_}\"
}

# Multilib: Adjust configure arguments for GLIBC
# Usage: CT_DoArchGlibcAdjustConfigure <configure-args-array-name> <cflags>
CT_DoArchGlibcAdjustConfigure() {
    local -a add_args
    local array="${1}"
    local cflags="${2}"
    local opt

    for opt in ${cflags}; do
        case "${opt}" in
        -m[1-5]*-nofpu)
            add_args+=( "--without-fp" )
            ;;
        -m[1-5]*)
            add_args+=( "--with-fp" )
            ;;
        esac
    done

    # If architecture variant was specified, we'd have CT_ARCH_ARCH_CFLAG
    # and it would've been handled above. Our last resort: CT_ARCH_CPU
    if [ "${#add_args[@]}" = 0 ]; then
        case "${CT_ARCH_CPU}" in
        sh[34]*-nofpu)
            add_args+=( "--without-fp" )
            ;;
        sh[34]*)
            add_args+=( "--with-fp" )
            ;;
        esac
    fi

    eval "${array}+=( \"\${add_args[@]}\" )"
}

CT_DoArchUClibcConfig() {
    local cfg="${1}"

    CT_DoArchUClibcSelectArch "${cfg}" "sh"
    CT_KconfigDisableOption "CONFIG_SH2" "${cfg}"
    CT_KconfigDisableOption "CONFIG_SH2A" "${cfg}"
    CT_KconfigDisableOption "CONFIG_SH3" "${cfg}"
    CT_KconfigDisableOption "CONFIG_SH4" "${cfg}"
    CT_KconfigDisableOption "CONFIG_SH4A" "${cfg}"
    case "${CT_ARCH_SH_VARIANT}" in
        sh2) CT_KconfigEnableOption "CONFIG_SH2" "${cfg}";;
        sh2a) CT_KconfigEnableOption "CONFIG_SH2A" "${cfg}";;
        sh3) CT_KconfigEnableOption "CONFIG_SH3" "${cfg}";;
        sh4) CT_KconfigEnableOption "CONFIG_SH4" "${cfg}";;
        sh4a) CT_KconfigEnableOption "CONFIG_SH4A" "${cfg}";;
    esac
}

CT_DoArchUClibcCflags() {
    local cfg="${1}"
    local cflags="${2}"
    local f

    for f in ${cflags}; do
        case "${f}" in
        -ml)
            CT_KconfigDisableOption "ARCH_BIG_ENDIAN" "${dst}"
            CT_KconfigDisableOption "ARCH_WANTS_BIG_ENDIAN" "${dst}"
            CT_KconfigEnableOption "ARCH_LITTLE_ENDIAN" "${dst}"
            CT_KconfigEnableOption "ARCH_WANTS_LITTLE_ENDIAN" "${dst}"
            ;;
        -mb)
            CT_KconfigEnableOption "ARCH_BIG_ENDIAN" "${dst}"
            CT_KconfigEnableOption "ARCH_WANTS_BIG_ENDIAN" "${dst}"
            CT_KconfigDisableOption "ARCH_LITTLE_ENDIAN" "${dst}"
            CT_KconfigDisableOption "ARCH_WANTS_LITTLE_ENDIAN" "${dst}"
            ;;
        -m2|-m2a|-m2a-nofpu|-m3|-m4|-m4-nofpu|-m4a|-m4a-nofpu)
            CT_KconfigDisableOption "CONFIG_SH2" "${cfg}"
            CT_KconfigDisableOption "CONFIG_SH2A" "${cfg}"
            CT_KconfigDisableOption "CONFIG_SH3" "${cfg}"
            CT_KconfigDisableOption "CONFIG_SH4" "${cfg}"
            CT_KconfigDisableOption "CONFIG_SH4A" "${cfg}"
            CT_KconfigDisableOption "UCLIBC_HAS_FPU" "${cfg}"
            case "${f}" in
            -m2)
                CT_KconfigEnableOption "CONFIG_SH2" "${cfg}"
                ;;
            -m2a)
                CT_KconfigEnableOption "CONFIG_SH2A" "${cfg}"
                CT_KconfigEnableOption "UCLIBC_HAS_FPU" "${cfg}"
                ;;
            -m2a-nofpu)
                CT_KconfigEnableOption "CONFIG_SH2A" "${cfg}"
                ;;
            -m3)
                CT_KconfigEnableOption "CONFIG_SH3" "${cfg}"
                ;;
            -m4)
                CT_KconfigEnableOption "CONFIG_SH4" "${cfg}"
                CT_KconfigEnableOption "UCLIBC_HAS_FPU" "${cfg}"
                ;;
            -m4-nofpu)
                CT_KconfigEnableOption "CONFIG_SH4" "${cfg}"
                ;;
            -m4a)
                CT_KconfigEnableOption "CONFIG_SH4A" "${cfg}"
                CT_KconfigEnableOption "UCLIBC_HAS_FPU" "${cfg}"
                ;;
            -m4a-nofpu)
                CT_KconfigEnableOption "CONFIG_SH4A" "${cfg}"
                ;;
            esac
            ;;
        esac
    done
}