From abff3b65af008f414c3951333006ce72e86e9d63 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Thu, 28 Dec 2023 10:36:41 -0800 Subject: [PATCH] remove check for `__builtin_expect` Use `__has_builtin` to check at compile time if the feature is supported. This macro is supported by both clang and GCC (as of 10). GCC 10 was released ~2020 [1], which is ~4 years old now. In the case that the compiler in use is not new enough, we still provide the fallback so that the code will compile but without the additional hints for the branch probability (which also tends to be accounted for by modern branch predictors). This removes the final use of the `config.h` header and the configure time checks. Remove the use of `config.h` from the code base. [1] https://gcc.gnu.org/releases.html --- src/CMakeLists.txt | 10 ---------- src/blocks.c | 1 - src/buffer.c | 1 - src/buffer.h | 8 ++++---- src/commonmark.c | 1 - src/config.h.in | 14 -------------- src/houdini.h | 10 +--------- src/houdini_href_e.c | 11 +++++++++++ src/houdini_html_e.c | 11 +++++++++++ src/houdini_html_u.c | 11 +++++++++++ src/html.c | 1 - src/inlines.c | 1 - src/iterator.c | 1 - src/latex.c | 1 - src/main.c | 6 +++--- src/man.c | 1 - src/node.c | 1 - src/node.h | 1 - src/xml.c | 1 - 19 files changed, 41 insertions(+), 51 deletions(-) delete mode 100644 src/config.h.in diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index aedadfa7c..00f96274e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -169,16 +169,6 @@ if(CMARK_SHARED OR CMARK_STATIC) endif() -# Feature tests -include(CheckCSourceCompiles) -CHECK_C_SOURCE_COMPILES( - "int main() { __builtin_expect(0,0); return 0; }" - HAVE___BUILTIN_EXPECT) - -CONFIGURE_FILE( - ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in - ${CMAKE_CURRENT_BINARY_DIR}/config.h) - if(CMARK_LIB_FUZZER) add_executable(cmark-fuzz ../test/cmark-fuzz.c ${LIBRARY_SOURCES}) cmark_add_compile_options(cmark-fuzz) diff --git a/src/blocks.c b/src/blocks.c index 59bb22252..1abff0514 100644 --- a/src/blocks.c +++ b/src/blocks.c @@ -12,7 +12,6 @@ #include #include "cmark_ctype.h" -#include "config.h" #include "parser.h" #include "cmark.h" #include "node.h" diff --git a/src/buffer.c b/src/buffer.c index 4ad03d7c9..aeca03d09 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -7,7 +7,6 @@ #include #include -#include "config.h" #include "cmark_ctype.h" #include "buffer.h" diff --git a/src/buffer.h b/src/buffer.h index 7dfb1f8b3..430500bac 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -1,12 +1,12 @@ #ifndef CMARK_BUFFER_H #define CMARK_BUFFER_H -#include -#include -#include #include +#include +#include #include -#include "config.h" +#include + #include "cmark.h" #ifdef __cplusplus diff --git a/src/commonmark.c b/src/commonmark.c index dc31f4597..3c4347668 100644 --- a/src/commonmark.c +++ b/src/commonmark.c @@ -5,7 +5,6 @@ #include #include -#include "config.h" #include "cmark.h" #include "node.h" #include "buffer.h" diff --git a/src/config.h.in b/src/config.h.in deleted file mode 100644 index f67fb6326..000000000 --- a/src/config.h.in +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef CMARK_CONFIG_H -#define CMARK_CONFIG_H - -#ifdef __cplusplus -extern "C" { -#endif - -#cmakedefine HAVE___BUILTIN_EXPECT - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/houdini.h b/src/houdini.h index f738e8243..410530631 100644 --- a/src/houdini.h +++ b/src/houdini.h @@ -6,16 +6,8 @@ extern "C" { #endif #include -#include "config.h" -#include "buffer.h" -#ifdef HAVE___BUILTIN_EXPECT -#define likely(x) __builtin_expect((x), 1) -#define unlikely(x) __builtin_expect((x), 0) -#else -#define likely(x) (x) -#define unlikely(x) (x) -#endif +#include "buffer.h" #ifdef HOUDINI_USE_LOCALE #define _isxdigit(c) isxdigit(c) diff --git a/src/houdini_href_e.c b/src/houdini_href_e.c index 959d4bb63..38f2a5826 100644 --- a/src/houdini_href_e.c +++ b/src/houdini_href_e.c @@ -4,6 +4,17 @@ #include "houdini.h" +#if !defined(__has_builtin) +# define __has_builtin(b) 0 +#endif + +#if !__has_builtin(__builtin_expect) +# define __builtin_expect(e, v) (e) +#endif + +#define likely(e) __builtin_expect((e), 1) +#define unlikely(e) __builtin_expect((e), 0) + /* * The following characters will not be escaped: * diff --git a/src/houdini_html_e.c b/src/houdini_html_e.c index 0e539f037..391f2eaa1 100644 --- a/src/houdini_html_e.c +++ b/src/houdini_html_e.c @@ -4,6 +4,17 @@ #include "houdini.h" +#if !defined(__has_builtin) +# define __has_builtin(b) 0 +#endif + +#if !__has_builtin(__builtin_expect) +# define __builtin_expect(e, v) (e) +#endif + +#define likely(e) __builtin_expect((e), 1) +#define unlikely(e) __builtin_expect((e), 0) + /** * According to the OWASP rules: * diff --git a/src/houdini_html_u.c b/src/houdini_html_u.c index 3b7466e5f..e0999b0ae 100644 --- a/src/houdini_html_u.c +++ b/src/houdini_html_u.c @@ -7,6 +7,17 @@ #include "utf8.h" #include "entities.inc" +#if !defined(__has_builtin) +# define __has_builtin(b) 0 +#endif + +#if !__has_builtin(__builtin_expect) +# define __builtin_expect(e, v) (e) +#endif + +#define likely(e) __builtin_expect((e), 1) +#define unlikely(e) __builtin_expect((e), 0) + /* Binary tree lookup code for entities added by JGM */ static const unsigned char *S_lookup(int i, int low, int hi, diff --git a/src/html.c b/src/html.c index e9e29141a..35ce52226 100644 --- a/src/html.c +++ b/src/html.c @@ -5,7 +5,6 @@ #include #include "cmark_ctype.h" -#include "config.h" #include "cmark.h" #include "node.h" #include "buffer.h" diff --git a/src/inlines.c b/src/inlines.c index 8314c846a..c0b1c55d2 100644 --- a/src/inlines.c +++ b/src/inlines.c @@ -4,7 +4,6 @@ #include #include "cmark_ctype.h" -#include "config.h" #include "node.h" #include "parser.h" #include "references.h" diff --git a/src/iterator.c b/src/iterator.c index d41b90d69..cc428285e 100644 --- a/src/iterator.c +++ b/src/iterator.c @@ -2,7 +2,6 @@ #include #include -#include "config.h" #include "node.h" #include "cmark.h" #include "iterator.h" diff --git a/src/latex.c b/src/latex.c index 1b7b6c572..61be34f95 100644 --- a/src/latex.c +++ b/src/latex.c @@ -4,7 +4,6 @@ #include #include -#include "config.h" #include "cmark.h" #include "node.h" #include "buffer.h" diff --git a/src/main.c b/src/main.c index e02a3c438..e63604bd7 100644 --- a/src/main.c +++ b/src/main.c @@ -1,8 +1,8 @@ -#include +#include #include +#include #include -#include -#include "config.h" + #include "cmark.h" #include "node.h" diff --git a/src/man.c b/src/man.c index c793a05fa..02dfb7cb3 100644 --- a/src/man.c +++ b/src/man.c @@ -4,7 +4,6 @@ #include #include -#include "config.h" #include "cmark.h" #include "node.h" #include "buffer.h" diff --git a/src/node.c b/src/node.c index bcf96316d..48f6fd758 100644 --- a/src/node.c +++ b/src/node.c @@ -2,7 +2,6 @@ #include #include -#include "config.h" #include "node.h" static void S_node_unlink(cmark_node *node); diff --git a/src/node.h b/src/node.h index 430ee5671..c6591b03b 100644 --- a/src/node.h +++ b/src/node.h @@ -9,7 +9,6 @@ extern "C" { #include #include -#include "config.h" #include "cmark.h" #include "buffer.h" diff --git a/src/xml.c b/src/xml.c index a69053e5c..4f16edcde 100644 --- a/src/xml.c +++ b/src/xml.c @@ -4,7 +4,6 @@ #include #include -#include "config.h" #include "cmark.h" #include "node.h" #include "buffer.h"