| // Copyright 2018 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package cc |
| |
| import ( |
| "android/soong/android" |
| ) |
| |
| type XomProperties struct { |
| Xom *bool |
| } |
| |
| type xom struct { |
| Properties XomProperties |
| } |
| |
| func (xom *xom) props() []interface{} { |
| return []interface{}{&xom.Properties} |
| } |
| |
| func (xom *xom) begin(ctx BaseModuleContext) {} |
| |
| func (xom *xom) deps(ctx BaseModuleContext, deps Deps) Deps { |
| return deps |
| } |
| |
| func (xom *xom) flags(ctx ModuleContext, flags Flags) Flags { |
| disableXom := false |
| |
| if !ctx.Config().EnableXOM() || ctx.Config().XOMDisabledForPath(ctx.ModuleDir()) { |
| disableXom = true |
| } |
| |
| if xom.Properties.Xom != nil && !*xom.Properties.Xom { |
| return flags |
| } |
| |
| // If any static dependencies have XOM disabled, we should disable XOM in this module, |
| // the assumption being if it's been explicitly disabled then there's probably incompatible |
| // code in the library which may get pulled in. |
| if !disableXom { |
| ctx.VisitDirectDeps(func(m android.Module) { |
| cc, ok := m.(*Module) |
| if !ok || cc.xom == nil || !cc.static() { |
| return |
| } |
| if cc.xom.Properties.Xom != nil && !*cc.xom.Properties.Xom { |
| disableXom = true |
| return |
| } |
| }) |
| } |
| |
| // Enable execute-only if none of the dependencies disable it, |
| // also if it's explicitly set true (allows overriding dependencies disabling it). |
| if !disableXom || (xom.Properties.Xom != nil && *xom.Properties.Xom) { |
| // XOM is only supported on AArch64 when using lld. |
| if ctx.Arch().ArchType == android.Arm64 && ctx.useClangLld(ctx) { |
| flags.Local.LdFlags = append(flags.Local.LdFlags, |
| "-Wl,--execute-only", |
| "-Wl,-z,separate-code", |
| ) |
| } |
| } |
| |
| return flags |
| } |