From 2a5c3315169ca5f23c64838948e2373a2ba6ca94 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Mon, 29 Oct 2018 14:04:55 +0100 Subject: [PATCH] compiler: assume external functions don't let pointers escape Assume any external function won't let pointers live longer than the call itself. This is true in the vast majority of cases (apparently everywhere currently) but might not always be true. TODO: add a //go:noescape (or maybe //go:escape) to handle this, instead of this assumption. --- compiler/optimizer.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/compiler/optimizer.go b/compiler/optimizer.go index b194e388..b1b81d39 100644 --- a/compiler/optimizer.go +++ b/compiler/optimizer.go @@ -219,6 +219,16 @@ func (c *Compiler) doesEscape(value llvm.Value) bool { // Call only escapes when the (pointer) parameter is not marked // "nocapture". This flag means that the parameter does not escape // the give function. + if use.CalledValue().IsAFunction() != nilValue { + if use.CalledValue().IsDeclaration() { + // Kind of dirty: assume external functions don't let + // pointers escape. + // TODO: introduce //go:noescape that sets the 'nocapture' + // flag on each input parameter. + println("declaration:", use.CalledValue().Name()) + continue + } + } if !c.hasFlag(use, value, "nocapture") { return true }