aboutsummaryrefslogtreecommitdiffstats
path: root/package/libs/toolchain
diff options
context:
space:
mode:
authorYousong Zhou <yszhou4tech@gmail.com>2019-10-19 12:00:43 +0000
committerYousong Zhou <yszhou4tech@gmail.com>2019-10-24 11:40:00 +0000
commit69b9f0161e147d566b3b9572a0bc39a97c257fc0 (patch)
treef0ec81c8e62b3b5a58a3502db491f2fe87b56ec9 /package/libs/toolchain
parented6ba2801c0a97e8b78f96ad71eb0493a0f1823f (diff)
downloadupstream-69b9f0161e147d566b3b9572a0bc39a97c257fc0.tar.gz
upstream-69b9f0161e147d566b3b9572a0bc39a97c257fc0.tar.bz2
upstream-69b9f0161e147d566b3b9572a0bc39a97c257fc0.zip
toolchain: gcc: enable sanitizers for glibc toolchain
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
Diffstat (limited to 'package/libs/toolchain')
-rw-r--r--package/libs/toolchain/Makefile172
1 files changed, 172 insertions, 0 deletions
diff --git a/package/libs/toolchain/Makefile b/package/libs/toolchain/Makefile
index a63746c448..c13e9e4928 100644
--- a/package/libs/toolchain/Makefile
+++ b/package/libs/toolchain/Makefile
@@ -138,6 +138,122 @@ define Package/libstdcpp/config
endef
+define Package/libasan
+$(call Package/gcc/Default)
+ NAME:=libasan
+ TITLE:=Runtime library for AddressSanitizer in GCC
+ DEPENDS:=@USE_GLIBC +librt +libstdcpp
+ ABI_VERSION:=5
+endef
+
+define Package/libasan/config
+ menu "Configuration"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_libasan
+
+ config LIBASAN_ROOT_DIR
+ string
+ prompt "libasan shared library base directory"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_libasan
+ default TOOLCHAIN_ROOT if !NATIVE_TOOLCHAIN
+ default "/" if NATIVE_TOOLCHAIN
+
+ config LIBASAN_FILE_SPEC
+ string
+ prompt "libasan shared library files (use wildcards)"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_libasan
+ default "./lib/libasan.so.*"
+
+ endmenu
+endef
+
+
+define Package/libtsan
+$(call Package/gcc/Default)
+ NAME:=libtsan
+ TITLE:=Runtime library for ThreadSanitizer in GCC
+ DEPENDS:=@USE_GLIBC +librt +libstdcpp
+ ABI_VERSION:=0
+endef
+
+define Package/libtsan/config
+ menu "Configuration"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_libtsan
+
+ config LIBTSAN_ROOT_DIR
+ string
+ prompt "libtsan shared library base directory"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_libtsan
+ default TOOLCHAIN_ROOT if !NATIVE_TOOLCHAIN
+ default "/" if NATIVE_TOOLCHAIN
+
+ config LIBTSAN_FILE_SPEC
+ string
+ prompt "libtsan shared library files (use wildcards)"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_libtsan
+ default "./lib/libtsan.so.*"
+
+ endmenu
+endef
+
+
+define Package/liblsan
+$(call Package/gcc/Default)
+ NAME:=liblsan
+ TITLE:=Runtime library for LeakSanitizer in GCC
+ DEPENDS:=@USE_GLIBC +librt +libstdcpp
+ ABI_VERSION:=0
+endef
+
+define Package/liblsan/config
+ menu "Configuration"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_liblsan
+
+ config LIBLSAN_ROOT_DIR
+ string
+ prompt "liblsan shared library base directory"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_liblsan
+ default TOOLCHAIN_ROOT if !NATIVE_TOOLCHAIN
+ default "/" if NATIVE_TOOLCHAIN
+
+ config LIBLSAN_FILE_SPEC
+ string
+ prompt "liblsan shared library files (use wildcards)"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_liblsan
+ default "./lib/liblsan.so.*"
+
+ endmenu
+endef
+
+
+define Package/libubsan
+$(call Package/gcc/Default)
+ NAME:=libubsan
+ TITLE:=Runtime library for UndefinedBehaviorSanitizer in GCC
+ DEPENDS:=@USE_GLIBC +librt +libstdcpp
+ ABI_VERSION:=1
+endef
+
+define Package/libubsan/config
+ menu "Configuration"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_libubsan
+
+ config LIBUBSAN_ROOT_DIR
+ string
+ prompt "libubsan shared library base directory"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_libubsan
+ default TOOLCHAIN_ROOT if !NATIVE_TOOLCHAIN
+ default "/" if NATIVE_TOOLCHAIN
+
+ config LIBUBSAN_FILE_SPEC
+ string
+ prompt "libubsan shared library files (use wildcards)"
+ depends on EXTERNAL_TOOLCHAIN && PACKAGE_libubsan
+ default "./lib/libubsan.so.*"
+
+ endmenu
+endef
+
+
define Package/libc/Default
SECTION:=libs
CATEGORY:=Base system
@@ -413,6 +529,26 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)
$(CP) $(TOOLCHAIN_DIR)/lib/libstdc++.so.* $(1)/usr/lib/
endef
+ define Package/libasan/install
+ $(INSTALL_DIR) $(1)/lib
+ $(CP) $(TOOLCHAIN_DIR)/lib/libasan.so.* $(1)/lib/
+ endef
+
+ define Package/libtsan/install
+ $(INSTALL_DIR) $(1)/lib
+ $(CP) $(TOOLCHAIN_DIR)/lib/libtsan.so.* $(1)/lib/
+ endef
+
+ define Package/liblsan/install
+ $(INSTALL_DIR) $(1)/lib
+ $(CP) $(TOOLCHAIN_DIR)/lib/liblsan.so.* $(1)/lib/
+ endef
+
+ define Package/libubsan/install
+ $(INSTALL_DIR) $(1)/lib
+ $(CP) $(TOOLCHAIN_DIR)/lib/libubsan.so.* $(1)/lib/
+ endef
+
define Package/glibc/install
$(CP) ./glibc-files/* $(1)/
rm -f $(1)/etc/localtime
@@ -550,6 +686,38 @@ else
exit 0
endef
+ define Package/libasan/install
+ for file in $(call qstrip,$(CONFIG_LIBASAN_FILE_SPEC)); do \
+ $(INSTALL_DIR) $(1)/lib ; \
+ $(CP) $(call qstrip,$(CONFIG_LIBASAN_ROOT_DIR))/$$$$file $(1)/lib/ ; \
+ done ; \
+ exit 0
+ endef
+
+ define Package/libtsan/install
+ for file in $(call qstrip,$(CONFIG_LIBTSAN_FILE_SPEC)); do \
+ $(INSTALL_DIR) $(1)/lib ; \
+ $(CP) $(call qstrip,$(CONFIG_LIBTSAN_ROOT_DIR))/$$$$file $(1)/lib/ ; \
+ done ; \
+ exit 0
+ endef
+
+ define Package/liblsan/install
+ for file in $(call qstrip,$(CONFIG_LIBLSAN_FILE_SPEC)); do \
+ $(INSTALL_DIR) $(1)/lib ; \
+ $(CP) $(call qstrip,$(CONFIG_LIBLSAN_ROOT_DIR))/$$$$file $(1)/lib/ ; \
+ done ; \
+ exit 0
+ endef
+
+ define Package/libubsan/install
+ for file in $(call qstrip,$(CONFIG_LIBUBSAN_FILE_SPEC)); do \
+ $(INSTALL_DIR) $(1)/lib ; \
+ $(CP) $(call qstrip,$(CONFIG_LIBUBSAN_ROOT_DIR))/$$$$file $(1)/lib/ ; \
+ done ; \
+ exit 0
+ endef
+
define Package/libc/install
for file in $(call qstrip,$(CONFIG_LIBC_FILE_SPEC)); do \
$(INSTALL_DIR) $(1)/lib ; \
@@ -623,6 +791,10 @@ $(eval $(call BuildPackage,libgcc))
$(eval $(call BuildPackage,libatomic))
$(eval $(call BuildPackage,libssp))
$(eval $(call BuildPackage,libstdcpp))
+$(eval $(call BuildPackage,libasan))
+$(eval $(call BuildPackage,libtsan))
+$(eval $(call BuildPackage,liblsan))
+$(eval $(call BuildPackage,libubsan))
$(eval $(call BuildPackage,libpthread))
$(eval $(call BuildPackage,libthread-db))
$(eval $(call BuildPackage,librt))
an>, 6, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 7, PAL_MODE_INPUT_PULLDOWN); #ifdef INFINITY_LED /* Row(strobe) */ palSetPadMode(GPIOC, 0, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 1, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 2, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 3, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 4, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 5, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 6, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 7, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOD, 0, PAL_MODE_OUTPUT_PUSHPULL); #else /* Row(strobe) */ palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 1, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 2, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 3, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 17, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 4, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 5, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOD, 0, PAL_MODE_OUTPUT_PUSHPULL); #endif memset(matrix, 0, MATRIX_ROWS * sizeof(matrix_row_t)); memset(matrix_debouncing, 0, MATRIX_ROWS * sizeof(matrix_row_t)); matrix_init_quantum(); } uint8_t matrix_scan(void) { for (int row = 0; row < MATRIX_ROWS; row++) { matrix_row_t data = 0; #ifdef INFINITY_LED // strobe row switch (row) { case 0: palSetPad(GPIOC, 0); break; case 1: palSetPad(GPIOC, 1); break; case 2: palSetPad(GPIOC, 2); break; case 3: palSetPad(GPIOC, 3); break; case 4: palSetPad(GPIOC, 4); break; case 5: palSetPad(GPIOC, 5); break; case 6: palSetPad(GPIOC, 6); break; case 7: palSetPad(GPIOC, 7); break; case 8: palSetPad(GPIOD, 0); break; } #else // strobe row switch (row) { case 0: palSetPad(GPIOB, 0); break; case 1: palSetPad(GPIOB, 1); break; case 2: palSetPad(GPIOB, 2); break; case 3: palSetPad(GPIOB, 3); break; case 4: palSetPad(GPIOB, 16); break; case 5: palSetPad(GPIOB, 17); break; case 6: palSetPad(GPIOC, 4); break; case 7: palSetPad(GPIOC, 5); break; case 8: palSetPad(GPIOD, 0); break; } #endif // need wait to settle pin state // if you wait too short, or have a too high update rate // the keyboard might freeze, or there might not be enough // processing power to update the LCD screen properly. // 20us, or two ticks at 100000Hz seems to be OK wait_us(20); // read col data data = (palReadPort(GPIOD)>>1); #ifdef INFINITY_LED // un-strobe row switch (row) { case 0: palClearPad(GPIOC, 0); break; case 1: palClearPad(GPIOC, 1); break; case 2: palClearPad(GPIOC, 2); break; case 3: palClearPad(GPIOC, 3); break; case 4: palClearPad(GPIOC, 4); break; case 5: palClearPad(GPIOC, 5); break; case 6: palClearPad(GPIOC, 6); break; case 7: palClearPad(GPIOC, 7); break; case 8: palClearPad(GPIOD, 0); break; } #else // un-strobe row switch (row) { case 0: palClearPad(GPIOB, 0); break; case 1: palClearPad(GPIOB, 1); break; case 2: palClearPad(GPIOB, 2); break; case 3: palClearPad(GPIOB, 3); break; case 4: palClearPad(GPIOB, 16); break; case 5: palClearPad(GPIOB, 17); break; case 6: palClearPad(GPIOC, 4); break; case 7: palClearPad(GPIOC, 5); break; case 8: palClearPad(GPIOD, 0); break; } #endif if (matrix_debouncing[row] != data) { matrix_debouncing[row] = data; debouncing = true; debouncing_time = timer_read(); } } if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) { for (int row = 0; row < MATRIX_ROWS; row++) { matrix[row] = matrix_debouncing[row]; } debouncing = false; } matrix_scan_quantum(); return 1; } bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & (1<<col)); } matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; } void matrix_print(void) { xprintf("\nr/c 01234567\n"); for (uint8_t row = 0; row < MATRIX_ROWS; row++) { xprintf("%02X: "); matrix_row_t data = matrix_get_row(row); for (int col = 0; col < MATRIX_COLS; col++) { if (data & (1<<col)) xprintf("1"); else xprintf("0"); } xprintf("\n"); } }