1// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17import (
18	"strings"
19
20	"android/soong/common"
21)
22
23var (
24	mips64Cflags = []string{
25		"-fno-exceptions", // from build/core/combo/select.mk
26		"-Wno-multichar",  // from build/core/combo/select.mk
27		"-O2",
28		"-fomit-frame-pointer",
29		"-fno-strict-aliasing",
30		"-funswitch-loops",
31		"-U__unix",
32		"-U__unix__",
33		"-Umips",
34		"-ffunction-sections",
35		"-fdata-sections",
36		"-funwind-tables",
37		"-fstack-protector-strong",
38		"-Wa,--noexecstack",
39		"-Werror=format-security",
40		"-D_FORTIFY_SOURCE=2",
41		"-no-canonical-prefixes",
42		"-fno-canonical-system-headers",
43
44		// Help catch common 32/64-bit errors.
45		"-Werror=pointer-to-int-cast",
46		"-Werror=int-to-pointer-cast",
47		"-Werror=implicit-function-declaration",
48
49		// TARGET_RELEASE_CFLAGS
50		"-DNDEBUG",
51		"-g",
52		"-Wstrict-aliasing=2",
53		"-fgcse-after-reload",
54		"-frerun-cse-after-loop",
55		"-frename-registers",
56	}
57
58	mips64Cppflags = []string{
59		"-fvisibility-inlines-hidden",
60	}
61
62	mips64Ldflags = []string{
63		"-Wl,-z,noexecstack",
64		"-Wl,-z,relro",
65		"-Wl,-z,now",
66		"-Wl,--build-id=md5",
67		"-Wl,--warn-shared-textrel",
68		"-Wl,--fatal-warnings",
69		"-Wl,--allow-shlib-undefined",
70		"-Wl,--no-undefined-version",
71	}
72
73	mips64ArchVariantCflags = map[string][]string{
74		"mips64r2": []string{
75			"-mips64r2",
76			"-msynci",
77		},
78		"mips64r6": []string{
79			"-mips64r6",
80			"-msynci",
81		},
82	}
83)
84
85const (
86	mips64GccVersion = "4.9"
87)
88
89func init() {
90	common.RegisterArchFeatures(common.Mips64, "mips64r6",
91		"rev6")
92
93	pctx.StaticVariable("mips64GccVersion", mips64GccVersion)
94
95	pctx.SourcePathVariable("mips64GccRoot",
96		"prebuilts/gcc/${HostPrebuiltTag}/mips/mips64el-linux-android-${mips64GccVersion}")
97
98	pctx.StaticVariable("mips64GccTriple", "mips64el-linux-android")
99
100	pctx.StaticVariable("mips64Cflags", strings.Join(mips64Cflags, " "))
101	pctx.StaticVariable("mips64Ldflags", strings.Join(mips64Ldflags, " "))
102	pctx.StaticVariable("mips64Cppflags", strings.Join(mips64Cppflags, " "))
103	pctx.StaticVariable("mips64IncludeFlags", strings.Join([]string{
104		"-isystem ${LibcRoot}/arch-mips64/include",
105		"-isystem ${LibcRoot}/include",
106		"-isystem ${LibcRoot}/kernel/uapi",
107		"-isystem ${LibcRoot}/kernel/uapi/asm-mips",
108		"-isystem ${LibmRoot}/include",
109		"-isystem ${LibmRoot}/include/mips",
110	}, " "))
111
112	// Clang cflags
113	pctx.StaticVariable("mips64ClangTriple", "mips64el-linux-android")
114	pctx.StaticVariable("mips64ClangCflags", strings.Join(clangFilterUnknownCflags(mips64Cflags), " "))
115	pctx.StaticVariable("mips64ClangLdflags", strings.Join(clangFilterUnknownCflags(mips64Ldflags), " "))
116	pctx.StaticVariable("mips64ClangCppflags", strings.Join(clangFilterUnknownCflags(mips64Cppflags), " "))
117
118	// Extended cflags
119
120	// Architecture variant cflags
121	for variant, cflags := range mips64ArchVariantCflags {
122		pctx.StaticVariable("mips64"+variant+"VariantCflags", strings.Join(cflags, " "))
123		pctx.StaticVariable("mips64"+variant+"VariantClangCflags",
124			strings.Join(clangFilterUnknownCflags(cflags), " "))
125	}
126}
127
128type toolchainMips64 struct {
129	toolchain64Bit
130	cflags, clangCflags                   string
131	toolchainCflags, toolchainClangCflags string
132}
133
134func (t *toolchainMips64) Name() string {
135	return "mips64"
136}
137
138func (t *toolchainMips64) GccRoot() string {
139	return "${mips64GccRoot}"
140}
141
142func (t *toolchainMips64) GccTriple() string {
143	return "${mips64GccTriple}"
144}
145
146func (t *toolchainMips64) GccVersion() string {
147	return mips64GccVersion
148}
149
150func (t *toolchainMips64) ToolchainLdflags() string {
151	return ""
152}
153
154func (t *toolchainMips64) ToolchainCflags() string {
155	return t.toolchainCflags
156}
157
158func (t *toolchainMips64) Cflags() string {
159	return t.cflags
160}
161
162func (t *toolchainMips64) Cppflags() string {
163	return "${mips64Cppflags}"
164}
165
166func (t *toolchainMips64) Ldflags() string {
167	return "${mips64Ldflags}"
168}
169
170func (t *toolchainMips64) IncludeFlags() string {
171	return "${mips64IncludeFlags}"
172}
173
174func (t *toolchainMips64) ClangTriple() string {
175	return "${mips64ClangTriple}"
176}
177
178func (t *toolchainMips64) ToolchainClangCflags() string {
179	return t.toolchainClangCflags
180}
181
182func (t *toolchainMips64) ClangCflags() string {
183	return t.clangCflags
184}
185
186func (t *toolchainMips64) ClangCppflags() string {
187	return "${mips64ClangCppflags}"
188}
189
190func (t *toolchainMips64) ClangLdflags() string {
191	return "${mips64ClangLdflags}"
192}
193
194func mips64ToolchainFactory(arch common.Arch) Toolchain {
195	return &toolchainMips64{
196		cflags:               "${mips64Cflags}",
197		clangCflags:          "${mips64ClangCflags}",
198		toolchainCflags:      "${mips64" + arch.ArchVariant + "VariantCflags}",
199		toolchainClangCflags: "${mips64" + arch.ArchVariant + "VariantClangCflags}",
200	}
201}
202
203func init() {
204	registerDeviceToolchainFactory(common.Mips64, mips64ToolchainFactory)
205}
206