//
// Copyright (C) 2012 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//

ASAN_NEEDS_SEGV = "0"
ASAN_HAS_EXCEPTIONS = "1"
ASAN_FLEXIBLE_MAPPING_AND_OFFSET = "0"

asan_rtl_files = [
    "asan_activation.cc",
    "asan_allocator.cc",
    "asan_fake_stack.cc",
    "asan_flags.cc",
    "asan_globals.cc",
    "asan_interceptors.cc",
    "asan_linux.cc",
    "asan_mac.cc",
    "asan_malloc_linux.cc",
    "asan_malloc_mac.cc",
    "asan_malloc_win.cc",
    "asan_poisoning.cc",
    "asan_posix.cc",
    "asan_report.cc",
    "asan_rtl.cc",
    "asan_stack.cc",
    "asan_stats.cc",
    "asan_suppressions.cc",
    "asan_thread.cc",
    "asan_win.cc",
]

asan_rtl_cxx_files = ["asan_new_delete.cc"]

asan_rtl_cflags = [
    "-fvisibility=hidden",
    "-fno-exceptions",
    "-DASAN_LOW_MEMORY=1",
    "-DASAN_NEEDS_SEGV=" + ASAN_NEEDS_SEGV,
    "-DASAN_HAS_EXCEPTIONS=" + ASAN_HAS_EXCEPTIONS,
    "-DASAN_FLEXIBLE_MAPPING_AND_OFFSET=" + ASAN_FLEXIBLE_MAPPING_AND_OFFSET,
    "-Wall",
    "-Werror",
    "-Wno-covered-switch-default",
    "-Wno-non-virtual-dtor",
    "-Wno-sign-compare",
    "-Wno-unused-parameter",
    "-std=c++11",
    "-fno-rtti",
    "-fno-builtin",
]

cc_library_static {
    name: "libasan",
    host_supported: true,
    recovery_available: true,
    defaults: ["asan_arch_defaults"],
    include_dirs: [
        "external/compiler-rt/lib",
        "external/compiler-rt/include",
    ],
    cflags: asan_rtl_cflags,
    target: {
        android: {
            srcs: ["asan_preinit.cc"],
            system_shared_libs: [],
        },
        host: {
            srcs: asan_rtl_files,
            whole_static_libs: [
                "libubsan",
                "libinterception",
                "liblsan",
                "libsan"
            ],
        },
    },

    sdk_version: "19",
    stl: "none",

    sanitize: {
        never: true,
    },
}

cc_library_host_static {
    name: "libasan_cxx",
    include_dirs: [
        "external/compiler-rt/lib",
        "external/compiler-rt/include",
    ],
    cflags: asan_rtl_cflags,
    srcs: asan_rtl_cxx_files,

    compile_multilib: "both",

    sanitize: {
        never: true,
    },
    target: {
        darwin: {
            enabled: false,
        },
    },
}

cc_binary {
    name: "asanwrapper",
    defaults: ["asan_arch_defaults"],

    srcs: ["asanwrapper.cc"],

    cflags: ["-Wall", "-Werror"],
    cppflags: ["-std=c++11"],
    sanitize: {
        never: true,
    },

    stl: "libc++",
}

// ANDROIDMK TRANSLATION ERROR: unsupported conditional
// ifneq (true,$(SKIP_LLVM_TESTS))
cc_library_static {
    name: "libasan_noinst_test",
    host_supported: true,
    defaults: ["asan_arch_defaults"],

    include_dirs: [
        "external/compiler-rt/include",
        "external/compiler-rt/lib",
        "external/compiler-rt/lib/asan/tests",
        "external/compiler-rt/lib/sanitizer_common/tests",
    ],
    cflags: [
        "-Wall",
        "-Werror",
        "-Wno-non-virtual-dtor",
        "-Wno-unused-parameter",
        "-Wno-sign-compare",
        "-DASAN_UAR=0",
        "-DASAN_HAS_BLACKLIST=1",
        "-DASAN_HAS_EXCEPTIONS=" + ASAN_HAS_EXCEPTIONS,
        "-DASAN_NEEDS_SEGV=" + ASAN_NEEDS_SEGV,
        "-std=c++11",
    ],
    srcs: [
        "tests/asan_noinst_test.cc",
        "tests/asan_test_main.cc",
    ],

    static_libs: ["libgtest"],

    sanitize: {
        never: true,
    },

    stl: "libc++",
}

cc_test {
    name: "asan_test",
    host_supported: true,
    defaults: ["asan_arch_defaults"],

    include_dirs: [
        "external/compiler-rt/lib",
        "external/compiler-rt/lib/asan/tests",
        "external/compiler-rt/lib/sanitizer_common/tests",
    ],
    cflags: [
        "-DASAN_LOW_MEMORY=1",
        "-DASAN_UAR=0",
        "-DASAN_NEEDS_SEGV=" + ASAN_NEEDS_SEGV,
        "-DASAN_HAS_EXCEPTIONS=" + ASAN_HAS_EXCEPTIONS,
        "-DASAN_HAS_BLACKLIST=1",
        "-Wall",
        "-Werror",
        "-Wno-covered-switch-default",
        "-Wno-non-virtual-dtor",
        "-Wno-sign-compare",
        "-Wno-unused-parameter",
        "-std=c++11",
    ],

    srcs: [
        "tests/asan_globals_test.cc",
        "tests/asan_test.cc",
        //"tests/asan_noinst_test.cc",
        //"tests/asan_test_main.cc",
    ],

    static_libs: ["libasan_noinst_test"],
    sanitize: {
        address: true,
        blacklist: "tests/asan_test.ignore",
    },

    stl: "libc++",
}

// ANDROIDMK TRANSLATION ERROR: endif from unsupported contitional
// endif
// SKIP_LLVM_TESTS