//
// NOTE: This file is outdated. None of the AFL++ team uses Android hence
//       we need users to keep this updated.
//       In the current state it will likely fail, please send fixes!
//       Also, this should build frida_mode.
//


cc_defaults {
  name: "afl-defaults",

  local_include_dirs: [
    "include",
    "instrumentation",
  ],

  cflags: [
    "-flto=full",
    "-funroll-loops",
    "-Wno-pointer-sign",
    "-Wno-pointer-arith",
    "-Wno-sign-compare",
    "-Wno-unused-parameter",
    "-Wno-unused-function",
    "-Wno-format",
    "-Wno-user-defined-warnings",
    "-DAFL_LLVM_USE_TRACE_PC=1",
    "-DBIN_PATH=\"out/host/linux-x86/bin\"",
    "-DDOC_PATH=\"out/host/linux-x86/shared/doc/afl\"",
    "-D__USE_GNU",
    "-DDEBUG_BUILD",
    "-U_FORTIFY_SOURCE",
    "-ggdb3",
    "-g",
    "-O0",
    "-fno-omit-frame-pointer",
    "-fPIC",
  ],

  target: {
    android_arm64: {
      cflags: [
        "-D__ANDROID__",
      ],
    },
    android_arm: {
      cflags: [
        "-D__ANDROID__",
      ],
    },
    android_x86_64: {
      cflags: [
        "-D__ANDROID__",
      ],
    },
    android_x86: {
      cflags: [
        "-D__ANDROID__",
      ],
    },
  },
}

cc_binary {
  name: "afl-fuzz",
  sanitize: {
    never: true,
  },
  host_supported: true,
  compile_multilib: "64",

  defaults: [
    "afl-defaults",
  ],

  srcs: [
    "src/afl-fuzz*.c",
    "src/afl-common.c",
    "src/afl-forkserver.c",
    "src/afl-sharedmem.c",
    "src/afl-forkserver.c",
    "src/afl-performance.c",
  ],
}

cc_binary {
  name: "afl-showmap",
  static_executable: true,
  host_supported: true,

  defaults: [
    "afl-defaults",
  ],

  srcs: [
    "src/afl-showmap.c",
    "src/afl-common.c",
    "src/afl-sharedmem.c",
    "src/afl-forkserver.c",
    "src/afl-performance.c",
  ],
}

cc_binary {
  name: "afl-tmin",
  static_executable: true,
  host_supported: true,

  defaults: [
    "afl-defaults",
  ],

  srcs: [
    "src/afl-tmin.c",
    "src/afl-common.c",
    "src/afl-sharedmem.c",
    "src/afl-forkserver.c",
    "src/afl-performance.c",
  ],
}

cc_binary {
  name: "afl-analyze",
  static_executable: true,
  host_supported: true,

  defaults: [
    "afl-defaults",
  ],

  srcs: [
    "src/afl-analyze.c",
    "src/afl-common.c",
    "src/afl-sharedmem.c",
    "src/afl-performance.c",
  ],
}

cc_binary {
  name: "afl-gotcpu",
  static_executable: true,
  host_supported: true,

  defaults: [
    "afl-defaults",
  ],

  srcs: [
    "src/afl-gotcpu.c",
    "src/afl-common.c",
  ],
}

cc_binary_host {
  name: "afl-cc",
  static_executable: true,

  defaults: [
    "afl-defaults",
  ],

  cflags: [
    "-DAFL_PATH=\"out/host/linux-x86/lib64\"",
    "-DAFL_CLANG_FLTO=\"-flto=full\"",
    "-DUSE_BINDIR=1",
    "-DLLVM_BINDIR=\"prebuilts/clang/host/linux-x86/clang-r383902b/bin\"",
    "-DLLVM_LIBDIR=\"prebuilts/clang/host/linux-x86/clang-r383902b/lib64\"",
    "-DCLANGPP_BIN=\"prebuilts/clang/host/linux-x86/clang-r383902b/bin/clang++\"",
    "-DAFL_REAL_LD=\"prebuilts/clang/host/linux-x86/clang-r383902b/bin/ld.lld\"",
    "-DLLVM_LTO=1",
    "-DLLVM_MAJOR=11",
    "-DLLVM_MINOR=2",
  ],

  srcs: [
    "src/afl-cc.c",
    "src/afl-common.c",
  ],

  symlinks: [
    "afl-clang-fast",
    "afl-clang-fast++",
  ],
}

cc_library_static {
  name: "afl-compiler-rt",
  compile_multilib: "64",
  vendor_available: true,
  host_supported: true,
  recovery_available: true,
  sdk_version: "9",

  apex_available: [
    "com.android.adbd",
    "com.android.appsearch",
    "com.android.art",
    "com.android.bluetooth.updatable",
    "com.android.cellbroadcast",
    "com.android.conscrypt",
    "com.android.extservices",
    "com.android.cronet",
    "com.android.neuralnetworks",
    "com.android.media",
    "com.android.media.swcodec",
    "com.android.mediaprovider",
    "com.android.permission",
    "com.android.runtime",
    "com.android.resolv",
    "com.android.tethering",
    "com.android.wifi",
    "com.android.sdkext",
    "com.android.os.statsd",
    "//any",
  ],

  defaults: [
    "afl-defaults",
  ],

  srcs: [
    "instrumentation/afl-compiler-rt.o.c",
  ],
}

cc_library_headers {
  name: "libafl_headers",
  vendor_available: true,
  host_supported: true,

  export_include_dirs: [
    "include",
    "instrumentation",
  ],
}

/*
cc_prebuilt_library_static {
  name: "libfrida-gum",
  compile_multilib: "64",
  strip: {
    none: true,
  },

  srcs: [
    "utils/afl_frida/android/libfrida-gum.a",
  ],

  export_include_dirs: [
    "utils/afl_frida/android",
  ],
}

cc_library_shared {
  name: "libtestinstr",

  srcs: [
    "utils/afl_frida/libtestinstr.c",
  ],

  cflags: [
    "-O0",
    "-fPIC",
  ],
}

cc_binary {
  name: "afl-frida",
  compile_multilib: "64",

  defaults: [
    "afl-defaults",
  ],

  cflags: [
    "-g",
    "-O0",
    "-Wno-format",
    "-Wno-pointer-sign",
    "-fpermissive",
    "-fPIC",
  ],

  static_libs: [
    "afl-compiler-rt",
    "libfrida-gum",
  ],

  shared_libs: [
    "libdl",
    "liblog",
  ],

  srcs: [
    "utils/afl_frida/afl-frida.c",
  ],

  local_include_dirs: [
    "utils/afl_frida",
    "utils/afl_frida/android",
  ],
}
*/

cc_binary {
  name: "afl-fuzz-32",
  sanitize: {
    never: true,
  },
  host_supported: true,
  compile_multilib: "32",

  defaults: [
    "afl-defaults",
  ],

  srcs: [
    "src/afl-fuzz*.c",
    "src/afl-common.c",
    "src/afl-sharedmem.c",
    "src/afl-forkserver.c",
    "src/afl-performance.c",
  ],
}

cc_binary_host {
  name: "afl-cc-32",
  compile_multilib: "32",
  static_executable: true,

  defaults: [
    "afl-defaults",
  ],

  cflags: [
    "-DAFL_PATH=\"out/host/linux-x86/lib64\"",
    "-DAFL_CLANG_FLTO=\"-flto=full\"",
    "-DUSE_BINDIR=1",
    "-DLLVM_BINDIR=\"prebuilts/clang/host/linux-x86/clang-r383902b/bin\"",
    "-DLLVM_LIBDIR=\"prebuilts/clang/host/linux-x86/clang-r383902b/lib64\"",
    "-DCLANGPP_BIN=\"prebuilts/clang/host/linux-x86/clang-r383902b/bin/clang++\"",
    "-DAFL_REAL_LD=\"prebuilts/clang/host/linux-x86/clang-r383902b/bin/ld.lld\"",
    "-DLLVM_LTO=1",
    "-DLLVM_MAJOR=11",
    "-DLLVM_MINOR=2",
  ],

  srcs: [
    "src/afl-cc.c",
    "src/afl-common.c",
  ],

  symlinks: [
    "afl-clang-fast-32",
    "afl-clang-fast++-32",
  ],
}

cc_library_static {
  name: "afl-compiler-rt-32",
  compile_multilib: "32",
  vendor_available: true,
  host_supported: true,
  recovery_available: true,
  sdk_version: "9",

  apex_available: [
    "com.android.adbd",
    "com.android.appsearch",
    "com.android.art",
    "com.android.bluetooth.updatable",
    "com.android.cellbroadcast",
    "com.android.conscrypt",
    "com.android.extservices",
    "com.android.cronet",
    "com.android.neuralnetworks",
    "com.android.media",
    "com.android.media.swcodec",
    "com.android.mediaprovider",
    "com.android.permission",
    "com.android.runtime",
    "com.android.resolv",
    "com.android.tethering",
    "com.android.wifi",
    "com.android.sdkext",
    "com.android.os.statsd",
    "//any",
  ],

  defaults: [
    "afl-defaults",
  ],

  srcs: [
    "instrumentation/afl-compiler-rt.o.c",
  ],
}

/*
cc_prebuilt_library_static {
  name: "libfrida-gum-32",
  compile_multilib: "32",
  strip: {
    none: true,
  },

  srcs: [
    "utils/afl_frida/android/arm/libfrida-gum.a",
  ],

  export_include_dirs: [
    "utils/afl_frida/android/arm",
  ],
}
*/

subdirs = [
  "custom_mutators",
]
