diff --git a/debian/changelog b/debian/changelog index 0aab707..fe33db2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +bpftrace (0.20.2-1ubuntu4) noble; urgency=medium + + * Really do build the tests, we need them for autopkgtest + * d/patches: Cherry-pick LLVM-18 fixes from upstream (LP: #2060766) + * Disable newly failing test + + -- Mate Kukri Wed, 10 Apr 2024 12:36:37 +0100 + bpftrace (0.20.2-1ubuntu3) noble; urgency=medium * d/t/control: Run testsuite as autopkgtest (LP:2052809) diff --git a/debian/control b/debian/control index 8ed82cc..c579cd9 100644 --- a/debian/control +++ b/debian/control @@ -21,7 +21,9 @@ Build-Depends: asciidoctor, libgtest-dev, llvm-18-dev, systemtap-sdt-dev, - zlib1g-dev + zlib1g-dev, + xxd, + pahole Homepage: https://github.com/iovisor/bpftrace Vcs-Git: https://salsa.debian.org/debian/bpftrace.git Vcs-Browser: https://salsa.debian.org/debian/bpftrace diff --git a/debian/patches/disable_failing_tests.patch b/debian/patches/disable_failing_tests.patch index 0af936a..fcb9e34 100644 --- a/debian/patches/disable_failing_tests.patch +++ b/debian/patches/disable_failing_tests.patch @@ -1,13 +1,47 @@ -Description: Disable failing tests -Author: Mate Kukri +From: Mate Kukri +Date: Wed, 10 Apr 2024 12:14:28 +0100 +Subject: Disable failing tests + Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/bpftrace/+bug/2052809 Forwarded: no + Last-Update: 2024-03-15 --- -This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ + tests/child.cpp | 2 ++ + tests/probe.cpp | 2 ++ + tests/runtime/basic | 2 +- + tests/runtime/call | 23 ----------------------- + tests/runtime/json-output | 6 ------ + tests/runtime/probe | 9 --------- + tests/semantic_analyser.cpp | 4 ++++ + tests/utils.cpp | 2 ++ + 8 files changed, 11 insertions(+), 39 deletions(-) + +diff --git a/tests/child.cpp b/tests/child.cpp +index 52b3a22..6492445 100644 +--- a/tests/child.cpp ++++ b/tests/child.cpp +@@ -208,6 +208,7 @@ TEST(childproc, ptrace_child_term_before_execve) + EXPECT_EQ(child->term_signal(), 15); + } + ++#if 0 + TEST(childproc, multi_exec_match) + { + std::error_code ec; +@@ -263,6 +264,7 @@ TEST(childproc, multi_exec_match) + EXPECT_EQ(::setenv("PATH", old_path, 1), 0); + EXPECT_GT(std_filesystem::remove_all(tmpdir), 0); + } ++#endif + + } // namespace child + } // namespace test +diff --git a/tests/probe.cpp b/tests/probe.cpp +index 8bb8189..084214a 100644 --- a/tests/probe.cpp +++ b/tests/probe.cpp -@@ -63,6 +63,7 @@ +@@ -63,6 +63,7 @@ void compare_bytecode(const std::string &input1, const std::string &input2) EXPECT_EQ(expected_output1.str(), expected_output2.str()); } @@ -15,7 +49,7 @@ This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ TEST(probe, short_name) { compare_bytecode("tracepoint:a:b { args }", "t:a:b { args }"); -@@ -74,6 +75,7 @@ +@@ -74,6 +75,7 @@ TEST(probe, short_name) compare_bytecode("software:faults:1000 { 1 }", "s:faults:1000 { 1 }"); compare_bytecode("interval:s:1 { 1 }", "i:s:1 { 1 }"); } @@ -23,9 +57,23 @@ This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ class probe_btf : public test_btf { +diff --git a/tests/runtime/basic b/tests/runtime/basic +index 3b66c15..5c3a9e9 100644 +--- a/tests/runtime/basic ++++ b/tests/runtime/basic +@@ -1,6 +1,6 @@ + NAME it shows version + RUN {{BPFTRACE}} --version +-EXPECT bpftrace v ++EXPECT bpftrace + TIMEOUT 1 + + NAME it shows usage with help flag +diff --git a/tests/runtime/call b/tests/runtime/call +index 2d7d9fc..a2adeaf 100644 --- a/tests/runtime/call +++ b/tests/runtime/call -@@ -233,13 +233,6 @@ +@@ -233,13 +233,6 @@ EXPECT Attaching 1 probe TIMEOUT 5 AFTER ./testprogs/syscall nanosleep 1e8 @@ -39,7 +87,7 @@ This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ NAME ustack_stack_mode_env_perf PROG k:do_nanosleep { printf("%s", ustack(1)); exit(); } ENV BPFTRACE_STACK_MODE=perf -@@ -408,13 +401,6 @@ +@@ -408,13 +401,6 @@ PROG BEGIN { print("BEGIN"); @[1] = hist(10); @[2] = hist(20); @[3] = hist(30); EXPECT BEGIN\n@\[1\]:(.*\n)+@\[2\]:(.*\n)+@\[3\]:(.*\n)+END TIMEOUT 1 @@ -53,7 +101,7 @@ This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ NAME strcontains RUN {{BPFTRACE}} -ve 'kfunc:filp_close { $f = path(args.filp->f_path); if (strcontains($f, "tmp")) { printf("OK\n"); exit(); } }' EXPECT OK -@@ -518,15 +504,6 @@ +@@ -518,15 +504,6 @@ RUN {{BPFTRACE}} -e 'BEGIN { printf("%x", bswap(bswap(0x1234))); exit(); }' EXPECT 1234 TIMEOUT 1 @@ -69,9 +117,28 @@ This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ NAME debugf RUN echo > /sys/kernel/debug/tracing/trace; {{BPFTRACE}} -e 'i:ms:1 { debugf("debugf"); exit();}'; cat /sys/kernel/debug/tracing/trace EXPECT bpf_trace_printk: debugf +diff --git a/tests/runtime/json-output b/tests/runtime/json-output +index 8726566..7cf61fa 100644 +--- a/tests/runtime/json-output ++++ b/tests/runtime/json-output +@@ -39,12 +39,6 @@ PROG BEGIN { @["bpftrace"] = hist(2); @["curl"] = hist(-1); @["curl"] = hist(0); + EXPECT_JSON runtime/outputs/hist_multiple.json + TIMEOUT 5 + +-NAME histogram-finegrain +-PROG i:us:100 { @ = hist(@n++,3); if (@n > 1023) { delete(@n); exit(); }} +-EXPECT_JSON runtime/outputs/hist_2args.json +-TIMEOUT 5 +- +- + NAME linear histogram + PROG BEGIN { @h = lhist(2, 0, 100, 10); @h = lhist(50, 0, 100, 10); @h = lhist(1000, 0, 100, 10); exit(); } + EXPECT_JSON runtime/outputs/lhist.json +diff --git a/tests/runtime/probe b/tests/runtime/probe +index 86ed616..f6b5677 100644 --- a/tests/runtime/probe +++ b/tests/runtime/probe -@@ -148,15 +148,6 @@ +@@ -148,15 +148,6 @@ EXPECT progs: [1-9][0-9]+ TIMEOUT 5 REQUIRES /usr/sbin/bpftool @@ -87,9 +154,11 @@ This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ NAME kprobe_offset_module RUN {{BPFTRACE}} -e 'kprobe:nft_trans_alloc_gfp+0x5 { printf("hit\n"); exit(); }' AFTER /usr/sbin/nft add table bpftrace +diff --git a/tests/semantic_analyser.cpp b/tests/semantic_analyser.cpp +index 88bf3db..e6f3a95 100644 --- a/tests/semantic_analyser.cpp +++ b/tests/semantic_analyser.cpp -@@ -1485,6 +1485,7 @@ +@@ -1485,6 +1485,7 @@ TEST(semantic_analyser, kprobe) test("kretprobe:f { 1 }", 0); } @@ -97,7 +166,7 @@ This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ TEST(semantic_analyser, uprobe) { test("uprobe:/bin/sh:f { 1 }", 0); -@@ -1519,6 +1520,7 @@ +@@ -1519,6 +1520,7 @@ TEST(semantic_analyser, usdt) test("usdt:/notexistfile:probe { 1 }", 1); test("usdt:notexistfile:probe { 1 }", 1); } @@ -105,7 +174,7 @@ This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ TEST(semantic_analyser, begin_end_probes) { -@@ -1804,6 +1806,7 @@ +@@ -1804,6 +1806,7 @@ TEST(semantic_analyser, struct_as_map_key) 2); } @@ -113,7 +182,7 @@ This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ TEST(semantic_analyser, probe_short_name) { test("t:a:b { args }", 0); -@@ -1816,6 +1819,7 @@ +@@ -1816,6 +1819,7 @@ TEST(semantic_analyser, probe_short_name) test("s:faults:1000 { 1 }", 0); test("i:s:1 { 1 }", 0); } @@ -121,46 +190,23 @@ This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ TEST(semantic_analyser, positional_parameters) { ---- a/tests/runtime/json-output -+++ b/tests/runtime/json-output -@@ -39,12 +39,6 @@ - EXPECT_JSON runtime/outputs/hist_multiple.json - TIMEOUT 5 - --NAME histogram-finegrain --PROG i:us:100 { @ = hist(@n++,3); if (@n > 1023) { delete(@n); exit(); }} --EXPECT_JSON runtime/outputs/hist_2args.json --TIMEOUT 5 -- -- - NAME linear histogram - PROG BEGIN { @h = lhist(2, 0, 100, 10); @h = lhist(50, 0, 100, 10); @h = lhist(1000, 0, 100, 10); exit(); } - EXPECT_JSON runtime/outputs/lhist.json ---- a/tests/runtime/basic -+++ b/tests/runtime/basic -@@ -1,6 +1,6 @@ - NAME it shows version - RUN {{BPFTRACE}} --version --EXPECT bpftrace v -+EXPECT bpftrace - TIMEOUT 1 - - NAME it shows usage with help flag ---- a/tests/child.cpp -+++ b/tests/child.cpp -@@ -208,6 +208,7 @@ - EXPECT_EQ(child->term_signal(), 15); +diff --git a/tests/utils.cpp b/tests/utils.cpp +index 9a192cc..8a65951 100644 +--- a/tests/utils.cpp ++++ b/tests/utils.cpp +@@ -363,6 +363,7 @@ TEST(utils, get_pids_for_program) + ASSERT_EQ(pids.size(), 0); } +#if 0 - TEST(childproc, multi_exec_match) + TEST(utils, file_exists_and_ownedby_root) { - std::error_code ec; -@@ -263,6 +264,7 @@ - EXPECT_EQ(::setenv("PATH", old_path, 1), 0); + std::string tmpdir = "/tmp/bpftrace-test-utils-XXXXXX"; +@@ -384,6 +385,7 @@ TEST(utils, file_exists_and_ownedby_root) + EXPECT_GT(std_filesystem::remove_all(tmpdir), 0); } +#endif - } // namespace child + } // namespace utils } // namespace test diff --git a/debian/patches/llvm-18/ast-Adjust-to-enum-changes-in-llvm-18.patch b/debian/patches/llvm-18/ast-Adjust-to-enum-changes-in-llvm-18.patch new file mode 100644 index 0000000..58adb86 --- /dev/null +++ b/debian/patches/llvm-18/ast-Adjust-to-enum-changes-in-llvm-18.patch @@ -0,0 +1,42 @@ +From: Khem Raj +Date: Fri, 16 Feb 2024 10:40:21 -0800 +Subject: ast: Adjust to enum changes in llvm 18 + +llvm 18 has change CodeGenOpt::Level/CodeGenFileType into enum classes via +https://github.com/llvm/llvm-project/commit/0a1aa6cda2758b0926a95f87d39ffefb1cb90200 + +Signed-off-by: Khem Raj +Signed-off-by: Daniel Xu + +Origin: https://github.com/bpftrace/bpftrace/commit/a0c74a53b620fd49d24a3965bf8e5ab01fd9dd45 +--- + src/ast/passes/codegen_llvm.cpp | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/src/ast/passes/codegen_llvm.cpp b/src/ast/passes/codegen_llvm.cpp +index 0e00a14..f3aa091 100644 +--- a/src/ast/passes/codegen_llvm.cpp ++++ b/src/ast/passes/codegen_llvm.cpp +@@ -72,7 +72,11 @@ CodegenLLVM::CodegenLLVM(Node *root, BPFtrace &bpftrace) + Optional() + #endif + )); ++#if LLVM_VERSION_MAJOR >= 18 ++ target_machine_->setOptLevel(llvm::CodeGenOptLevel::Aggressive); ++#else + target_machine_->setOptLevel(llvm::CodeGenOpt::Aggressive); ++#endif + + module_->setTargetTriple(LLVMTargetTriple); + module_->setDataLayout(target_machine_->createDataLayout()); +@@ -3617,7 +3621,9 @@ void CodegenLLVM::emit(raw_pwrite_stream &stream) + { + legacy::PassManager PM; + +-#if LLVM_VERSION_MAJOR >= 10 ++#if LLVM_VERSION_MAJOR >= 18 ++ auto type = CodeGenFileType::ObjectFile; ++#elif LLVM_VERSION_MAJOR >= 10 + auto type = llvm::CGFT_ObjectFile; + #else + auto type = llvm::TargetMachine::CGFT_ObjectFile; diff --git a/debian/patches/llvm-18.diff b/debian/patches/llvm-18/ast-Repace-getInt8PtrTy-with-getPtrTy.patch similarity index 63% rename from debian/patches/llvm-18.diff rename to debian/patches/llvm-18/ast-Repace-getInt8PtrTy-with-getPtrTy.patch index a9554cd..5b01b72 100644 --- a/debian/patches/llvm-18.diff +++ b/debian/patches/llvm-18/ast-Repace-getInt8PtrTy-with-getPtrTy.patch @@ -1,295 +1,294 @@ ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -139,7 +139,7 @@ else() - endif() - - set(MIN_LLVM_MAJOR 6) --set(MAX_LLVM_MAJOR 17) -+set(MAX_LLVM_MAJOR 18) - - if((${LLVM_VERSION_MAJOR} VERSION_LESS ${MIN_LLVM_MAJOR}) OR (${LLVM_VERSION_MAJOR} VERSION_GREATER ${MAX_LLVM_MAJOR})) - message(SEND_ERROR "Unsupported LLVM version found via ${LLVM_INCLUDE_DIRS}: ${LLVM_VERSION_MAJOR}") ---- a/src/ast/dibuilderbpf.cpp -+++ b/src/ast/dibuilderbpf.cpp -@@ -16,7 +16,7 @@ void DIBuilderBPF::createFunctionDebugIn - // BPF probe function has: - // - int return type - // - single parameter (ctx) of a pointer type -- SmallVector types = { getInt64Ty(), getInt8PtrTy() }; -+ SmallVector types = { getInt64Ty(), getPtrTy() }; - - DISubroutineType *ditype = createSubroutineType(getOrCreateTypeArray(types)); - -@@ -59,7 +59,7 @@ DIType *DIBuilderBPF::getInt64Ty() - return types_.int64; - } - --DIType *DIBuilderBPF::getInt8PtrTy() -+DIType *DIBuilderBPF::getPtrTy() - { - if (!types_.int8_ptr) - types_.int8_ptr = createPointerType( ---- a/src/ast/dibuilderbpf.h -+++ b/src/ast/dibuilderbpf.h -@@ -15,7 +15,7 @@ public: - void createFunctionDebugInfo(Function &func); - - DIType *getInt64Ty(); -- DIType *getInt8PtrTy(); -+ DIType *getPtrTy(); - - DIFile *file = nullptr; - +From: Khem Raj +Date: Fri, 16 Feb 2024 10:32:27 -0800 +Subject: ast: Repace getInt8PtrTy with getPtrTy + +getPtrTy is added in LLVM-15 and is to be used instead of getInt8PtrTy +which is gone in LLVM-18 onwards + +https://github.com/llvm/llvm-project/commit/7e0802aeb5b90 + +Signed-off-by: Khem Raj +Signed-off-by: Daniel Xu + +Backport of upstream commit. + +Origin: https://github.com/bpftrace/bpftrace/commit/c1f910923534a8444d58d66cc884e15ac1cf6260 +--- + src/ast/irbuilderbpf.cpp | 67 +++++++++++++++++++---------------------- + src/ast/irbuilderbpf.h | 6 ++++ + src/ast/passes/codegen_llvm.cpp | 22 +++++++------- + 3 files changed, 48 insertions(+), 47 deletions(-) + +diff --git a/src/ast/irbuilderbpf.cpp b/src/ast/irbuilderbpf.cpp +index 241ee74..704f0a2 100644 --- a/src/ast/irbuilderbpf.cpp +++ b/src/ast/irbuilderbpf.cpp -@@ -350,7 +350,7 @@ CallInst *IRBuilderBPF::createMapLookup( +@@ -350,7 +350,7 @@ CallInst *IRBuilderBPF::createMapLookup(int mapid, Value *key, const std::string &name) { - return createMapLookup(mapid, key, getInt8PtrTy(), name); -+ return createMapLookup(mapid, key, getPtrTy(), name); ++ return createMapLookup(mapid, key, GET_PTR_TY(), name); } CallInst *IRBuilderBPF::createMapLookup(int mapid, -@@ -378,7 +378,7 @@ CallInst *IRBuilderBPF::CreateGetJoinMap +@@ -378,7 +378,7 @@ CallInst *IRBuilderBPF::CreateGetJoinMap(BasicBlock *failure_callback, { return createGetScratchMap(bpftrace_.maps[MapManager::Type::Join].value()->id, "join", - getInt8PtrTy(), -+ getPtrTy(), ++ GET_PTR_TY(), loc, failure_callback); } -@@ -407,8 +407,8 @@ CallInst *IRBuilderBPF::createGetScratch +@@ -407,8 +407,8 @@ CallInst *IRBuilderBPF::createGetScratchMap(int mapid, BasicBlock *lookup_merge_block = BasicBlock::Create( module_.getContext(), "lookup_" + name + "_merge", parent); Value *condition = CreateICmpNE( - CreateIntCast(call, getInt8PtrTy(), true), - ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), getInt8PtrTy()), -+ CreateIntCast(call, getPtrTy(), true), -+ ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), getPtrTy()), ++ CreateIntCast(call, GET_PTR_TY(), true), ++ ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), GET_PTR_TY()), "lookup_" + name + "_cond"); CreateCondBr(condition, lookup_merge_block, lookup_failure_block); -@@ -428,7 +428,7 @@ Value *IRBuilderBPF::CreateMapLookupElem +@@ -428,7 +428,7 @@ Value *IRBuilderBPF::CreateMapLookupElem(Value *ctx, Value *key, const location &loc) { - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); int mapid = bpftrace_.maps[map.ident].value()->id; return CreateMapLookupElem(ctx, mapid, key, map.type, loc); } -@@ -439,7 +439,7 @@ Value *IRBuilderBPF::CreateMapLookupElem +@@ -439,7 +439,7 @@ Value *IRBuilderBPF::CreateMapLookupElem(Value *ctx, SizedType &type, const location &loc) { - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); CallInst *call = createMapLookup(mapid, key); // Check if result == 0 -@@ -450,8 +450,8 @@ Value *IRBuilderBPF::CreateMapLookupElem +@@ -450,8 +450,8 @@ Value *IRBuilderBPF::CreateMapLookupElem(Value *ctx, AllocaInst *value = CreateAllocaBPF(type, "lookup_elem_val"); Value *condition = CreateICmpNE( - CreateIntCast(call, getInt8PtrTy(), true), - ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), getInt8PtrTy()), -+ CreateIntCast(call, getPtrTy(), true), -+ ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), getPtrTy()), ++ CreateIntCast(call, GET_PTR_TY(), true), ++ ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), GET_PTR_TY()), "map_lookup_cond"); CreateCondBr(condition, lookup_success_block, lookup_failure_block); -@@ -494,7 +494,7 @@ void IRBuilderBPF::CreateMapUpdateElem(V +@@ -494,7 +494,7 @@ void IRBuilderBPF::CreateMapUpdateElem(Value *ctx, { Value *map_ptr = CreateBpfPseudoCallId(map); - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); assert(key->getType()->isPointerTy()); assert(val->getType()->isPointerTy()); -@@ -523,7 +523,7 @@ void IRBuilderBPF::CreateMapDeleteElem(V +@@ -523,7 +523,7 @@ void IRBuilderBPF::CreateMapDeleteElem(Value *ctx, Value *key, const location &loc) { - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); assert(key->getType()->isPointerTy()); Value *map_ptr = CreateBpfPseudoCallId(map); -@@ -586,7 +586,7 @@ void IRBuilderBPF::CreateProbeRead(Value +@@ -586,7 +586,7 @@ void IRBuilderBPF::CreateProbeRead(Value *ctx, AddrSpace as, const location &loc) { - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); assert(size && size->getType()->getIntegerBitWidth() <= 32); size = CreateIntCast(size, getInt32Ty(), false); -@@ -625,7 +625,7 @@ CallInst *IRBuilderBPF::CreateProbeReadS +@@ -625,7 +625,7 @@ CallInst *IRBuilderBPF::CreateProbeReadStr(Value *ctx, AddrSpace as, const location &loc) { - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); assert(size && size->getType()->isIntegerTy()); if ([[maybe_unused]] auto *dst_alloca = dyn_cast(dst)) { -@@ -660,7 +660,7 @@ Value *IRBuilderBPF::CreateUSDTReadArgum +@@ -660,7 +660,7 @@ Value *IRBuilderBPF::CreateUSDTReadArgument(Value *ctx, AddrSpace as, const location &loc) { - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); // Argument size must be 1, 2, 4, or 8. See // https://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation int abs_size = std::abs(argument->size); -@@ -766,7 +766,7 @@ Value *IRBuilderBPF::CreateUSDTReadArgum +@@ -766,7 +766,7 @@ Value *IRBuilderBPF::CreateUSDTReadArgument(Value *ctx, AddrSpace as, const location &loc) { - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); struct bcc_usdt_argument argument; void *usdt; -@@ -1419,7 +1419,7 @@ CallInst *IRBuilderBPF::CreateGetStackId +@@ -1419,7 +1419,7 @@ CallInst *IRBuilderBPF::CreateGetStackId(Value *ctx, StackType stack_type, const location &loc) { - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); Value *map_ptr = CreateBpfPseudoCallId( bpftrace_.maps[stack_type].value()->id); -@@ -1433,7 +1433,7 @@ CallInst *IRBuilderBPF::CreateGetStackId +@@ -1432,9 +1432,7 @@ CallInst *IRBuilderBPF::CreateGetStackId(Value *ctx, + // long bpf_get_stackid(struct pt_regs *ctx, struct bpf_map *map, u64 flags) // Return: >= 0 stackid on success or negative error FunctionType *getstackid_func_type = FunctionType::get( - getInt64Ty(), +- getInt64Ty(), - { getInt8PtrTy(), map_ptr->getType(), getInt64Ty() }, -+ { getPtrTy(), map_ptr->getType(), getInt64Ty() }, - false); +- false); ++ getInt64Ty(), { GET_PTR_TY(), map_ptr->getType(), getInt64Ty() }, false); CallInst *call = CreateHelperCall(libbpf::BPF_FUNC_get_stackid, getstackid_func_type, -@@ -1482,7 +1482,7 @@ void IRBuilderBPF::CreateOutput(Value *c + { ctx, map_ptr, flags_val }, +@@ -1482,7 +1480,7 @@ void IRBuilderBPF::CreateOutput(Value *ctx, size_t size, const location *loc) { - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); assert(data && data->getType()->isPointerTy()); if (bpftrace_.feature_->has_map_ringbuf()) -@@ -1551,8 +1551,8 @@ void IRBuilderBPF::CreateAtomicIncCounte +@@ -1551,8 +1549,8 @@ void IRBuilderBPF::CreateAtomicIncCounter(int mapid, uint32_t idx) parent); Value *condition = CreateICmpNE( - CreateIntCast(call, getInt8PtrTy(), true), - ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), getInt8PtrTy()), -+ CreateIntCast(call, getPtrTy(), true), -+ ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), getPtrTy()), ++ CreateIntCast(call, GET_PTR_TY(), true), ++ ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), GET_PTR_TY()), "map_lookup_cond"); CreateCondBr(condition, lookup_success_block, lookup_failure_block); -@@ -1609,8 +1609,8 @@ void IRBuilderBPF::CreateMapElemAdd(Valu +@@ -1609,8 +1607,8 @@ void IRBuilderBPF::CreateMapElemAdd(Value *ctx, AllocaInst *value = CreateAllocaBPF(type, "lookup_elem_val"); Value *condition = CreateICmpNE( - CreateIntCast(call, getInt8PtrTy(), true), - ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), getInt8PtrTy()), -+ CreateIntCast(call, getPtrTy(), true), -+ ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), getPtrTy()), ++ CreateIntCast(call, GET_PTR_TY(), true), ++ ConstantExpr::getCast(Instruction::IntToPtr, getInt64(0), GET_PTR_TY()), "map_lookup_cond"); CreateCondBr(condition, lookup_success_block, lookup_failure_block); -@@ -1646,7 +1646,7 @@ void IRBuilderBPF::CreatePerfEventOutput +@@ -1646,7 +1644,7 @@ void IRBuilderBPF::CreatePerfEventOutput(Value *ctx, // long bpf_perf_event_output(struct pt_regs *ctx, struct bpf_map *map, // u64 flags, void *data, u64 size) FunctionType *perfoutput_func_type = FunctionType::get(getInt64Ty(), - { getInt8PtrTy(), -+ { getPtrTy(), ++ { GET_PTR_TY(), map_ptr->getType(), getInt64Ty(), data->getType(), -@@ -1690,7 +1690,7 @@ void IRBuilderBPF::CreateTracePrintk(Val +@@ -1690,7 +1688,7 @@ void IRBuilderBPF::CreateTracePrintk(Value *fmt_ptr, // long bpf_trace_printk(const char *fmt, u32 fmt_size, ...) FunctionType *traceprintk_func_type = FunctionType::get( - getInt64Ty(), { getInt8PtrTy(), getInt32Ty() }, true); -+ getInt64Ty(), { getPtrTy(), getInt32Ty() }, true); ++ getInt64Ty(), { GET_PTR_TY(), getInt32Ty() }, true); CreateHelperCall(libbpf::BPF_FUNC_trace_printk, traceprintk_func_type, -@@ -1721,7 +1721,7 @@ void IRBuilderBPF::CreateOverrideReturn( +@@ -1721,7 +1719,7 @@ void IRBuilderBPF::CreateOverrideReturn(Value *ctx, Value *rc) // long bpf_override_return(struct pt_regs *regs, u64 rc) // Return: 0 FunctionType *override_func_type = FunctionType::get( - getInt64Ty(), { getInt8PtrTy(), getInt64Ty() }, false); -+ getInt64Ty(), { getPtrTy(), getInt64Ty() }, false); ++ getInt64Ty(), { GET_PTR_TY(), getInt64Ty() }, false); PointerType *override_func_ptr_type = PointerType::get(override_func_type, 0); Constant *override_func = ConstantExpr::getCast(Instruction::IntToPtr, getInt64(libbpf::BPF_FUNC_override_return), -@@ -1901,7 +1901,7 @@ void IRBuilderBPF::CreateHelperError(Val +@@ -1901,7 +1899,7 @@ void IRBuilderBPF::CreateHelperError(Value *ctx, libbpf::bpf_func_id func_id, const location &loc) { - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); assert(return_value && return_value->getType() == getInt32Ty()); if (bpftrace_.helper_check_level_ == 0 || -@@ -1941,7 +1941,7 @@ void IRBuilderBPF::CreateHelperErrorCond +@@ -1941,7 +1939,7 @@ void IRBuilderBPF::CreateHelperErrorCond(Value *ctx, const location &loc, bool compare_zero) { - assert(ctx && ctx->getType() == getInt8PtrTy()); -+ assert(ctx && ctx->getType() == getPtrTy()); ++ assert(ctx && ctx->getType() == GET_PTR_TY()); if (bpftrace_.helper_check_level_ == 0 || (bpftrace_.helper_check_level_ == 1 && return_zero_if_err(func_id))) return; -@@ -1977,7 +1977,7 @@ void IRBuilderBPF::CreatePath(Value *ctx +@@ -1977,7 +1975,7 @@ void IRBuilderBPF::CreatePath(Value *ctx, // int bpf_d_path(struct path *path, char *buf, u32 sz) // Return: 0 or error FunctionType *d_path_func_type = FunctionType::get( - getInt64Ty(), { getInt8PtrTy(), buf->getType(), getInt32Ty() }, false); -+ getInt64Ty(), { getPtrTy(), buf->getType(), getInt32Ty() }, false); ++ getInt64Ty(), { GET_PTR_TY(), buf->getType(), getInt32Ty() }, false); CallInst *call = CreateHelperCall( libbpf::bpf_func_id::BPF_FUNC_d_path, d_path_func_type, -@@ -1999,9 +1999,9 @@ void IRBuilderBPF::CreateSeqPrintf(Value +@@ -1997,13 +1995,10 @@ void IRBuilderBPF::CreateSeqPrintf(Value *ctx, + // long bpf_seq_printf(struct seq_file *m, const char *fmt, __u32 fmt_size, + // const void *data, __u32 data_len) // Return: 0 or error - FunctionType *seq_printf_func_type = FunctionType::get(getInt64Ty(), - { getInt64Ty(), +- FunctionType *seq_printf_func_type = FunctionType::get(getInt64Ty(), +- { getInt64Ty(), - getInt8PtrTy(), -+ getPtrTy(), - getInt32Ty(), +- getInt32Ty(), - getInt8PtrTy(), -+ getPtrTy(), - getInt32Ty() }, - false); +- getInt32Ty() }, +- false); ++ FunctionType *seq_printf_func_type = FunctionType::get( ++ getInt64Ty(), ++ { getInt64Ty(), GET_PTR_TY(), getInt32Ty(), GET_PTR_TY(), getInt32Ty() }, ++ false); PointerType *seq_printf_func_ptr_type = PointerType::get(seq_printf_func_type, ---- a/src/ast/passes/codegen_llvm.cpp -+++ b/src/ast/passes/codegen_llvm.cpp -@@ -72,7 +72,7 @@ CodegenLLVM::CodegenLLVM(Node *root, BPF - Optional() + 0); + Constant *seq_printf_func = ConstantExpr::getCast( +diff --git a/src/ast/irbuilderbpf.h b/src/ast/irbuilderbpf.h +index 739aa75..a5148b6 100644 +--- a/src/ast/irbuilderbpf.h ++++ b/src/ast/irbuilderbpf.h +@@ -46,6 +46,12 @@ + CreateAtomicRMW((op), (ptr), (val), (order)) #endif - )); -- target_machine_->setOptLevel(llvm::CodeGenOpt::Aggressive); -+ target_machine_->setOptLevel(llvm::CodeGenOptLevel::Aggressive); - module_->setTargetTriple(LLVMTargetTriple); - module_->setDataLayout(target_machine_->createDataLayout()); ++#if LLVM_VERSION_MAJOR >= 15 ++#define GET_PTR_TY() getPtrTy() ++#else ++#define GET_PTR_TY() getInt8PtrTy() ++#endif ++ + namespace bpftrace { + namespace ast { + +diff --git a/src/ast/passes/codegen_llvm.cpp b/src/ast/passes/codegen_llvm.cpp +index c7adc42..0e00a14 100644 +--- a/src/ast/passes/codegen_llvm.cpp ++++ b/src/ast/passes/codegen_llvm.cpp @@ -439,10 +439,10 @@ void CodegenLLVM::visit(Call &call) AllocaInst *value = b_.CreateAllocaBPF(type, "lookup_elem_val"); Value *condition = b_.CreateICmpNE( - b_.CreateIntCast(lookup, b_.getInt8PtrTy(), true), -+ b_.CreateIntCast(lookup, b_.getPtrTy(), true), ++ b_.CreateIntCast(lookup, b_.GET_PTR_TY(), true), ConstantExpr::getCast(Instruction::IntToPtr, b_.getInt64(0), - b_.getInt8PtrTy()), -+ b_.getPtrTy()), ++ b_.GET_PTR_TY()), "map_lookup_cond"); b_.CreateCondBr(condition, lookup_success_block, lookup_failure_block); @@ -298,11 +297,11 @@ AllocaInst *value = b_.CreateAllocaBPF(type, "lookup_elem_val"); Value *condition = b_.CreateICmpNE( - b_.CreateIntCast(lookup, b_.getInt8PtrTy(), true), -+ b_.CreateIntCast(lookup, b_.getPtrTy(), true), ++ b_.CreateIntCast(lookup, b_.GET_PTR_TY(), true), ConstantExpr::getCast(Instruction::IntToPtr, b_.getInt64(0), - b_.getInt8PtrTy()), -+ b_.getPtrTy()), ++ b_.GET_PTR_TY()), "map_lookup_cond"); b_.CreateCondBr(condition, lookup_success_block, lookup_failure_block); @@ -311,7 +310,7 @@ : Instruction::IntToPtr, expr_, - b_.getInt8PtrTy()), -+ b_.getPtrTy()), ++ b_.GET_PTR_TY()), call.loc); expr_ = buf; expr_deleter_ = [this, buf]() { b_.CreateLifetimeEnd(buf); }; @@ -320,10 +319,10 @@ // and finally the seq_printf call b_.CreateSeqPrintf(ctx_, - b_.CreateIntToPtr(fmt, b_.getInt8PtrTy()), -+ b_.CreateIntToPtr(fmt, b_.getPtrTy()), ++ b_.CreateIntToPtr(fmt, b_.GET_PTR_TY()), b_.getInt32(size), - b_.CreatePointerCast(data, b_.getInt8PtrTy()), -+ b_.CreatePointerCast(data, b_.getPtrTy()), ++ b_.CreatePointerCast(data, b_.GET_PTR_TY()), b_.getInt32(data_size), call.loc); @@ -332,16 +331,16 @@ } - b_.CreateTracePrintk(b_.CreateIntToPtr(fmt, b_.getInt8PtrTy()), -+ b_.CreateTracePrintk(b_.CreateIntToPtr(fmt, b_.getPtrTy()), ++ b_.CreateTracePrintk(b_.CreateIntToPtr(fmt, b_.GET_PTR_TY()), b_.getInt32(size), values, call.loc); -@@ -2093,7 +2093,7 @@ void CodegenLLVM::visit(FieldAccess &acc +@@ -2093,7 +2093,7 @@ void CodegenLLVM::visit(FieldAccess &acc) // `is_data_loc` should only be set if field access is on `args` which // has to be a ctx access assert(type.IsCtxAccess()); - assert(ctx_->getType() == b_.getInt8PtrTy()); -+ assert(ctx_->getType() == b_.getPtrTy()); ++ assert(ctx_->getType() == b_.GET_PTR_TY()); // Parser needs to have rewritten field to be a u64 assert(field.type.IsIntTy()); assert(field.type.GetIntBitWidth() == 64); @@ -350,27 +349,16 @@ FunctionType *func_type = FunctionType::get( b_.getInt64Ty(), - {b_.getInt8PtrTy()}, // struct pt_regs *ctx -+ {b_.getPtrTy()}, // struct pt_regs *ctx ++ {b_.GET_PTR_TY()}, // struct pt_regs *ctx false); // Probe has at least one attach point (required by the parser) -@@ -3617,7 +3617,9 @@ void CodegenLLVM::emit(raw_pwrite_stream - { - legacy::PassManager PM; - --#if LLVM_VERSION_MAJOR >= 10 -+#if LLVM_VERSION_MAJOR >= 18 -+ auto type = llvm::CodeGenFileType::ObjectFile; -+#elif LLVM_VERSION_MAJOR >= 10 - auto type = llvm::CGFT_ObjectFile; - #else - auto type = llvm::TargetMachine::CGFT_ObjectFile; -@@ -3880,7 +3882,7 @@ Function *CodegenLLVM::createMapLenCallb +@@ -3880,7 +3880,7 @@ Function *CodegenLLVM::createMapLenCallback() auto saved_ip = b_.saveIP(); std::array args = { - b_.getInt8PtrTy(), b_.getInt8PtrTy(), b_.getInt8PtrTy(), b_.getInt8PtrTy() -+ b_.getPtrTy(), b_.getPtrTy(), b_.getPtrTy(), b_.getPtrTy() ++ b_.GET_PTR_TY(), b_.GET_PTR_TY(), b_.GET_PTR_TY(), b_.GET_PTR_TY() }; FunctionType *callback_type = FunctionType::get(b_.getInt64Ty(), args, false); diff --git a/debian/patches/llvm-18/cmake-Bump-max-LLVM-version-to-18.patch b/debian/patches/llvm-18/cmake-Bump-max-LLVM-version-to-18.patch new file mode 100644 index 0000000..6e759d6 --- /dev/null +++ b/debian/patches/llvm-18/cmake-Bump-max-LLVM-version-to-18.patch @@ -0,0 +1,24 @@ +From: Khem Raj +Date: Fri, 16 Feb 2024 10:14:41 -0800 +Subject: cmake: Bump max LLVM version to 18+ + +Signed-off-by: Khem Raj + +Origin: https://github.com/bpftrace/bpftrace/commit/878c683577fe52b8ca3cbaa50336b37ff289e934 +--- + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index fc35247..d694f44 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -139,7 +139,7 @@ else() + endif() + + set(MIN_LLVM_MAJOR 6) +-set(MAX_LLVM_MAJOR 17) ++set(MAX_LLVM_MAJOR 18) + + if((${LLVM_VERSION_MAJOR} VERSION_LESS ${MIN_LLVM_MAJOR}) OR (${LLVM_VERSION_MAJOR} VERSION_GREATER ${MAX_LLVM_MAJOR})) + message(SEND_ERROR "Unsupported LLVM version found via ${LLVM_INCLUDE_DIRS}: ${LLVM_VERSION_MAJOR}") diff --git a/debian/patches/llvm-18/use-64bit-alignment-for-map-counter-atomic-add.patch b/debian/patches/llvm-18/use-64bit-alignment-for-map-counter-atomic-add.patch new file mode 100644 index 0000000..2a92083 --- /dev/null +++ b/debian/patches/llvm-18/use-64bit-alignment-for-map-counter-atomic-add.patch @@ -0,0 +1,29 @@ +From: Frank van der Linden +Date: Mon, 11 Mar 2024 15:35:32 +0000 +Subject: use 64bit alignment for map counter atomic add + +For an atomic inc of a map counter (ringbuf loss counter), generate +IR with 64bit alignment. This is more correct, and will avoid problems +with upcoming LLVM versions, as they will emit a function call for +a potentially unaligned atomicrmw. This will lead to an error like this: + +error: :0:0: in function BEGIN i64 (ptr): t15: i64 = GlobalAddress 0 too many arguments + +Origin: https://github.com/bpftrace/bpftrace/commit/e8d088b657221fd87b773f10a0617a5f7ed02057 +--- + src/ast/irbuilderbpf.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/ast/irbuilderbpf.cpp b/src/ast/irbuilderbpf.cpp +index 704f0a2..2dd2ceb 100644 +--- a/src/ast/irbuilderbpf.cpp ++++ b/src/ast/irbuilderbpf.cpp +@@ -1559,7 +1559,7 @@ void IRBuilderBPF::CreateAtomicIncCounter(int mapid, uint32_t idx) + CREATE_ATOMIC_RMW(AtomicRMWInst::BinOp::Add, + val, + getInt64(1), +- 1, ++ 8, + AtomicOrdering::SequentiallyConsistent); + CreateBr(lookup_merge_block); + diff --git a/debian/patches/series b/debian/patches/series index 9572a1e..4181aee 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,2 +1,5 @@ -llvm-18.diff disable_failing_tests.patch +llvm-18/ast-Repace-getInt8PtrTy-with-getPtrTy.patch +llvm-18/ast-Adjust-to-enum-changes-in-llvm-18.patch +llvm-18/cmake-Bump-max-LLVM-version-to-18.patch +llvm-18/use-64bit-alignment-for-map-counter-atomic-add.patch diff --git a/debian/rules b/debian/rules index 1076826..56b3b47 100755 --- a/debian/rules +++ b/debian/rules @@ -1,10 +1,13 @@ #!/usr/bin/make -f +# Disable tests at build time +export DEB_BUILD_MAINT_OPTIONS=nocheck + %: dh $@ override_dh_auto_configure: - dh_auto_configure -- -DBUILD_TESTING:BOOL=OFF -DUSE_SYSTEM_BPF_BCC=1 + dh_auto_configure -- -DBUILD_TESTING:BOOL=ON -DUSE_SYSTEM_BPF_BCC=1 STRIP_CMD=strip --keep-symbol=BEGIN_trigger --keep-symbol=END_trigger --remove-section=.comment --remove-section=.note override_dh_strip: @@ -22,3 +25,8 @@ override_dh_auto_install: rm -rf debian/bpftrace/usr/share/bpftrace/tools/old rmdir debian/bpftrace/usr/share/bpftrace/tools \ debian/bpftrace/usr/share/bpftrace + +override_dh_auto_test: +ifeq (,$(findstring nocheck,$(DEB_BUILD_MAINT_OPTIONS))) + dh_auto_test +endif