Home | History | Annotate | Download | only in config
      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 config
     16 
     17 import (
     18 	"strings"
     19 
     20 	"android/soong/android"
     21 )
     22 
     23 var (
     24 	x86Cflags = []string{
     25 		"-fno-exceptions", // from build/core/combo/select.mk
     26 		"-Wno-multichar",  // from build/core/combo/select.mk
     27 		"-O2",
     28 		"-Wa,--noexecstack",
     29 		"-Werror=format-security",
     30 		"-D_FORTIFY_SOURCE=2",
     31 		"-Wstrict-aliasing=2",
     32 		"-ffunction-sections",
     33 		"-finline-functions",
     34 		"-finline-limit=300",
     35 		"-fno-short-enums",
     36 		"-fstrict-aliasing",
     37 		"-funswitch-loops",
     38 		"-funwind-tables",
     39 		"-fstack-protector-strong",
     40 		"-no-canonical-prefixes",
     41 		"-fno-canonical-system-headers",
     42 
     43 		// TARGET_RELEASE_CFLAGS from build/core/combo/select.mk
     44 		"-O2",
     45 		"-g",
     46 		"-fno-strict-aliasing",
     47 	}
     48 
     49 	x86ClangCflags = append(x86Cflags, []string{
     50 		"-msse3",
     51 
     52 		// -mstackrealign is needed to realign stack in native code
     53 		// that could be called from JNI, so that movaps instruction
     54 		// will work on assumed stack aligned local variables.
     55 		"-mstackrealign",
     56 	}...)
     57 
     58 	x86Cppflags = []string{}
     59 
     60 	x86Ldflags = []string{
     61 		"-Wl,-z,noexecstack",
     62 		"-Wl,-z,relro",
     63 		"-Wl,-z,now",
     64 		"-Wl,--build-id=md5",
     65 		"-Wl,--warn-shared-textrel",
     66 		"-Wl,--fatal-warnings",
     67 		"-Wl,--gc-sections",
     68 		"-Wl,--hash-style=gnu",
     69 		"-Wl,--no-undefined-version",
     70 	}
     71 
     72 	x86ArchVariantCflags = map[string][]string{
     73 		"": []string{
     74 			"-march=prescott",
     75 		},
     76 		"x86_64": []string{
     77 			"-march=prescott",
     78 		},
     79 		"atom": []string{
     80 			"-march=atom",
     81 			"-mfpmath=sse",
     82 		},
     83 		"haswell": []string{
     84 			"-march=core-avx2",
     85 			"-mfpmath=sse",
     86 		},
     87 		"ivybridge": []string{
     88 			"-march=core-avx-i",
     89 			"-mfpmath=sse",
     90 		},
     91 		"sandybridge": []string{
     92 			"-march=corei7",
     93 			"-mfpmath=sse",
     94 		},
     95 		"silvermont": []string{
     96 			"-march=slm",
     97 			"-mfpmath=sse",
     98 		},
     99 	}
    100 
    101 	x86ArchFeatureCflags = map[string][]string{
    102 		"ssse3":  []string{"-DUSE_SSSE3", "-mssse3"},
    103 		"sse4":   []string{"-msse4"},
    104 		"sse4_1": []string{"-msse4.1"},
    105 		"sse4_2": []string{"-msse4.2"},
    106 		"avx":    []string{"-mavx"},
    107 		"aes_ni": []string{"-maes"},
    108 	}
    109 )
    110 
    111 const (
    112 	x86GccVersion = "4.9"
    113 )
    114 
    115 func init() {
    116 	android.RegisterArchVariants(android.X86,
    117 		"atom",
    118 		"haswell",
    119 		"ivybridge",
    120 		"sandybridge",
    121 		"silvermont",
    122 		"x86_64")
    123 	android.RegisterArchFeatures(android.X86,
    124 		"ssse3",
    125 		"sse4",
    126 		"sse4_1",
    127 		"sse4_2",
    128 		"aes_ni",
    129 		"avx",
    130 		"popcnt",
    131 		"movbe")
    132 	android.RegisterArchVariantFeatures(android.X86, "x86_64",
    133 		"ssse3",
    134 		"sse4",
    135 		"sse4_1",
    136 		"sse4_2",
    137 		"popcnt")
    138 	android.RegisterArchVariantFeatures(android.X86, "atom",
    139 		"ssse3",
    140 		"movbe")
    141 	android.RegisterArchVariantFeatures(android.X86, "haswell",
    142 		"ssse3",
    143 		"sse4",
    144 		"sse4_1",
    145 		"sse4_2",
    146 		"aes_ni",
    147 		"avx",
    148 		"popcnt",
    149 		"movbe")
    150 	android.RegisterArchVariantFeatures(android.X86, "ivybridge",
    151 		"ssse3",
    152 		"sse4",
    153 		"sse4_1",
    154 		"sse4_2",
    155 		"aes_ni",
    156 		"avx",
    157 		"popcnt")
    158 	android.RegisterArchVariantFeatures(android.X86, "sandybridge",
    159 		"ssse3",
    160 		"sse4",
    161 		"sse4_1",
    162 		"sse4_2",
    163 		"popcnt")
    164 	android.RegisterArchVariantFeatures(android.X86, "silvermont",
    165 		"ssse3",
    166 		"sse4",
    167 		"sse4_1",
    168 		"sse4_2",
    169 		"aes_ni",
    170 		"popcnt",
    171 		"movbe")
    172 
    173 	pctx.StaticVariable("x86GccVersion", x86GccVersion)
    174 
    175 	pctx.SourcePathVariable("X86GccRoot",
    176 		"prebuilts/gcc/${HostPrebuiltTag}/x86/x86_64-linux-android-${x86GccVersion}")
    177 
    178 	pctx.StaticVariable("X86ToolchainCflags", "-m32")
    179 	pctx.StaticVariable("X86ToolchainLdflags", "-m32")
    180 
    181 	pctx.StaticVariable("X86Cflags", strings.Join(x86Cflags, " "))
    182 	pctx.StaticVariable("X86Ldflags", strings.Join(x86Ldflags, " "))
    183 	pctx.StaticVariable("X86Cppflags", strings.Join(x86Cppflags, " "))
    184 	pctx.StaticVariable("X86IncludeFlags", bionicHeaders("x86", "x86"))
    185 
    186 	// Clang cflags
    187 	pctx.StaticVariable("X86ClangCflags", strings.Join(ClangFilterUnknownCflags(x86ClangCflags), " "))
    188 	pctx.StaticVariable("X86ClangLdflags", strings.Join(ClangFilterUnknownCflags(x86Ldflags), " "))
    189 	pctx.StaticVariable("X86ClangCppflags", strings.Join(ClangFilterUnknownCflags(x86Cppflags), " "))
    190 
    191 	// Yasm flags
    192 	pctx.StaticVariable("X86YasmFlags", "-f elf32 -m x86")
    193 
    194 	// Extended cflags
    195 
    196 	// Architecture variant cflags
    197 	for variant, cflags := range x86ArchVariantCflags {
    198 		pctx.StaticVariable("X86"+variant+"VariantCflags", strings.Join(cflags, " "))
    199 		pctx.StaticVariable("X86"+variant+"VariantClangCflags",
    200 			strings.Join(ClangFilterUnknownCflags(cflags), " "))
    201 	}
    202 }
    203 
    204 type toolchainX86 struct {
    205 	toolchain32Bit
    206 	toolchainCflags, toolchainClangCflags string
    207 }
    208 
    209 func (t *toolchainX86) Name() string {
    210 	return "x86"
    211 }
    212 
    213 func (t *toolchainX86) GccRoot() string {
    214 	return "${config.X86GccRoot}"
    215 }
    216 
    217 func (t *toolchainX86) GccTriple() string {
    218 	return "x86_64-linux-android"
    219 }
    220 
    221 func (t *toolchainX86) GccVersion() string {
    222 	return x86GccVersion
    223 }
    224 
    225 func (t *toolchainX86) ToolchainLdflags() string {
    226 	return "${config.X86ToolchainLdflags}"
    227 }
    228 
    229 func (t *toolchainX86) ToolchainCflags() string {
    230 	return t.toolchainCflags
    231 }
    232 
    233 func (t *toolchainX86) Cflags() string {
    234 	return "${config.X86Cflags}"
    235 }
    236 
    237 func (t *toolchainX86) Cppflags() string {
    238 	return "${config.X86Cppflags}"
    239 }
    240 
    241 func (t *toolchainX86) Ldflags() string {
    242 	return "${config.X86Ldflags}"
    243 }
    244 
    245 func (t *toolchainX86) IncludeFlags() string {
    246 	return "${config.X86IncludeFlags}"
    247 }
    248 
    249 func (t *toolchainX86) ClangTriple() string {
    250 	return "i686-linux-android"
    251 }
    252 
    253 func (t *toolchainX86) ToolchainClangLdflags() string {
    254 	return "${config.X86ToolchainLdflags}"
    255 }
    256 
    257 func (t *toolchainX86) ToolchainClangCflags() string {
    258 	return t.toolchainClangCflags
    259 }
    260 
    261 func (t *toolchainX86) ClangCflags() string {
    262 	return "${config.X86ClangCflags}"
    263 }
    264 
    265 func (t *toolchainX86) ClangCppflags() string {
    266 	return "${config.X86ClangCppflags}"
    267 }
    268 
    269 func (t *toolchainX86) ClangLdflags() string {
    270 	return "${config.X86Ldflags}"
    271 }
    272 
    273 func (t *toolchainX86) YasmFlags() string {
    274 	return "${config.X86YasmFlags}"
    275 }
    276 
    277 func (toolchainX86) SanitizerRuntimeLibraryArch() string {
    278 	return "i686"
    279 }
    280 
    281 func x86ToolchainFactory(arch android.Arch) Toolchain {
    282 	toolchainCflags := []string{
    283 		"${config.X86ToolchainCflags}",
    284 		"${config.X86" + arch.ArchVariant + "VariantCflags}",
    285 	}
    286 
    287 	toolchainClangCflags := []string{
    288 		"${config.X86ToolchainCflags}",
    289 		"${config.X86" + arch.ArchVariant + "VariantClangCflags}",
    290 	}
    291 
    292 	for _, feature := range arch.ArchFeatures {
    293 		toolchainCflags = append(toolchainCflags, x86ArchFeatureCflags[feature]...)
    294 		toolchainClangCflags = append(toolchainClangCflags, x86ArchFeatureCflags[feature]...)
    295 	}
    296 
    297 	return &toolchainX86{
    298 		toolchainCflags:      strings.Join(toolchainCflags, " "),
    299 		toolchainClangCflags: strings.Join(toolchainClangCflags, " "),
    300 	}
    301 }
    302 
    303 func init() {
    304 	registerToolchainFactory(android.Android, android.X86, x86ToolchainFactory)
    305 }
    306