From 033969bbe3cb480b5176886afaa0c9181f506b2f Mon Sep 17 00:00:00 2001
From: Adrian Conlon <Adrian.conlon@gmail.com>
Date: Thu, 30 Nov 2017 14:59:24 +0000
Subject: [PATCH] Add profile guided optimisation to build configuration
 (profile/profiled)

Signed-off-by: Adrian Conlon <Adrian.conlon@gmail.com>
---
 Makefile         | 15 +++++++++++++++
 Z80/src/Makefile |  1 +
 compile.mk       |  9 +++++++++
 exe_build.mk     | 19 ++++++++++---------
 lib_build.mk     | 18 +++++++++---------
 src/Makefile     |  1 +
 6 files changed, 45 insertions(+), 18 deletions(-)
 create mode 100644 compile.mk

diff --git a/Makefile b/Makefile
index b0e47ba..870955c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,21 +1,36 @@
 .PHONY: all
 all: opt
 
+.PHONY: opt
 opt:
 	$(MAKE) -C src opt
 	$(MAKE) -C Z80/src opt
 	$(MAKE) -C Z80/test opt
 
+.PHONY: debug
 debug:
 	$(MAKE) -C src debug
 	$(MAKE) -C Z80/src debug
 	$(MAKE) -C Z80/test debug
 
+.PHONY: coverage
 coverage:
 	$(MAKE) -C src coverage
 	$(MAKE) -C Z80/src coverage
 	$(MAKE) -C Z80/test coverage
 
+.PHONY: profile
+profile:
+	$(MAKE) -C src profile
+	$(MAKE) -C Z80/src profile
+	$(MAKE) -C Z80/test profile
+
+.PHONY: profiled
+profiled:
+	$(MAKE) -C src profiled
+	$(MAKE) -C Z80/src profiled
+	$(MAKE) -C Z80/test profiled
+
 .PHONY: clean
 clean:
 	$(MAKE) -C src clean
diff --git a/Z80/src/Makefile b/Z80/src/Makefile
index e5b99be..773003f 100644
--- a/Z80/src/Makefile
+++ b/Z80/src/Makefile
@@ -4,4 +4,5 @@ CXXFLAGS = -I ../inc -I ../../inc
 
 CXXFILES = Disassembler.cpp Profiler.cpp Z80.cpp
 
+include ../../compile.mk
 include ../../lib_build.mk
diff --git a/compile.mk b/compile.mk
new file mode 100644
index 0000000..69d2ff6
--- /dev/null
+++ b/compile.mk
@@ -0,0 +1,9 @@
+CXXFLAGS += -g -Wall -std=c++14 -pipe
+
+#CXXFLAGS_OPT = -DNDEBUG -march=native -Ofast -flto
+CXXFLAGS_OPT = -DNDEBUG -march=native -Ofast
+CXXFLAGS_DEBUG = -D_DEBUG
+CXXFLAGS_COVERAGE = $(CXXFLAGS_DEBUG) -fprofile-arcs -ftest-coverage
+
+CXXFLAGS_PROFILE = $(CXXFLAGS_OPT) -fprofile-generate
+CXXFLAGS_PROFILED = $(CXXFLAGS_OPT) -fprofile-use
diff --git a/exe_build.mk b/exe_build.mk
index 7cc5125..3bdff03 100644
--- a/exe_build.mk
+++ b/exe_build.mk
@@ -1,5 +1,3 @@
-CXXFLAGS += -g -Wall -std=c++14 -pipe
-
 CXXOBJECTS = $(CXXFILES:.cpp=.o)
 
 SOURCES = $(CXXFILES)
@@ -7,22 +5,25 @@ OBJECTS = $(CXXOBJECTS)
 
 PCH = stdafx.h.gch
 
-.PHONY: all
 all: opt
 
-.PHONY: opt
-opt: CXXFLAGS += -DNDEBUG -march=native -O3 -flto
+opt: CXXFLAGS += $(CXXFLAGS_OPT)
 opt: $(EXE)
 
-.PHONY: debug
-debug: CXXFLAGS += -D_DEBUG
+debug: CXXFLAGS += $(CXXFLAGS_DEBUG)
 debug: $(EXE)
 
-.PHONY: coverage
-coverage: CXXFLAGS += -D_DEBUG -fprofile-arcs -ftest-coverage
+coverage: CXXFLAGS += $(CXXFLAGS_COVERAGE)
 coverage: LDFLAGS += -lgcov
 coverage: $(EXE)
 
+profile: CXXFLAGS += $(CXXFLAGS_PROFILE)
+profile: LDFLAGS += -lgcov
+profile: $(EXE)
+
+profiled: CXXFLAGS += $(CXXFLAGS_PROFILED)
+profiled: $(EXE)
+
 $(PCH): stdafx.h
 	$(CXX) $(CXXFLAGS) -x c++-header $<
 
diff --git a/lib_build.mk b/lib_build.mk
index 8806485..ef1978c 100644
--- a/lib_build.mk
+++ b/lib_build.mk
@@ -1,5 +1,3 @@
-CXXFLAGS += -g -Wall -std=c++14 -pipe
-
 CXXOBJECTS = $(CXXFILES:.cpp=.o)
 
 SOURCES = $(CXXFILES)
@@ -7,21 +5,23 @@ OBJECTS = $(CXXOBJECTS)
 
 PCH = stdafx.h.gch
 
-.PHONY: all
 all: opt
 
-.PHONY: opt
-opt: CXXFLAGS += -DNDEBUG -march=native -O3 -flto
+opt: CXXFLAGS += $(CXXFLAGS_OPT)
 opt: $(LIB)
 
-.PHONY: debug
-debug: CXXFLAGS += -D_DEBUG
+debug: CXXFLAGS += $(CXXFLAGS_DEBUG)
 debug: $(LIB)
 
-.PHONY: coverage
-coverage: CXXFLAGS += -D_DEBUG -fprofile-arcs -ftest-coverage
+coverage: CXXFLAGS += $(CXXFLAGS_COVERAGE)
 coverage: $(LIB)
 
+profile: CXXFLAGS += $(CXXFLAGS_PROFILE)
+profile: $(LIB)
+
+profiled: CXXFLAGS += $(CXXFLAGS_PROFILED)
+profiled: $(LIB)
+
 $(PCH): stdafx.h
 	$(CXX) $(CXXFLAGS) -x c++-header $<
 
diff --git a/src/Makefile b/src/Makefile
index a6f8230..09eb00d 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -4,4 +4,5 @@ CXXFLAGS = -I ../inc
 
 CXXFILES = Bus.cpp EventArgs.cpp InputOutput.cpp IntelProcessor.cpp Memory.cpp Processor.cpp
 
+include ../compile.mk
 include ../lib_build.mk