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 	"fmt"
     19 	"strings"
     20 
     21 	"android/soong/android"
     22 )
     23 
     24 var (
     25 	arm64Cflags = []string{
     26 		"-fno-exceptions", // from build/core/combo/select.mk
     27 		"-Wno-multichar",  // from build/core/combo/select.mk
     28 		"-fno-strict-aliasing",
     29 		"-fstack-protector-strong",
     30 		"-ffunction-sections",
     31 		"-fdata-sections",
     32 		"-funwind-tables",
     33 		"-Wa,--noexecstack",
     34 		"-Werror=format-security",
     35 		"-D_FORTIFY_SOURCE=2",
     36 		"-fno-short-enums",
     37 		"-no-canonical-prefixes",
     38 		"-fno-canonical-system-headers",
     39 
     40 		// Help catch common 32/64-bit errors.
     41 		"-Werror=pointer-to-int-cast",
     42 		"-Werror=int-to-pointer-cast",
     43 		"-Werror=implicit-function-declaration",
     44 
     45 		"-fno-strict-volatile-bitfields",
     46 
     47 		// TARGET_RELEASE_CFLAGS
     48 		"-DNDEBUG",
     49 		"-O2 -g",
     50 		"-Wstrict-aliasing=2",
     51 		"-fgcse-after-reload",
     52 		"-frerun-cse-after-loop",
     53 		"-frename-registers",
     54 	}
     55 
     56 	arm64Ldflags = []string{
     57 		"-Wl,-z,noexecstack",
     58 		"-Wl,-z,relro",
     59 		"-Wl,-z,now",
     60 		"-Wl,--build-id=md5",
     61 		"-Wl,--warn-shared-textrel",
     62 		"-Wl,--fatal-warnings",
     63 		"-Wl,-maarch64linux",
     64 		"-Wl,--hash-style=gnu",
     65 		"-Wl,--fix-cortex-a53-843419",
     66 		"-fuse-ld=gold",
     67 		"-Wl,--icf=safe",
     68 		"-Wl,--no-undefined-version",
     69 	}
     70 
     71 	arm64Cppflags = []string{
     72 		"-fvisibility-inlines-hidden",
     73 	}
     74 
     75 	arm64CpuVariantCflags = map[string][]string{
     76 		"cortex-a53": []string{
     77 			"-mcpu=cortex-a53",
     78 		},
     79 	}
     80 
     81 	arm64ClangCpuVariantCflags = copyVariantFlags(arm64CpuVariantCflags)
     82 )
     83 
     84 const (
     85 	arm64GccVersion = "4.9"
     86 )
     87 
     88 func init() {
     89 	android.RegisterArchVariants(android.Arm64,
     90 		"armv8_a",
     91 		"cortex_a53",
     92 		"denver64")
     93 
     94 	pctx.StaticVariable("arm64GccVersion", arm64GccVersion)
     95 
     96 	pctx.SourcePathVariable("Arm64GccRoot",
     97 		"prebuilts/gcc/${HostPrebuiltTag}/aarch64/aarch64-linux-android-${arm64GccVersion}")
     98 
     99 	pctx.StaticVariable("Arm64Cflags", strings.Join(arm64Cflags, " "))
    100 	pctx.StaticVariable("Arm64Ldflags", strings.Join(arm64Ldflags, " "))
    101 	pctx.StaticVariable("Arm64Cppflags", strings.Join(arm64Cppflags, " "))
    102 	pctx.StaticVariable("Arm64IncludeFlags", bionicHeaders("arm64", "arm64"))
    103 
    104 	pctx.StaticVariable("Arm64ClangCflags", strings.Join(ClangFilterUnknownCflags(arm64Cflags), " "))
    105 	pctx.StaticVariable("Arm64ClangLdflags", strings.Join(ClangFilterUnknownCflags(arm64Ldflags), " "))
    106 	pctx.StaticVariable("Arm64ClangCppflags", strings.Join(ClangFilterUnknownCflags(arm64Cppflags), " "))
    107 
    108 	pctx.StaticVariable("Arm64CortexA53Cflags",
    109 		strings.Join(arm64CpuVariantCflags["cortex-a53"], " "))
    110 	pctx.StaticVariable("Arm64ClangCortexA53Cflags",
    111 		strings.Join(arm64ClangCpuVariantCflags["cortex-a53"], " "))
    112 }
    113 
    114 var (
    115 	arm64CpuVariantCflagsVar = map[string]string{
    116 		"":           "",
    117 		"cortex-a53": "${config.Arm64CortexA53Cflags}",
    118 	}
    119 
    120 	arm64ClangCpuVariantCflagsVar = map[string]string{
    121 		"":           "",
    122 		"cortex-a53": "${config.Arm64ClangCortexA53Cflags}",
    123 	}
    124 )
    125 
    126 type toolchainArm64 struct {
    127 	toolchain64Bit
    128 
    129 	toolchainCflags      string
    130 	toolchainClangCflags string
    131 }
    132 
    133 func (t *toolchainArm64) Name() string {
    134 	return "arm64"
    135 }
    136 
    137 func (t *toolchainArm64) GccRoot() string {
    138 	return "${config.Arm64GccRoot}"
    139 }
    140 
    141 func (t *toolchainArm64) GccTriple() string {
    142 	return "aarch64-linux-android"
    143 }
    144 
    145 func (t *toolchainArm64) GccVersion() string {
    146 	return arm64GccVersion
    147 }
    148 
    149 func (t *toolchainArm64) ToolchainCflags() string {
    150 	return t.toolchainCflags
    151 }
    152 
    153 func (t *toolchainArm64) Cflags() string {
    154 	return "${config.Arm64Cflags}"
    155 }
    156 
    157 func (t *toolchainArm64) Cppflags() string {
    158 	return "${config.Arm64Cppflags}"
    159 }
    160 
    161 func (t *toolchainArm64) Ldflags() string {
    162 	return "${config.Arm64Ldflags}"
    163 }
    164 
    165 func (t *toolchainArm64) IncludeFlags() string {
    166 	return "${config.Arm64IncludeFlags}"
    167 }
    168 
    169 func (t *toolchainArm64) ClangTriple() string {
    170 	return t.GccTriple()
    171 }
    172 
    173 func (t *toolchainArm64) ClangCflags() string {
    174 	return "${config.Arm64ClangCflags}"
    175 }
    176 
    177 func (t *toolchainArm64) ClangCppflags() string {
    178 	return "${config.Arm64ClangCppflags}"
    179 }
    180 
    181 func (t *toolchainArm64) ClangLdflags() string {
    182 	return "${config.Arm64Ldflags}"
    183 }
    184 
    185 func (t *toolchainArm64) ToolchainClangCflags() string {
    186 	return t.toolchainClangCflags
    187 }
    188 
    189 func (toolchainArm64) SanitizerRuntimeLibraryArch() string {
    190 	return "aarch64"
    191 }
    192 
    193 func arm64ToolchainFactory(arch android.Arch) Toolchain {
    194 	if arch.ArchVariant != "armv8-a" {
    195 		panic(fmt.Sprintf("Unknown ARM architecture version: %q", arch.ArchVariant))
    196 	}
    197 
    198 	return &toolchainArm64{
    199 		toolchainCflags:      variantOrDefault(arm64CpuVariantCflagsVar, arch.CpuVariant),
    200 		toolchainClangCflags: variantOrDefault(arm64ClangCpuVariantCflagsVar, arch.CpuVariant),
    201 	}
    202 }
    203 
    204 func init() {
    205 	registerToolchainFactory(android.Android, android.Arm64, arm64ToolchainFactory)
    206 }
    207