12946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
22946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
32946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
410ab2aceSGeorge Karpenkov 
510ab2aceSGeorge Karpenkov // A fuzz target with lots of edges.
610ab2aceSGeorge Karpenkov #include <cstdint>
710ab2aceSGeorge Karpenkov #include <cstdlib>
810ab2aceSGeorge Karpenkov 
break_optimization(const void * arg)910ab2aceSGeorge Karpenkov static inline void break_optimization(const void *arg) {
1010ab2aceSGeorge Karpenkov     __asm__ __volatile__("" : : "r" (arg) : "memory");
1110ab2aceSGeorge Karpenkov }
1210ab2aceSGeorge Karpenkov 
1310ab2aceSGeorge Karpenkov #define A                                         \
1410ab2aceSGeorge Karpenkov   do {                                            \
1510ab2aceSGeorge Karpenkov     i++;                                          \
1610ab2aceSGeorge Karpenkov     c++;                                          \
1710ab2aceSGeorge Karpenkov     if (Data[(i + __LINE__) % Size] == (c % 256)) \
1810ab2aceSGeorge Karpenkov       break_optimization(Data);                   \
1910ab2aceSGeorge Karpenkov     else                                          \
2010ab2aceSGeorge Karpenkov       break_optimization(0);                      \
2110ab2aceSGeorge Karpenkov   } while (0)
2210ab2aceSGeorge Karpenkov 
2310ab2aceSGeorge Karpenkov // for (int i = 0, n = Data[(__LINE__ - 1) % Size] % 16; i < n; i++)
2410ab2aceSGeorge Karpenkov 
2510ab2aceSGeorge Karpenkov #define B do{A; A; A; A; A; A; A; A; A; A; A; A; A; A; A; A; A; A; }while(0)
2610ab2aceSGeorge Karpenkov #define C do{B; B; B; B; B; B; B; B; B; B; B; B; B; B; B; B; B; B; }while(0)
27*ddfc84e6SNikita Popov #define D do{C; C; C; C; C; C; C; C; C; }while(0)
2810ab2aceSGeorge Karpenkov 
2910ab2aceSGeorge Karpenkov volatile int sink;
LLVMFuzzerTestOneInput(const uint8_t * Data,size_t Size)3010ab2aceSGeorge Karpenkov extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
3110ab2aceSGeorge Karpenkov   if (!Size) return 0;
3210ab2aceSGeorge Karpenkov   int c = 0;
3310ab2aceSGeorge Karpenkov   int i = 0;
3410ab2aceSGeorge Karpenkov   D;
3510ab2aceSGeorge Karpenkov   return 0;
3610ab2aceSGeorge Karpenkov }
3710ab2aceSGeorge Karpenkov 
38