summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-05-21 22:43:34 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-05-21 22:49:45 +0800
commita7a142dba18146efb92726bfebdadb3cf16fae5b (patch)
tree56a629775a07f563fd9fba548c578d4a6ea5ec8d /Makefile
parent99fa221f86cb8a2a5d9f4d03c2a7937d4fca4e6c (diff)
Makefile: more debugging options
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile110
1 files changed, 103 insertions, 7 deletions
diff --git a/Makefile b/Makefile
index 1997923..ee80975 100644
--- a/Makefile
+++ b/Makefile
@@ -9,12 +9,24 @@ BUILDDIR ?= build
OBJS = $(patsubst src/%, $(BUILDDIR)/%, $(SRCS:.cpp=.o))
-CXXFLAGS += -std=c++26 -Oz -s -Wall -flto -fPIC
+CXXFLAGS += -std=c++26 -Oz -s -Wall -Wextra -flto -fPIC -Wpedantic
LDFLAGS += -Wl,--as-needed,-z,now,-z,pack-relative-relocs
# Debug flags
-DEBUG_CXXFLAGS = -std=c++26 -g3 -O0 -Wall -fno-lto -fPIC -DDEBUG,-ffu -pthread
-DEBUG_LDFLAGS = -Wl,--no-as-needed,-z,now,-z,pack-relative-relocs -lpthread
+DEBUG_CXXFLAGS = -std=c++26 -g3 -O0 -Wall -Wextra -fno-lto -fPIC -DDEBUG -fsanitize=thread -fno-omit-frame-pointer -pthread
+DEBUG_LDFLAGS = -Wl,--no-as-needed,-z,now,-z,pack-relative-relocs -fsanitize=thread -lpthread
+
+# Address Sanitizer Debug flags (run with make asan)
+ASAN_CXXFLAGS = -std=c++26 -g3 -O0 -Wall -Wextra -fno-lto -fPIC -DDEBUG -fsanitize=address -fno-omit-frame-pointer -pthread
+ASAN_LDFLAGS = -Wl,--no-as-needed,-z,now,-z,pack-relative-relocs -fsanitize=address -lpthread
+
+# Memory Sanitizer Debug flags (run with make msan)
+MSAN_CXXFLAGS = -std=c++26 -g3 -O0 -Wall -Wextra -fno-lto -fPIC -DDEBUG -fsanitize=memory -fno-omit-frame-pointer -fsanitize-memory-track-origins=2 -pthread
+MSAN_LDFLAGS = -Wl,--no-as-needed,-z,now,-z,pack-relative-relocs -fsanitize=memory -lpthread
+
+# UB Sanitizer Debug flags (run with make ubsan)
+UBSAN_CXXFLAGS = -std=c++26 -g3 -O0 -Wall -Wextra -fno-lto -fPIC -DDEBUG -fsanitize=undefined -fno-omit-frame-pointer -pthread
+UBSAN_LDFLAGS = -Wl,--no-as-needed,-z,now,-z,pack-relative-relocs -fsanitize=undefined -lpthread
CXXFLAGS += $(shell pkg-config --cflags ftxui)
LDFLAGS += $(shell pkg-config --libs ftxui)
@@ -54,11 +66,9 @@ $(BUILDDIR)/$(BIN): $(OBJS)
$(CXXFLAGS) \
$(LDFLAGS)
-# Create phony target that depends on the actual binary
$(BIN): $(BUILDDIR)/$(BIN)
-
$(BUILDDIR)/%.o: src/%.cpp
$(call progress, Compiling $@)
@$(CXX) -c $< -o $@ \
@@ -72,7 +82,7 @@ clang-tidy:
@echo "Running clang-tidy..."
@clang-tidy -fix-errors $(SRCS) -- $(CXXFLAGS)
-.PHONY: all install clean clean-all $(BIN)
+.PHONY: all install clean clean-all $(BIN) debug asan msan ubsan helgrind valgrind drd threadcheck compile_commands dchecks dthread live_tsan llvm_libfuzzer stack_combo deadlock pgo-gen pgo-use perf-analysis clang-format clang-tidy
debug: CXXFLAGS = $(DEBUG_CXXFLAGS)
debug: LDFLAGS = $(DEBUG_LDFLAGS)
@@ -80,4 +90,90 @@ debug: LDFLAGS = $(DEBUG_LDFLAGS)
# debug: CXX = afl-g++
# debug: export AFL_USE_ASAN = 1
debug: $(BIN)
- @echo "Debug build complete"
+ @echo "Debug build complete (Thread Sanitizer enabled)"
+
+asan: CXXFLAGS = $(ASAN_CXXFLAGS)
+asan: LDFLAGS = $(ASAN_LDFLAGS)
+asan: $(BIN)
+ @echo "Debug build complete (Address Sanitizer enabled)"
+
+msan: CXXFLAGS = $(MSAN_CXXFLAGS)
+msan: LDFLAGS = $(MSAN_LDFLAGS)
+msan: $(BIN)
+ @echo "Debug build complete (Memory Sanitizer enabled)"
+
+ubsan: CXXFLAGS = $(UBSAN_CXXFLAGS)
+ubsan: LDFLAGS = $(UBSAN_LDFLAGS)
+ubsan: $(BIN)
+ @echo "Debug build complete (Undefined Behavior Sanitizer enabled)"
+
+dthread: CXXFLAGS = $(DEBUG_CXXFLAGS)
+dthread: LDFLAGS = $(DEBUG_LDFLAGS)
+dthread: $(BIN)
+ @echo "Debug build complete (Enhanced Thread Sanitizer enabled)"
+ TSAN_OPTIONS="history_size=10 report_thread_leaks=1 report_signal_unsafe=1 halt_on_error=1 second_deadlock_stack=1" $(BUILDDIR)/$(BIN) $(ARGS)
+
+helgrind: debug
+ @echo "Running with Valgrind Helgrind thread checker"
+ valgrind --tool=helgrind --read-var-info=yes --track-lockorders=yes $(BUILDDIR)/$(BIN) $(ARGS)
+
+valgrind: debug
+ @echo "Running with Valgrind memory checker"
+ valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes $(BUILDDIR)/$(BIN) $(ARGS)
+
+drd: debug
+ @echo "Running with Valgrind DRD (Data Race Detector)"
+ valgrind --tool=drd --check-stack-var=yes --first-race-only=yes $(BUILDDIR)/$(BIN) $(ARGS)
+
+dchecks: CXXFLAGS = -std=c++26 -g3 -O0 -Wall -Wextra -fno-lto -fPIC -DDEBUG -fsanitize=thread,undefined -fno-omit-frame-pointer -pthread
+dchecks: LDFLAGS = -Wl,--no-as-needed,-z,now,-z,pack-relative-relocs -fsanitize=thread,undefined -lpthread
+dchecks: $(BIN)
+ @echo "Debug build complete (Thread & UB Sanitizers enabled)"
+
+threadcheck: debug
+ @echo "Running with Thread Sanitizer"
+ TSAN_OPTIONS="history_size=7 halt_on_error=1 second_deadlock_stack=1" $(BUILDDIR)/$(BIN) $(ARGS)
+
+live_tsan: CXXFLAGS = $(DEBUG_CXXFLAGS)
+live_tsan: LDFLAGS = $(DEBUG_LDFLAGS)
+live_tsan: $(BIN)
+ @echo "Running with live Thread Sanitizer (continues after errors)"
+ TSAN_OPTIONS="history_size=15 report_thread_leaks=1 report_signal_unsafe=1 halt_on_error=0 second_deadlock_stack=1" $(BUILDDIR)/$(BIN) $(ARGS)
+
+llvm_libfuzzer: CXXFLAGS = -std=c++26 -g -O1 -Wall -Wextra -fno-lto -fPIC -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -fsanitize=fuzzer,address -fno-omit-frame-pointer
+llvm_libfuzzer: LDFLAGS = -Wl,--no-as-needed,-z,now,-z,pack-relative-relocs -fsanitize=fuzzer,address
+llvm_libfuzzer: $(BIN)
+ @echo "Fuzzer build complete (note: requires clang compiler)"
+
+stack_combo: CXXFLAGS = -std=c++26 -g3 -O0 -Wall -Wextra -fno-lto -fPIC -DDEBUG -fsanitize=address,undefined -fno-omit-frame-pointer -pthread
+stack_combo: LDFLAGS = -Wl,--no-as-needed,-z,now,-z,pack-relative-relocs -fsanitize=address,undefined -lpthread
+stack_combo: $(BIN)
+ @echo "Debug build complete (Combined ASan and UBSan)"
+ ASAN_OPTIONS="detect_leaks=1:check_initialization_order=1:detect_stack_use_after_return=1" $(BUILDDIR)/$(BIN) $(ARGS)
+
+compile_commands:
+ compiledb -n make
+
+
+deadlock: CXXFLAGS = $(DEBUG_CXXFLAGS) -DENABLE_DEADLOCK_DETECTION
+deadlock: LDFLAGS = $(DEBUG_LDFLAGS)
+deadlock: $(BIN)
+ @echo "Debug build complete (with deadlock detection)"
+ TSAN_OPTIONS="detect_deadlocks=1:second_deadlock_stack=1:report_thread_leaks=1:halt_on_error=0" $(BUILDDIR)/$(BIN) $(ARGS)
+
+pgo-gen: CXXFLAGS = -std=c++26 -O2 -Wall -Wextra -fprofile-generate -fPIC
+pgo-gen: LDFLAGS = -Wl,--as-needed,-z,now,-z,pack-relative-relocs -fprofile-generate
+pgo-gen: $(BIN)
+ @echo "Profile generation build complete (run app with typical workload)"
+
+pgo-use: CXXFLAGS = -std=c++26 -Oz -Wall -Wextra -fprofile-use -fprofile-correction -fPIC
+pgo-use: LDFLAGS = -Wl,--as-needed,-z,now,-z,pack-relative-relocs -fprofile-use
+pgo-use: $(BIN)
+ @echo "Optimized build using profile data complete"
+
+perf-analysis: CXXFLAGS = -std=c++26 -g -O2 -Wall -Wextra -fno-lto -fno-omit-frame-pointer
+perf-analysis: LDFLAGS = -Wl,--as-needed,-z,now,-z,pack-relative-relocs
+perf-analysis: $(BIN)
+ @echo "Performance analysis build complete"
+ valgrind --tool=callgrind --callgrind-out-file=callgrind.out $(BUILDDIR)/$(BIN) $(ARGS)
+ @echo "Run 'callgrind_annotate callgrind.out' to view results"