SF: Introduce libsurfaceflinger_unittest

This is meant to be a framework for running function-level unit tests
against the various SurfaceFlinger classes.

The point of this patch is to set up the test framework, as well as
demonstrate a pattern to be used to allow private implementation
functions to be tested.

Note that this patch configures the base surfaceflinger code to now use
ThinLTO, and enables -fwhole-program-vtables. This is done as ThinLTO
with that option will perform a devirtualization pass, turning virtual
function calls back into non-virtual function calls (and possibly even
inlining the call) when it detects that there is only one possible
implementation being called. The cost is a slight increase in build time
(similar to -O2), but is still much less than the original LTO.

Even here that LTO pass does something to the surfaceflinger binary,
reducing the file size by 4Kb.

Test: libsurfaceflinger_unittest passes on Pixel XL
Test: atest libsurfaceflinger_unittest runs the new test
Bug: None
Change-Id: I362ec1fcf1a909c4d6769710d8d8a6b0b158600d
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 1349bec..bde1a8e 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -316,6 +316,9 @@
     friend class BufferLayer;
     friend class MonitoredProducer;
 
+    // For unit tests
+    friend class TestableSurfaceFlinger;
+
     // This value is specified in number of frames.  Log frame stats at most
     // every half hour.
     enum { LOG_FRAME_STATS_PERIOD =  30*60*60 };