Remove boilerplate when building new demos

Add a function to handle the common case: `demo` in `demo.cc`
diff --git a/demos/CMakeLists.txt b/demos/CMakeLists.txt
index 578c14b..8e4fe31 100644
--- a/demos/CMakeLists.txt
+++ b/demos/CMakeLists.txt
@@ -21,101 +21,91 @@
 # Support library
 add_library(safeside cache_sidechannel.cc instr.cc utils.cc)
 
+# Takes care of the common case for demo programs: an executable target
+# that compiles a file of the same name and links against the Safeside
+# support library.
+function(add_demo demo_name)
+  add_executable(${demo_name} ${demo_name}.cc)
+  target_link_libraries(${demo_name} safeside)
+endfunction(add_demo)
+
 # Spectre V1 PHT SA -- mistraining PHT in the same address space
-add_executable(spectre_v1_pht_sa spectre_v1_pht_sa.cc)
-target_link_libraries(spectre_v1_pht_sa safeside)
+add_demo(spectre_v1_pht_sa)
 
 # Spectre V1 BTB SA -- mistraining BTB in the same address space
-add_executable(spectre_v1_btb_sa spectre_v1_btb_sa.cc)
-target_link_libraries(spectre_v1_btb_sa safeside)
+add_demo(spectre_v1_btb_sa)
 
 # Spectre V4 -- speculative store bypass
-add_executable(spectre_v4 spectre_v4.cc)
-target_link_libraries(spectre_v4 safeside)
+add_demo(spectre_v4)
 
 # Ret2Spec -- rewriting the RSB using recursion in the same address space
-add_executable(ret2spec_sa ret2spec_sa.cc)
-target_link_libraries(ret2spec_sa safeside)
+add_demo(ret2spec_sa)
 
 if(${CMAKE_SYSTEM_NAME} MATCHES "^(Linux)$")
   # Spectre V1 BTB CA - mistraining BTB from another address space
-  add_executable(spectre_v1_btb_ca spectre_v1_btb_ca.cc)
-  target_link_libraries(spectre_v1_btb_ca safeside)
+  add_demo(spectre_v1_btb_ca)
 endif()
 
 if((${CMAKE_SYSTEM_NAME} MATCHES "^(Linux)|(Darwin)$") AND
    (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(i.86)|(x86_64)|(aarch64)$"))
   # Ret2Spec -- speculative execution using return stack buffers creating a
   # call-ret disparity by inline assembly
-  add_executable(ret2spec_callret_disparity ret2spec_callret_disparity.cc)
+  add_demo(ret2spec_callret_disparity)
   target_compile_options(ret2spec_callret_disparity PRIVATE -fomit-frame-pointer)
-  target_link_libraries(ret2spec_callret_disparity safeside)
 endif()
 
 if((${CMAKE_SYSTEM_NAME} MATCHES "^(Linux)$") AND
    (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(i.86)|(x86_64)|(ppc64le)$"))
   # Spectre V3 / Meltdown
-  add_executable(meltdown meltdown.cc)
-  target_link_libraries(meltdown safeside)
+  add_demo(meltdown)
 
   # L1 terminal fault -- Foreshadow OS -- Meltdown P
-  add_executable(l1tf l1tf.cc)
-  target_link_libraries(l1tf safeside)
+  add_demo(l1tf)
 endif()
 
 if((${CMAKE_SYSTEM_NAME} MATCHES "^(Linux)$") AND
    (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(aarch64)$"))
   # Speculation over ERET, HVC and SMC instructions
-  add_executable(eret_hvc_smc_wrapper eret_hvc_smc_wrapper.cc)
-  target_link_libraries(eret_hvc_smc_wrapper safeside)
+  add_demo(eret_hvc_smc_wrapper)
 
   # Speculation over syscall
-  add_executable(speculation_over_syscall speculation_over_syscall.cc)
-  target_link_libraries(speculation_over_syscall safeside)
+  add_demo(speculation_over_syscall)
 
   # Meltdown UD -- speculation over an undefined instruction
-  add_executable(meltdown_ud meltdown_ud.cc)
-  target_link_libraries(meltdown_ud safeside)
+  add_demo(meltdown_ud)
 endif()
 
 if((${CMAKE_SYSTEM_NAME} MATCHES "^(Linux)|(Darwin)$") AND
    (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(i.86)$"))
    # Meltdown BR - speculation over the ia32 bounds check instruction
-  add_executable(meltdown_br meltdown_br.cc)
-  target_link_libraries(meltdown_br safeside)
+  add_demo(meltdown_br)
 endif()
 
 if((${CMAKE_SYSTEM_NAME} MATCHES "^(Linux)$") AND
    (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(i.86)$"))
   # Meltdown SS -- speculative reading from non present segments and outside of
   # segment limits
-  add_executable(meltdown_ss meltdown_ss.cc)
-  target_link_libraries(meltdown_ss safeside)
+  add_demo(meltdown_ss)
 endif()
 
 if((${CMAKE_SYSTEM_NAME} MATCHES "^(Linux)|(Darwin)$") AND
    (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(i.86)$"))
   # Meltdown OF -- speculative fetching from an overflowing address after an
   # INTO check
-  add_executable(meltdown_of meltdown_of.cc)
-  target_link_libraries(meltdown_of safeside)
+  add_demo(meltdown_of)
 endif()
 
 if((${CMAKE_SYSTEM_NAME} MATCHES "^(Linux)$") AND
    (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(i.86)|(x86_64)$"))
   # Speculation over hardware breakpoint trap (read watcher)
-  add_executable(speculation_over_read_hw_breakpoint speculation_over_read_hw_breakpoint.cc)
-  target_link_libraries(speculation_over_read_hw_breakpoint safeside)
+  add_demo(speculation_over_read_hw_breakpoint)
 
   # Speculation over hardware breakpoint fault (execution watcher)
-  add_executable(speculation_over_exec_hw_breakpoint speculation_over_exec_hw_breakpoint.cc)
-  target_link_libraries(speculation_over_exec_hw_breakpoint safeside)
+  add_demo(speculation_over_exec_hw_breakpoint)
 
   # Meltdown AC -- speculative fetching of unaligned data
-  add_executable(meltdown_ac meltdown_ac.cc)
-  target_link_libraries(meltdown_ac safeside)
+  add_demo(meltdown_ac)
 
   # Meltdown DE -- speculative computation with division by zero remainder
-  add_executable(meltdown_de meltdown_de.cc)
-  target_link_libraries(meltdown_de safeside)
+  add_demo(meltdown_de)
 endif()