Home | History | Annotate | Download | only in cc
      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 
     15 package cc
     16 
     17 import (
     18 	"strings"
     19 
     20 	"android/soong/common"
     21 )
     22 
     23 var (
     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 
     85 const (
     86 	mips64GccVersion = "4.9"
     87 )
     88 
     89 func 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 
    128 type toolchainMips64 struct {
    129 	toolchain64Bit
    130 	cflags, clangCflags                   string
    131 	toolchainCflags, toolchainClangCflags string
    132 }
    133 
    134 func (t *toolchainMips64) Name() string {
    135 	return "mips64"
    136 }
    137 
    138 func (t *toolchainMips64) GccRoot() string {
    139 	return "${mips64GccRoot}"
    140 }
    141 
    142 func (t *toolchainMips64) GccTriple() string {
    143 	return "${mips64GccTriple}"
    144 }
    145 
    146 func (t *toolchainMips64) GccVersion() string {
    147 	return mips64GccVersion
    148 }
    149 
    150 func (t *toolchainMips64) ToolchainLdflags() string {
    151 	return ""
    152 }
    153 
    154 func (t *toolchainMips64) ToolchainCflags() string {
    155 	return t.toolchainCflags
    156 }
    157 
    158 func (t *toolchainMips64) Cflags() string {
    159 	return t.cflags
    160 }
    161 
    162 func (t *toolchainMips64) Cppflags() string {
    163 	return "${mips64Cppflags}"
    164 }
    165 
    166 func (t *toolchainMips64) Ldflags() string {
    167 	return "${mips64Ldflags}"
    168 }
    169 
    170 func (t *toolchainMips64) IncludeFlags() string {
    171 	return "${mips64IncludeFlags}"
    172 }
    173 
    174 func (t *toolchainMips64) ClangTriple() string {
    175 	return "${mips64ClangTriple}"
    176 }
    177 
    178 func (t *toolchainMips64) ToolchainClangCflags() string {
    179 	return t.toolchainClangCflags
    180 }
    181 
    182 func (t *toolchainMips64) ClangCflags() string {
    183 	return t.clangCflags
    184 }
    185 
    186 func (t *toolchainMips64) ClangCppflags() string {
    187 	return "${mips64ClangCppflags}"
    188 }
    189 
    190 func (t *toolchainMips64) ClangLdflags() string {
    191 	return "${mips64ClangLdflags}"
    192 }
    193 
    194 func 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 
    203 func init() {
    204 	registerDeviceToolchainFactory(common.Mips64, mips64ToolchainFactory)
    205 }
    206