From c702ebd886fde17cea33a9f2af8b5881bd68f1d0 Mon Sep 17 00:00:00 2001 From: Yi Kong Date: Fri, 19 Aug 2022 16:02:45 +0800 Subject: [PATCH] Do not enable ThinLTO for CFI enabled projects CFI projects already use full LTO. Test: GLOBAL_THINLTO=true m Change-Id: I8a57efc237aed977f57dd4040500cc5f84843c3d --- cc/cc.go | 12 ++++++++++++ cc/lto.go | 10 ++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/cc/cc.go b/cc/cc.go index c71fb347c..336771a83 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -514,6 +514,7 @@ type ModuleContextIntf interface { getVndkExtendsModuleName() string isAfdoCompile() bool isPgoCompile() bool + isCfi() bool isNDKStubLibrary() bool useClangLld(actx ModuleContext) bool isForPlatform() bool @@ -1314,6 +1315,13 @@ func (c *Module) isPgoCompile() bool { return false } +func (c *Module) isCfi() bool { + if sanitize := c.sanitize; sanitize != nil { + return Bool(sanitize.Properties.Sanitize.Cfi) + } + return false +} + func (c *Module) isNDKStubLibrary() bool { if _, ok := c.compiler.(*stubDecorator); ok { return true @@ -1592,6 +1600,10 @@ func (ctx *moduleContextImpl) isPgoCompile() bool { return ctx.mod.isPgoCompile() } +func (ctx *moduleContextImpl) isCfi() bool { + return ctx.mod.isCfi() +} + func (ctx *moduleContextImpl) isNDKStubLibrary() bool { return ctx.mod.isNDKStubLibrary() } diff --git a/cc/lto.go b/cc/lto.go index 1da69bf16..455ff7edc 100644 --- a/cc/lto.go +++ b/cc/lto.go @@ -136,10 +136,16 @@ func (lto *lto) LTO(ctx BaseModuleContext) bool { } func (lto *lto) DefaultThinLTO(ctx BaseModuleContext) bool { + // LP32 has many subtle issues and less test coverage. lib32 := ctx.Arch().ArchType.Multilib == "lib32" + // CFI enables full LTO. + cfi := ctx.isCfi() + // Performance and binary size are less important for host binaries. host := ctx.Host() - vndk := ctx.isVndk() // b/169217596 - return GlobalThinLTO(ctx) && !lto.Never() && !lib32 && !host && !vndk + // FIXME: ThinLTO for VNDK produces different output. + // b/169217596 + vndk := ctx.isVndk() + return GlobalThinLTO(ctx) && !lto.Never() && !lib32 && !cfi && !host && !vndk } func (lto *lto) FullLTO() bool {