1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2022 The Android Open Source Project 2*7594170eSAndroid Build Coastguard Worker# 3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*7594170eSAndroid Build Coastguard Worker# 7*7594170eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*7594170eSAndroid Build Coastguard Worker# 9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*7594170eSAndroid Build Coastguard Worker# limitations under the License. 14*7594170eSAndroid Build Coastguard Worker 15*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:paths.bzl", "paths") 16*7594170eSAndroid Build Coastguard Workerload("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") 17*7594170eSAndroid Build Coastguard Worker 18*7594170eSAndroid Build Coastguard Workerdef _get_clang_cmd_output(ctx): 19*7594170eSAndroid Build Coastguard Worker copts = [ 20*7594170eSAndroid Build Coastguard Worker "--target=bpf", 21*7594170eSAndroid Build Coastguard Worker "-nostdlibinc", 22*7594170eSAndroid Build Coastguard Worker "-no-canonical-prefixes", 23*7594170eSAndroid Build Coastguard Worker "-O2", 24*7594170eSAndroid Build Coastguard Worker ] 25*7594170eSAndroid Build Coastguard Worker copts.extend(ctx.attr.copts) 26*7594170eSAndroid Build Coastguard Worker if ctx.attr.btf: 27*7594170eSAndroid Build Coastguard Worker copts.append("-g") 28*7594170eSAndroid Build Coastguard Worker 29*7594170eSAndroid Build Coastguard Worker includes = [ 30*7594170eSAndroid Build Coastguard Worker "packages/modules/Connectivity/staticlibs/native/bpf_headers/include/bpf", 31*7594170eSAndroid Build Coastguard Worker # TODO(b/149785767): only give access to specific file with AID_* constants 32*7594170eSAndroid Build Coastguard Worker "system/core/libcutils/include", 33*7594170eSAndroid Build Coastguard Worker "external/musl/src/env", 34*7594170eSAndroid Build Coastguard Worker ctx.label.package, 35*7594170eSAndroid Build Coastguard Worker ] 36*7594170eSAndroid Build Coastguard Worker includes.extend(ctx.attr.absolute_includes) 37*7594170eSAndroid Build Coastguard Worker 38*7594170eSAndroid Build Coastguard Worker system_includes = [ 39*7594170eSAndroid Build Coastguard Worker "bionic/libc/include", 40*7594170eSAndroid Build Coastguard Worker "bionic/libc/kernel/uapi", 41*7594170eSAndroid Build Coastguard Worker # The architecture doesn't matter here, but asm/types.h is included by linux/types.h. 42*7594170eSAndroid Build Coastguard Worker "bionic/libc/kernel/uapi/asm-arm64", 43*7594170eSAndroid Build Coastguard Worker "bionic/libc/kernel/android/uapi", 44*7594170eSAndroid Build Coastguard Worker ] 45*7594170eSAndroid Build Coastguard Worker 46*7594170eSAndroid Build Coastguard Worker toolchain = find_cpp_toolchain(ctx) 47*7594170eSAndroid Build Coastguard Worker extra_features = [ 48*7594170eSAndroid Build Coastguard Worker "dependency_file", 49*7594170eSAndroid Build Coastguard Worker "bpf_compiler_flags", 50*7594170eSAndroid Build Coastguard Worker ] 51*7594170eSAndroid Build Coastguard Worker extra_disabled_features = [ 52*7594170eSAndroid Build Coastguard Worker "sdk_version_flag", 53*7594170eSAndroid Build Coastguard Worker "pie", 54*7594170eSAndroid Build Coastguard Worker "non_external_compiler_flags", 55*7594170eSAndroid Build Coastguard Worker "common_compiler_flags", 56*7594170eSAndroid Build Coastguard Worker "asm_compiler_flags", 57*7594170eSAndroid Build Coastguard Worker "cpp_compiler_flags", 58*7594170eSAndroid Build Coastguard Worker "c_compiler_flags", 59*7594170eSAndroid Build Coastguard Worker "external_compiler_flags", 60*7594170eSAndroid Build Coastguard Worker "arm_isa_arm", 61*7594170eSAndroid Build Coastguard Worker "arm_isa_thumb", 62*7594170eSAndroid Build Coastguard Worker "no_override_clang_global_copts", 63*7594170eSAndroid Build Coastguard Worker ] 64*7594170eSAndroid Build Coastguard Worker feature_configuration = cc_common.configure_features( 65*7594170eSAndroid Build Coastguard Worker ctx = ctx, 66*7594170eSAndroid Build Coastguard Worker cc_toolchain = toolchain, 67*7594170eSAndroid Build Coastguard Worker requested_features = ctx.features + extra_features, 68*7594170eSAndroid Build Coastguard Worker unsupported_features = ctx.disabled_features + extra_disabled_features, 69*7594170eSAndroid Build Coastguard Worker ) 70*7594170eSAndroid Build Coastguard Worker 71*7594170eSAndroid Build Coastguard Worker compilation_context = [] 72*7594170eSAndroid Build Coastguard Worker dir_name = ctx.label.name 73*7594170eSAndroid Build Coastguard Worker if ctx.attr.btf: 74*7594170eSAndroid Build Coastguard Worker # If btf is true, intermediate dir ("unstripped") is added when 75*7594170eSAndroid Build Coastguard Worker # clang command is executed, because ctx.actions.run used in stripped 76*7594170eSAndroid Build Coastguard Worker # command does not allow the same input and output names. 77*7594170eSAndroid Build Coastguard Worker # "unstripped" will be removed when strip command is executed. 78*7594170eSAndroid Build Coastguard Worker dir_name = paths.join("unstripped", dir_name) 79*7594170eSAndroid Build Coastguard Worker (compilation_context, compilation_outputs) = cc_common.compile( 80*7594170eSAndroid Build Coastguard Worker name = dir_name, 81*7594170eSAndroid Build Coastguard Worker actions = ctx.actions, 82*7594170eSAndroid Build Coastguard Worker feature_configuration = feature_configuration, 83*7594170eSAndroid Build Coastguard Worker cc_toolchain = toolchain, 84*7594170eSAndroid Build Coastguard Worker srcs = ctx.files.srcs, 85*7594170eSAndroid Build Coastguard Worker system_includes = system_includes, 86*7594170eSAndroid Build Coastguard Worker includes = includes, 87*7594170eSAndroid Build Coastguard Worker user_compile_flags = copts, 88*7594170eSAndroid Build Coastguard Worker compilation_contexts = compilation_context, 89*7594170eSAndroid Build Coastguard Worker ) 90*7594170eSAndroid Build Coastguard Worker 91*7594170eSAndroid Build Coastguard Worker return compilation_outputs.objects 92*7594170eSAndroid Build Coastguard Worker 93*7594170eSAndroid Build Coastguard Workerdef _declare_stripped_cmd_output_file(ctx, src): 94*7594170eSAndroid Build Coastguard Worker file_path = paths.join("_objs", src.basename, src.basename) 95*7594170eSAndroid Build Coastguard Worker return ctx.actions.declare_file(file_path) 96*7594170eSAndroid Build Coastguard Worker 97*7594170eSAndroid Build Coastguard Workerdef _get_stripped_cmd_output(ctx, srcs): 98*7594170eSAndroid Build Coastguard Worker out_files = [_declare_stripped_cmd_output_file(ctx, src) for src in srcs] 99*7594170eSAndroid Build Coastguard Worker 100*7594170eSAndroid Build Coastguard Worker args = ctx.actions.args() 101*7594170eSAndroid Build Coastguard Worker args.add("--strip-unneeded") 102*7594170eSAndroid Build Coastguard Worker args.add("--remove-section=.rel.BTF") 103*7594170eSAndroid Build Coastguard Worker args.add("--remove-section=.rel.BTF.ext") 104*7594170eSAndroid Build Coastguard Worker args.add("--remove-section=.BTF.ext") 105*7594170eSAndroid Build Coastguard Worker 106*7594170eSAndroid Build Coastguard Worker for in_file, out_file in zip(srcs, out_files): 107*7594170eSAndroid Build Coastguard Worker ctx.actions.run( 108*7594170eSAndroid Build Coastguard Worker inputs = [in_file], 109*7594170eSAndroid Build Coastguard Worker outputs = [out_file], 110*7594170eSAndroid Build Coastguard Worker executable = ctx.executable._strip, 111*7594170eSAndroid Build Coastguard Worker arguments = [args] + [in_file.path, "-o", out_file.path], 112*7594170eSAndroid Build Coastguard Worker ) 113*7594170eSAndroid Build Coastguard Worker 114*7594170eSAndroid Build Coastguard Worker return out_files 115*7594170eSAndroid Build Coastguard Worker 116*7594170eSAndroid Build Coastguard Workerdef _bpf_impl(ctx): 117*7594170eSAndroid Build Coastguard Worker for src in ctx.files.srcs: 118*7594170eSAndroid Build Coastguard Worker if "_" in src.basename: 119*7594170eSAndroid Build Coastguard Worker fail("Invalid character '_' in source name") 120*7594170eSAndroid Build Coastguard Worker 121*7594170eSAndroid Build Coastguard Worker clang_outfiles = _get_clang_cmd_output(ctx) 122*7594170eSAndroid Build Coastguard Worker 123*7594170eSAndroid Build Coastguard Worker if not ctx.attr.btf: 124*7594170eSAndroid Build Coastguard Worker return [DefaultInfo(files = depset(clang_outfiles))] 125*7594170eSAndroid Build Coastguard Worker else: 126*7594170eSAndroid Build Coastguard Worker stripped_outfiles = _get_stripped_cmd_output(ctx, clang_outfiles) 127*7594170eSAndroid Build Coastguard Worker return [DefaultInfo(files = depset(stripped_outfiles))] 128*7594170eSAndroid Build Coastguard Worker 129*7594170eSAndroid Build Coastguard Workerbpf = rule( 130*7594170eSAndroid Build Coastguard Worker implementation = _bpf_impl, 131*7594170eSAndroid Build Coastguard Worker attrs = { 132*7594170eSAndroid Build Coastguard Worker "srcs": attr.label_list( 133*7594170eSAndroid Build Coastguard Worker mandatory = True, 134*7594170eSAndroid Build Coastguard Worker allow_files = True, 135*7594170eSAndroid Build Coastguard Worker ), 136*7594170eSAndroid Build Coastguard Worker "copts": attr.string_list(), 137*7594170eSAndroid Build Coastguard Worker "absolute_includes": attr.string_list(), 138*7594170eSAndroid Build Coastguard Worker "btf": attr.bool( 139*7594170eSAndroid Build Coastguard Worker default = True, 140*7594170eSAndroid Build Coastguard Worker doc = "if set to true, generate BTF debug info for maps & programs", 141*7594170eSAndroid Build Coastguard Worker ), 142*7594170eSAndroid Build Coastguard Worker "_strip": attr.label( 143*7594170eSAndroid Build Coastguard Worker cfg = "exec", 144*7594170eSAndroid Build Coastguard Worker executable = True, 145*7594170eSAndroid Build Coastguard Worker default = "//prebuilts/clang/host/linux-x86:llvm-strip", 146*7594170eSAndroid Build Coastguard Worker allow_files = True, 147*7594170eSAndroid Build Coastguard Worker ), 148*7594170eSAndroid Build Coastguard Worker }, 149*7594170eSAndroid Build Coastguard Worker toolchains = ["@bazel_tools//tools/cpp:toolchain_type"], 150*7594170eSAndroid Build Coastguard Worker fragments = ["cpp"], 151*7594170eSAndroid Build Coastguard Worker) 152