lkml.org 
[lkml]   [2016]   [Nov]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 13/30] perf clang: Update test case to use real BPF script
    Date
    Allow C++ code to use util.h and tests/llvm.h. Let 'perf test' compile a
    real BPF script.

    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    Cc: Alexei Starovoitov <ast@fb.com>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1474874832-134786-10-git-send-email-wangnan0@huawei.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/Makefile.config | 27 +++++++++++++++------------
    tools/perf/tests/llvm.h | 7 +++++++
    tools/perf/util/c++/clang-test.cpp | 17 ++++++++++++++---
    tools/perf/util/util-cxx.h | 26 ++++++++++++++++++++++++++
    4 files changed, 62 insertions(+), 15 deletions(-)
    create mode 100644 tools/perf/util/util-cxx.h

    diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
    index b7c9c80..09c2a98 100644
    --- a/tools/perf/Makefile.config
    +++ b/tools/perf/Makefile.config
    @@ -212,24 +212,27 @@ ifeq ($(DEBUG),0)
    endif
    endif

    -CFLAGS += -I$(src-perf)/util/include
    -CFLAGS += -I$(src-perf)/arch/$(ARCH)/include
    -CFLAGS += -I$(srctree)/tools/include/uapi
    -CFLAGS += -I$(srctree)/tools/include/
    -CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/uapi
    -CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/
    -CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/
    +INC_FLAGS += -I$(src-perf)/util/include
    +INC_FLAGS += -I$(src-perf)/arch/$(ARCH)/include
    +INC_FLAGS += -I$(srctree)/tools/include/uapi
    +INC_FLAGS += -I$(srctree)/tools/include/
    +INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/uapi
    +INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/
    +INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/

    # $(obj-perf) for generated common-cmds.h
    # $(obj-perf)/util for generated bison/flex headers
    ifneq ($(OUTPUT),)
    -CFLAGS += -I$(obj-perf)/util
    -CFLAGS += -I$(obj-perf)
    +INC_FLAGS += -I$(obj-perf)/util
    +INC_FLAGS += -I$(obj-perf)
    endif

    -CFLAGS += -I$(src-perf)/util
    -CFLAGS += -I$(src-perf)
    -CFLAGS += -I$(srctree)/tools/lib/
    +INC_FLAGS += -I$(src-perf)/util
    +INC_FLAGS += -I$(src-perf)
    +INC_FLAGS += -I$(srctree)/tools/lib/
    +
    +CFLAGS += $(INC_FLAGS)
    +CXXFLAGS += $(INC_FLAGS)

    CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE

    diff --git a/tools/perf/tests/llvm.h b/tools/perf/tests/llvm.h
    index 0eaa604..b835717 100644
    --- a/tools/perf/tests/llvm.h
    +++ b/tools/perf/tests/llvm.h
    @@ -1,6 +1,10 @@
    #ifndef PERF_TEST_LLVM_H
    #define PERF_TEST_LLVM_H

    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    #include <stddef.h> /* for size_t */
    #include <stdbool.h> /* for bool */

    @@ -20,4 +24,7 @@ enum test_llvm__testcase {
    int test_llvm__fetch_bpf_obj(void **p_obj_buf, size_t *p_obj_buf_sz,
    enum test_llvm__testcase index, bool force,
    bool *should_load_fail);
    +#ifdef __cplusplus
    +}
    +#endif
    #endif
    diff --git a/tools/perf/util/c++/clang-test.cpp b/tools/perf/util/c++/clang-test.cpp
    index 0f484fb..d84e760 100644
    --- a/tools/perf/util/c++/clang-test.cpp
    +++ b/tools/perf/util/c++/clang-test.cpp
    @@ -3,6 +3,10 @@
    #include "llvm/IR/Function.h"
    #include "llvm/IR/LLVMContext.h"

    +#include <util-cxx.h>
    +#include <tests/llvm.h>
    +#include <string>
    +
    class perf_clang_scope {
    public:
    explicit perf_clang_scope() {perf_clang__init();}
    @@ -14,17 +18,24 @@ extern "C" {
    int test__clang_to_IR(void)
    {
    perf_clang_scope _scope;
    + unsigned int kernel_version;
    +
    + if (fetch_kernel_version(&kernel_version, NULL, 0))
    + return -1;
    +
    + std::string cflag_kver("-DLINUX_VERSION_CODE=" +
    + std::to_string(kernel_version));

    std::unique_ptr<llvm::Module> M =
    - perf::getModuleFromSource({"-DRESULT=1"},
    + perf::getModuleFromSource({cflag_kver.c_str()},
    "perf-test.c",
    - "int myfunc(void) {return RESULT;}");
    + test_llvm__bpf_base_prog);

    if (!M)
    return -1;

    for (llvm::Function& F : *M)
    - if (F.getName() == "myfunc")
    + if (F.getName() == "bpf_func__SyS_epoll_wait")
    return 0;
    return -1;
    }
    diff --git a/tools/perf/util/util-cxx.h b/tools/perf/util/util-cxx.h
    new file mode 100644
    index 0000000..0e0e019
    --- /dev/null
    +++ b/tools/perf/util/util-cxx.h
    @@ -0,0 +1,26 @@
    +/*
    + * Support C++ source use utilities defined in util.h
    + */
    +
    +#ifndef PERF_UTIL_UTIL_CXX_H
    +#define PERF_UTIL_UTIL_CXX_H
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/*
    + * Now 'new' is the only C++ keyword found in util.h:
    + * in tools/include/linux/rbtree.h
    + *
    + * Other keywords, like class and delete, should be
    + * redefined if necessary.
    + */
    +#define new _new
    +#include "util.h"
    +#undef new
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +#endif
    --
    2.10.1
    \
     
     \ /
      Last update: 2016-11-26 08:07    [W:4.102 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site