diff options
author | Jose E. Marchesi <jemarch@gcc.gnu.org> | 2019-09-09 12:13:23 +0200 |
---|---|---|
committer | Jose E. Marchesi <jemarch@gcc.gnu.org> | 2019-09-09 12:13:23 +0200 |
commit | 91dfef9610b8844c62dc7186a9aea9a6aca9805c (patch) | |
tree | 80d2a38518601f96538b807d34bcf187e9552460 /gcc/config/bpf/bpf.h | |
parent | a5362c6aea5ea6b07803d8f9f6f783154e250ce4 (diff) | |
download | gcc-91dfef9610b8844c62dc7186a9aea9a6aca9805c.zip gcc-91dfef9610b8844c62dc7186a9aea9a6aca9805c.tar.gz gcc-91dfef9610b8844c62dc7186a9aea9a6aca9805c.tar.bz2 |
GCC port for eBPF
This patch series introduces a port of GCC to eBPF, which is a virtual
machine that resides in the Linux kernel. Initially intended for
user-level packet capture and filtering, eBPF is nowadays generalized
to serve as a general-purpose infrastructure also for non-networking
purposes.
The binutils support is already upstream. See
https://sourceware.org/ml/binutils/2019-05/msg00306.html.
ChangeLog:
* MAINTAINERS: Add myself as the maintainer of the eBPF port.
Remove myself from Write After Approval section.
* configure.ac: Support for bpf-*-* targets.
* configure: Regenerate.
contrib/ChangeLog:
* config-list.mk (LIST): Disable go in bpf-*-* targets.
gcc/ChangeLog:
* doc/invoke.texi (Option Summary): Cover eBPF.
(eBPF Options): New section.
* doc/extend.texi (BPF Built-in Functions): Likewise.
(BPF Kernel Helpers): Likewise.
* config.gcc: Support for bpf-*-* targets.
* common/config/bpf/bpf-common.c: New file.
* config/bpf/t-bpf: Likewise.
* config/bpf/predicates.md: Likewise.
* config/bpf/constraints.md: Likewise.
* config/bpf/bpf.opt: Likewise.
* config/bpf/bpf.md: Likewise.
* config/bpf/bpf.h: Likewise.
* config/bpf/bpf.c: Likewise.
* config/bpf/bpf-protos.h: Likewise.
* config/bpf/bpf-opts.h: Likewise.
* config/bpf/bpf-helpers.h: Likewise.
* config/bpf/bpf-helpers.def: Likewise.
gcc/testsuite/ChangeLog:
* gcc.dg/builtins-config.h: eBPF doesn't support C99 standard
functions.
* gcc.c-torture/compile/20101217-1.c: Add a function prototype for
printf.
* gcc.c-torture/compile/20000211-1.c: Skip if target bpf-*-*.
* gcc.c-torture/compile/poor.c: Likewise.
* gcc.c-torture/compile/pr25311.c: Likewise.
* gcc.c-torture/compile/pr39928-1.c: Likewise.
* gcc.c-torture/compile/pr70061.c: Likewise.
* gcc.c-torture/compile/920501-7.c: Likewise.
* gcc.c-torture/compile/20000403-1.c: Likewise.
* gcc.c-torture/compile/20001226-1.c: Likewise.
* gcc.c-torture/compile/20030903-1.c: Likewise.
* gcc.c-torture/compile/20031125-1.c: Likewise.
* gcc.c-torture/compile/20040101-1.c: Likewise.
* gcc.c-torture/compile/20040317-2.c: Likewise.
* gcc.c-torture/compile/20040726-1.c: Likewise.
* gcc.c-torture/compile/20051216-1.c: Likewise.
* gcc.c-torture/compile/900313-1.c: Likewise.
* gcc.c-torture/compile/920625-1.c: Likewise.
* gcc.c-torture/compile/930421-1.c: Likewise.
* gcc.c-torture/compile/930623-1.c: Likewise.
* gcc.c-torture/compile/961004-1.c: Likewise.
* gcc.c-torture/compile/980504-1.c: Likewise.
* gcc.c-torture/compile/980816-1.c: Likewise.
* gcc.c-torture/compile/990625-1.c: Likewise.
* gcc.c-torture/compile/DFcmp.c: Likewise.
* gcc.c-torture/compile/HIcmp.c: Likewise.
* gcc.c-torture/compile/HIset.c: Likewise.
* gcc.c-torture/compile/QIcmp.c: Likewise.
* gcc.c-torture/compile/QIset.c: Likewise.
* gcc.c-torture/compile/SFset.c: Likewise.
* gcc.c-torture/compile/SIcmp.c: Likewise.
* gcc.c-torture/compile/SIset.c: Likewise.
* gcc.c-torture/compile/UHIcmp.c: Likewise.
* gcc.c-torture/compile/UQIcmp.c: Likewise.
* gcc.c-torture/compile/USIcmp.c: Likewise.
* gcc.c-torture/compile/consec.c: Likewise.
* gcc.c-torture/compile/limits-fndefn.c: Likewise.
* gcc.c-torture/compile/lll.c: Likewise.
* gcc.c-torture/compile/parms.c: Likewise.
* gcc.c-torture/compile/pass.c: Likewise.
* gcc.c-torture/compile/pp.c: Likewise.
* gcc.c-torture/compile/pr32399.c: Likewise.
* gcc.c-torture/compile/pr34091.c: Likewise.
* gcc.c-torture/compile/pr34688.c: Likewise.
* gcc.c-torture/compile/pr37258.c: Likewise.
* gcc.c-torture/compile/pr37327.c: Likewise.
* gcc.c-torture/compile/pr37381.c: Likewise.
* gcc.c-torture/compile/pr37669-2.c: Likewise.
* gcc.c-torture/compile/pr37669.c: Likewise.
* gcc.c-torture/compile/pr37742-3.c: Likewise.
* gcc.c-torture/compile/pr44063.c: Likewise.
* gcc.c-torture/compile/pr48596.c: Likewise.
* gcc.c-torture/compile/pr51856.c: Likewise.
* gcc.c-torture/compile/pr54428.c: Likewise.
* gcc.c-torture/compile/pr54713-1.c: Likewise.
* gcc.c-torture/compile/pr54713-2.c: Likewise.
* gcc.c-torture/compile/pr54713-3.c: Likewise.
* gcc.c-torture/compile/pr55921.c: Likewise.
* gcc.c-torture/compile/pr70240.c: Likewise.
* gcc.c-torture/compile/pr70355.c: Likewise.
* gcc.c-torture/compile/pr82052.c: Likewise.
* gcc.c-torture/compile/pr83487.c: Likewise.
* gcc.c-torture/compile/pr86122.c: Likewise.
* gcc.c-torture/compile/pret-arg.c: Likewise.
* gcc.c-torture/compile/regs-arg-size.c: Likewise.
* gcc.c-torture/compile/structret.c: Likewise.
* gcc.c-torture/compile/uuarg.c: Likewise.
* gcc.dg/20001009-1.c: Likewise.
* gcc.dg/20020418-1.c: Likewise.
* gcc.dg/20020426-2.c: Likewise.
* gcc.dg/20020430-1.c: Likewise.
* gcc.dg/20040306-1.c: Likewise.
* gcc.dg/20040622-2.c: Likewise.
* gcc.dg/20050603-2.c: Likewise.
* gcc.dg/20050629-1.c: Likewise.
* gcc.dg/20061026.c: Likewise.
* gcc.dg/Warray-bounds-3.c: Likewise.
* gcc.dg/Warray-bounds-30.c: Likewise.
* gcc.dg/Wframe-larger-than-2.c: Likewise.
* gcc.dg/Wframe-larger-than.c: Likewise.
* gcc.dg/Wrestrict-11.c: Likewise.
* gcc.c-torture/compile/20000804-1.c: Likewise.
* lib/target-supports.exp (check_effective_target_trampolines):
Adapt to eBPF.
(check_effective_target_indirect_jumps): Likewise.
(check_effective_target_nonlocal_goto): Likewise.
(check_effective_target_global_constructor): Likewise.
(check_effective_target_return_address): Likewise.
* gcc.target/bpf/bpf.exp: New file.
* gcc.target/bpf/builtin-load.c: Likewise.
* cc.target/bpf/constant-calls.c: Likewise.
* gcc.target/bpf/diag-funargs.c: Likewise.
* gcc.target/bpf/diag-funargs-2.c: Likewise.
* gcc.target/bpf/diag-funargs-3.c: Likewise.
* gcc.target/bpf/diag-indcalls.c: Likewise.
* gcc.target/bpf/helper-bind.c: Likewise.
* gcc.target/bpf/helper-bpf-redirect.c: Likewise.
* gcc.target/bpf/helper-clone-redirect.c: Likewise.
* gcc.target/bpf/helper-csum-diff.c: Likewise.
* gcc.target/bpf/helper-csum-update.c: Likewise.
* gcc.target/bpf/helper-current-task-under-cgroup.c: Likewise.
* gcc.target/bpf/helper-fib-lookup.c: Likewise.
* gcc.target/bpf/helper-get-cgroup-classid.c: Likewise.
* gcc.target/bpf/helper-get-current-cgroup-id.c: Likewise.
* gcc.target/bpf/helper-get-current-comm.c: Likewise.
* gcc.target/bpf/helper-get-current-pid-tgid.c: Likewise.
* gcc.target/bpf/helper-get-current-task.c: Likewise.
* gcc.target/bpf/helper-get-current-uid-gid.c: Likewise.
* gcc.target/bpf/helper-get-hash-recalc.c: Likewise.
* gcc.target/bpf/helper-get-listener-sock.c: Likewise.
* gcc.target/bpf/helper-get-local-storage.c: Likewise.
* gcc.target/bpf/helper-get-numa-node-id.c: Likewise.
* gcc.target/bpf/helper-get-prandom-u32.c: Likewise.
* gcc.target/bpf/helper-get-route-realm.c: Likewise.
* gcc.target/bpf/helper-get-smp-processor-id.c: Likewise.
* gcc.target/bpf/helper-get-socket-cookie.c: Likewise.
* gcc.target/bpf/helper-get-socket-uid.c: Likewise.
* gcc.target/bpf/helper-getsockopt.c: Likewise.
* gcc.target/bpf/helper-get-stack.c: Likewise.
* gcc.target/bpf/helper-get-stackid.c: Likewise.
* gcc.target/bpf/helper-ktime-get-ns.c: Likewise.
* gcc.target/bpf/helper-l3-csum-replace.c: Likewise.
* gcc.target/bpf/helper-l4-csum-replace.c: Likewise.
* gcc.target/bpf/helper-lwt-push-encap.c: Likewise.
* gcc.target/bpf/helper-lwt-seg6-action.c: Likewise.
* gcc.target/bpf/helper-lwt-seg6-adjust-srh.c: Likewise.
* gcc.target/bpf/helper-lwt-seg6-store-bytes.c: Likewise.
* gcc.target/bpf/helper-map-delete-elem.c: Likewise.
* gcc.target/bpf/helper-map-lookup-elem.c: Likewise.
* gcc.target/bpf/helper-map-peek-elem.c: Likewise.
* gcc.target/bpf/helper-map-pop-elem.c: Likewise.
* gcc.target/bpf/helper-map-push-elem.c: Likewise.
* gcc.target/bpf/helper-map-update-elem.c: Likewise.
* gcc.target/bpf/helper-msg-apply-bytes.c: Likewise.
* gcc.target/bpf/helper-msg-cork-bytes.c: Likewise.
* gcc.target/bpf/helper-msg-pop-data.c: Likewise.
* gcc.target/bpf/helper-msg-pull-data.c: Likewise.
* gcc.target/bpf/helper-msg-push-data.c: Likewise.
* gcc.target/bpf/helper-msg-redirect-hash.c: Likewise.
* gcc.target/bpf/helper-msg-redirect-map.c: Likewise.
* gcc.target/bpf/helper-override-return.c: Likewise.
* gcc.target/bpf/helper-perf-event-output.c: Likewise.
* gcc.target/bpf/helper-perf-event-read.c: Likewise.
* gcc.target/bpf/helper-perf-event-read-value.c: Likewise.
* gcc.target/bpf/helper-perf-prog-read-value.c: Likewise.
* gcc.target/bpf/helper-probe-read.c: Likewise.
* gcc.target/bpf/helper-probe-read-str.c: Likewise.
* gcc.target/bpf/helper-probe-write-user.c: Likewise.
* gcc.target/bpf/helper-rc-keydown.c: Likewise.
* gcc.target/bpf/helper-rc-pointer-rel.c: Likewise.
* gcc.target/bpf/helper-rc-repeat.c: Likewise.
* gcc.target/bpf/helper-redirect-map.c: Likewise.
* gcc.target/bpf/helper-set-hash.c: Likewise.
* gcc.target/bpf/helper-set-hash-invalid.c: Likewise.
* gcc.target/bpf/helper-setsockopt.c: Likewise.
* gcc.target/bpf/helper-skb-adjust-room.c: Likewise.
* gcc.target/bpf/helper-skb-cgroup-id.c: Likewise.
* gcc.target/bpf/helper-skb-change-head.c: Likewise.
* gcc.target/bpf/helper-skb-change-proto.c: Likewise.
* gcc.target/bpf/helper-skb-change-tail.c: Likewise.
* gcc.target/bpf/helper-skb-change-type.c: Likewise.
* gcc.target/bpf/helper-skb-ecn-set-ce.c: Likewise.
* gcc.target/bpf/helper-skb-get-tunnel-key.c: Likewise.
* gcc.target/bpf/helper-skb-get-tunnel-opt.c: Likewise.
* gcc.target/bpf/helper-skb-get-xfrm-state.c: Likewise.
* gcc.target/bpf/helper-skb-load-bytes.c: Likewise.
* gcc.target/bpf/helper-skb-load-bytes-relative.c: Likewise.
* gcc.target/bpf/helper-skb-pull-data.c: Likewise.
* gcc.target/bpf/helper-skb-set-tunnel-key.c: Likewise.
* gcc.target/bpf/helper-skb-set-tunnel-opt.c: Likewise.
* gcc.target/bpf/helper-skb-store-bytes.c: Likewise.
* gcc.target/bpf/helper-skb-under-cgroup.c: Likewise.
* gcc.target/bpf/helper-skb-vlan-pop.c: Likewise.
* gcc.target/bpf/helper-skb-vlan-push.c: Likewise.
* gcc.target/bpf/helper-skc-lookup-tcp.c: Likewise.
* gcc.target/bpf/helper-sk-fullsock.c: Likewise.
* gcc.target/bpf/helper-sk-lookup-tcp.c: Likewise.
* gcc.target/bpf/helper-sk-lookup-upd.c: Likewise.
* gcc.target/bpf/helper-sk-redirect-hash.c: Likewise.
* gcc.target/bpf/helper-sk-redirect-map.c: Likewise.
* gcc.target/bpf/helper-sk-release.c: Likewise.
* gcc.target/bpf/helper-sk-select-reuseport.c: Likewise.
* gcc.target/bpf/helper-sk-storage-delete.c: Likewise.
* gcc.target/bpf/helper-sk-storage-get.c: Likewise.
* gcc.target/bpf/helper-sock-hash-update.c: Likewise.
* gcc.target/bpf/helper-sock-map-update.c: Likewise.
* gcc.target/bpf/helper-sock-ops-cb-flags-set.c: Likewise.
* gcc.target/bpf/helper-spin-lock.c: Likewise.
* gcc.target/bpf/helper-spin-unlock.c: Likewise.
* gcc.target/bpf/helper-strtol.c: Likewise.
* gcc.target/bpf/helper-strtoul.c: Likewise.
* gcc.target/bpf/helper-sysctl-get-current-value.c: Likewise.
* gcc.target/bpf/helper-sysctl-get-name.c: Likewise.
* gcc.target/bpf/helper-sysctl-get-new-value.c: Likewise.
* gcc.target/bpf/helper-sysctl-set-new-value.c: Likewise.
* gcc.target/bpf/helper-tail-call.c: Likewise.
* gcc.target/bpf/helper-tcp-check-syncookie.c: Likewise.
* gcc.target/bpf/helper-tcp-sock.c: Likewise.
* gcc.target/bpf/helper-trace-printk.c: Likewise.
* gcc.target/bpf/helper-xdp-adjust-head.c: Likewise.
* gcc.target/bpf/helper-xdp-adjust-meta.c: Likewise.
* gcc.target/bpf/helper-xdp-adjust-tail.c: Likewise.
* gcc.target/bpf/skb-ancestor-cgroup-id.c: Likewise.
* gcc.target/bpf/sync-fetch-and-add.c: Likewise.
libgcc/ChangeLog:
* config.host: Set cpu_type for bpf-*-* targets.
* config/bpf/t-bpf: Likewise.
* config/bpf/crtn.S: Likewise.
* config/bpf/crti.S: New file.
From-SVN: r275506
Diffstat (limited to 'gcc/config/bpf/bpf.h')
-rw-r--r-- | gcc/config/bpf/bpf.h | 539 |
1 files changed, 539 insertions, 0 deletions
diff --git a/gcc/config/bpf/bpf.h b/gcc/config/bpf/bpf.h new file mode 100644 index 0000000..70ad818 --- /dev/null +++ b/gcc/config/bpf/bpf.h @@ -0,0 +1,539 @@ +/* Definition of the eBPF target for GCC. + Copyright (C) 2019 Free Software Foundation, Inc. + + This file is part of GCC. + + GCC is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + GCC is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with GCC; see the file COPYING3. If not see + <http://www.gnu.org/licenses/>. */ + +#ifndef GCC_BPF_H +#define GCC_BPF_H + +/**** Controlling the Compilation Driver. */ + +#define ASM_SPEC "%{mbig-endian:-EB} %{!mbig-endian:-EL}" +#define LINK_SPEC "%{mbig-endian:-EB} %{!mbig-endian:-EL}" +#define LIB_SPEC "" +#define STARTFILE_SPEC "" + +/**** Run-time Target Specification. */ + +#define TARGET_CPU_CPP_BUILTINS() bpf_target_macros (pfile) + +/**** Storage Layout. */ + +/* Endianness and word size. */ +#define BITS_BIG_ENDIAN 0 +#define BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN) +#define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN) +#define BITS_PER_WORD 64 +#define UNITS_PER_WORD 8 + +/* When storing an integer whose size is less than 64-bit in a + register, promote it to a DImode. */ +#define PROMOTE_MODE(M, UNSIGNEDP, TYPE) \ + do \ + { \ + if (GET_MODE_CLASS (M) == MODE_INT \ + && GET_MODE_SIZE (M) < 8) \ + M = DImode; \ + } while (0) + +/* Biggest alignment supported by the object file format of this + machine. In this case this is ELF. Use the same definition than + in elfos.h */ +#define MAX_OFILE_ALIGNMENT (((unsigned int) 1 << 28) * 8) + +/* Align argument parameters on the stack to 64-bit, at a minimum. */ +#define PARM_BOUNDARY 64 + +/* The hardware enforces that the stack pointer should be aligned to + 64-bit at any time. */ +#define STACK_BOUNDARY 64 + +/* Function entry points are aligned to 128 bits. */ +#define FUNCTION_BOUNDARY 128 + +/* Maximum alignment required by data of any type. */ +#define BIGGEST_ALIGNMENT 64 + +/* The best alignment to use in cases where we have a choice. */ +#define FASTEST_ALIGNMENT 64 + +/* Use a fast alignment when storing arrays of chars in a local. */ +#define LOCAL_ALIGNMENT(TYPE, ALIGN) \ + (TREE_CODE (TYPE) == ARRAY_TYPE \ + && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \ + && (ALIGN) < FASTEST_ALIGNMENT ? FASTEST_ALIGNMENT : (ALIGN)) + +/* The load and store instructions won't work if the data is not in + it's expected alignment. */ +#define STRICT_ALIGNMENT 1 + +/* We use Pmode as the mode of the size increment operand in an + `allocate_stack' pattern. */ +#define STACK_SIZE_MODE Pmode + +/**** Layout of Source Language Data Types. */ + +#define INT_TYPE_SIZE 32 +#define SHORT_TYPE_SIZE 16 +#define LONG_TYPE_SIZE 64 +#define LONG_LONG_TYPE_SIZE 64 +#define CHAR_TYPE_SIZE 8 +#define FLOAT_TYPE_SIZE 32 +#define DOUBLE_TYPE_SIZE 64 +#define LONG_DOUBLE_TYPE_SIZE 64 + +#define INTPTR_TYPE "long int" +#define UINTPTR_TYPE "long unsigned int" +#define SIZE_TYPE "long unsigned int" +#define PTRDIFF_TYPE "long int" + +#define SIG_ATOMIC_TYPE "char" + +#define INT8_TYPE "char" +#define INT16_TYPE "short int" +#define INT32_TYPE "int" +#define INT64_TYPE "long int" +#define UINT8_TYPE "unsigned char" +#define UINT16_TYPE "short unsigned int" +#define UINT32_TYPE "unsigned int" +#define UINT64_TYPE "long unsigned int" + +#define INT_LEAST8_TYPE INT8_TYPE +#define INT_LEAST16_TYPE INT16_TYPE +#define INT_LEAST32_TYPE INT32_TYPE +#define INT_LEAST64_TYPE INT64_TYPE +#define UINT_LEAST8_TYPE UINT8_TYPE +#define UINT_LEAST16_TYPE UINT16_TYPE +#define UINT_LEAST32_TYPE UINT32_TYPE +#define UINT_LEAST64_TYPE UINT64_TYPE + +#define INT_FAST8_TYPE INT8_TYPE +#define INT_FAST16_TYPE INT16_TYPE +#define INT_FAST32_TYPE INT32_TYPE +#define INT_FAST64_TYPE INT64_TYPE +#define UINT_FAST8_TYPE UINT8_TYPE +#define UINT_FAST16_TYPE UINT16_TYPE +#define UINT_FAST32_TYPE UINT32_TYPE +#define UINT_FAST64_TYPE UINT64_TYPE + +/* `char' is signed by default, like in x86. */ +#define DEFAULT_SIGNED_CHAR 1 + +/* `wchar_t' is a signed 32-bit type. The second constant is used by + cpp, which can't use WCHAR_TYPE. */ +#define WCHAR_TYPE "int" +#define WCHAR_TYPE_SIZE 32 + +/* `wint_t' is a signed 32-bit type. */ +#define WINT_TYPE "int" +#define WINT_TYPE_SIZE 32 + +/**** Register Usage. */ + +/*** Basic Characteristics of Registers. */ + +#define BPF_R0 0 +#define BPF_R1 1 +#define BPF_R2 2 +#define BPF_R3 3 +#define BPF_R4 4 +#define BPF_R5 5 +#define BPF_R6 6 +#define BPF_CTX BPF_R6 +#define BPF_R7 7 +#define BPF_R8 8 +#define BPF_R9 9 +#define BPF_SP BPF_R9 +#define BPF_R10 10 +#define BPF_FP BPF_R10 +/* 11 is not a real eBPF hard register and is eliminated or not used + in the final assembler. See below. */ + +#define FIRST_PSEUDO_REGISTER 12 + +/* The registers %r0..%r8 are available for general allocation. + %r9 is the pseudo-stack pointer. + %r10 is the stack frame, which is read-only. + %r11 (__arg__) is a fake register that always gets eliminated. */ +#define FIXED_REGISTERS \ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1} + +/* %r0..%r5 are clobbered by function calls. */ +#define CALL_USED_REGISTERS \ + {1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1} + +/**** Register Classes. */ + +enum reg_class +{ + NO_REGS, /* no registers in set. */ + ALL_REGS, /* all registers. */ + LIM_REG_CLASSES /* max value + 1. */ +}; + +#define N_REG_CLASSES (int) LIM_REG_CLASSES +#define GENERAL_REGS ALL_REGS + +/* An initializer containing the names of the register classes as C + string constants. These names are used in writing some of the + debugging dumps. */ +#define REG_CLASS_NAMES \ +{ \ + "NO_REGS", \ + "ALL_REGS" \ +} + +/* An initializer containing the contents of the register classes, as + integers which are bit masks. The Nth integer specifies the + contents of class N. The way the integer MASK is interpreted is + that register R is in the class if `MASK & (1 << R)' is 1. + + In eBPF all the hard registers are considered general-purpose + integer registers. */ +#define REG_CLASS_CONTENTS \ +{ \ + 0x00000000, /* NO_REGS */ \ + 0x00000fff, /* ALL_REGS */ \ +} + +/* A C expression whose value is a register class containing hard + register REGNO. In general there is more that one such class; + choose a class which is "minimal", meaning that no smaller class + also contains the register. */ +#define REGNO_REG_CLASS(REGNO) GENERAL_REGS + +/* A macro whose definition is the name of the class to which a + valid base register must belong. A base register is one used in + an address which is the register value plus a displacement. */ +#define BASE_REG_CLASS GENERAL_REGS + +/* A macro whose definition is the name of the class to which a + valid index register must belong. An index register is one used + in an address where its value is either multiplied by a scale + factor or added to another register (as well as added to a + displacement). */ +#define INDEX_REG_CLASS NO_REGS + +/* C expression which is nonzero if register number REGNO is suitable + for use as a base register in operand addresses. In eBPF every + hard register can be used for this purpose. */ +#define REGNO_OK_FOR_BASE_P(REGNO) \ + ((REGNO) < FIRST_PSEUDO_REGISTER) + +/* C expression which is nonzero if register number REGNO is suitable + for use as an index register in operand addresses. */ +#define REGNO_OK_FOR_INDEX_P(REGNO) false + +/**** Debugging Info ****/ + +/* We cannot support DWARF2 because of the limitations of eBPF. */ +#define DBX_DEBUGGING_INFO + +/**** Stack Layout and Calling Conventions. */ + +/*** Basic Stack Layout. */ + +#define STACK_GROWS_DOWNWARD 1 +#define FRAME_GROWS_DOWNWARD 1 + +/* The argument pointer always points to the first argument. */ +#define FIRST_PARM_OFFSET(FNDECL) 0 + +/* Unsupported. */ +#define RETURN_ADDR_RTX(count, frame) const0_rtx + +/*** Registers That Address the Stack Frame. */ + +#define FRAME_POINTER_REGNUM 10 +#define STACK_POINTER_REGNUM 9 +#define ARG_POINTER_REGNUM 11 +#define STATIC_CHAIN_REGNUM 8 + +/*** Registers elimination. */ + +#define ELIMINABLE_REGS \ + {{ ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM }, \ + { ARG_POINTER_REGNUM, STACK_POINTER_REGNUM }} + +/* Define the offset between two registers, one to be eliminated, and + the other its replacement, at the start of a routine. */ +#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ + do \ + { \ + (OFFSET) = bpf_initial_elimination_offset ((FROM), (TO)); \ + } while (0) + +/*** Passing Function Arguments on the Stack. */ + +/* The eBPF ABI doesn't support passing arguments on the stack. Only + in the first five registers. Code in bpf.c assures the stack is + never used when passing arguments. However, we still have to + define the constants below. */ + +/* If nonzero, push insns will be used to pass outgoing arguments. */ +#define PUSH_ARGS 0 + +/* If nonzero, function arguments will be evaluated from last to + first, rather than from first to last. */ +#define PUSH_ARGS_REVERSED 1 + +/* Allocate stack space for arguments at the beginning of each + function. */ +#define ACCUMULATE_OUTGOING_ARGS 1 + +/*** Passing Arguments in Registers. */ + +/* Use an integer in order to keep track of the number of arguments + passed to a function in integer registers, up to + MAX_ARGS_IN_REGISTERS. */ +#define CUMULATIVE_ARGS int + +/* INIT_CUMULATIVE_ARGS initializes a variable CUM of type + CUMULATIVE_ARGS for a call to a function whose data type is FNTYPE. + For a library call, FNTYPE is 0. */ +#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,FNDECL,N_NAMED_ARGS) \ + memset (&(CUM), 0, sizeof (CUM)) + +/* Nonzero if N is the number of a hard register in which function + arguments are sometimes passed. */ +#define FUNCTION_ARG_REGNO_P(N) ((N) >= 1 && (N) <= 5) + +/*** How Scalar Function Values are Returned. */ + +/* Define how to find the value returned by a library function + assuming the value has mode MODE. This is always %r0 for eBPF. */ +#define LIBCALL_VALUE(MODE) \ + gen_rtx_REG ((MODE), 0) + +/*** Generating Code for Profiling. */ + +/* We do not support profiling yet, so do not call `mcount'. */ +#define FUNCTION_PROFILER(FILE, LABELNO) do { } while (0) + +/*** Function Entry and Exit. */ + +/* We do not require an accurate stack pointer at function return. + This is because the stack pointer's original value is initialized + from the frame pointer, rather than decreased, to satisfy the + kernel's verifier. Thus, we have to save the stack pointer in + function prologue and restore it in function epilogue. If + EXIT_IGNORE_STACK is not set, then superfluous instructions are + generated to save and restore the stack pointer after and before + the function epilogue, respectively. */ +#define EXIT_IGNORE_STACK 1 + +/**** Support for Nested Functions. */ + +/* We have to define TRAMPOLINE_SIZE even if we don't ever generate + them. Set to 64 arbitrarily. */ +#define TRAMPOLINE_SIZE 64 + +/**** Addressing Modes. */ + +/* Maximum number of registers that can appear in a valid memory + address. */ +#define MAX_REGS_PER_ADDRESS 1 + +/* 1 if X is an rtx for a constant that is a valid address. */ + +#define CONSTANT_ADDRESS_P(X) 0 + +/**** Describing Relative Costs of Operations. */ + +/* Cost of a branch instruction. A value of 1 is the default. */ +#define BRANCH_COST(SPEED_P,PREDICTABLE_P) 1 + +/* The SPARC port says: Nonzero if access to memory by bytes is slow + and undesirable. For RISC chips, it means that access to memory by + bytes is no better than access by words when possible, so grab a + whole word and maybe make use of that. */ +#define SLOW_BYTE_ACCESS 1 + +/* Threshold of number of scalar memory-to-memory move instructions, + _below_ which a sequence of insns should be generated instead of a + string move insn or a library call. */ +#define MOVE_RATIO(speed) 128 + +/* Threshold of number of scalar move instructions, _below_ which a + sequence of insns should be generated to clear memory instead of a + string clear insn or a library call. */ +#define CLEAR_RATIO(speed) 128 + +/* Threshold of number of scalar move instructions, _below_ which a + sequence of insns should be generated to set memory to a constant + value, instead of a block set insn or a library call. */ +#define SET_RATIO(speed) 128 + +/* True if it is as good or better to call a constant function address + than to call an address kept in a register. */ +#define NO_FUNCTION_CSE 1 + +/**** Dividing the Output into Sections. */ + +#define TEXT_SECTION_ASM_OP "\t.text" +#define DATA_SECTION_ASM_OP "\t.data" +#define BSS_SECTION_ASM_OP "\t.bss" +#define COMMON_ASM_OP "\t.common\t" + +/**** Defining the Output Assembler Language. */ + +/*** The Overall Framework of an Assembler File. */ + +#define ASM_COMMENT_START ";" + +/* Output to assembler file text saying following lines + may contain character constants, extra white space, comments, etc. */ + +#ifndef ASM_APP_ON +#define ASM_APP_ON " #APP\n" +#endif + +/* Output to assembler file text saying following lines + no longer contain unusual constructs. */ + +#ifndef ASM_APP_OFF +#define ASM_APP_OFF " #NO_APP\n" +#endif + +/*** Output of Data. */ + +/*** Output of Uninitialized Variables. */ + +/* How to output an assembler line to define a local common + symbol. */ + +#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ + do \ + { \ + fprintf ((FILE), "%s", COMMON_ASM_OP); \ + assemble_name ((FILE), (NAME)); \ + fprintf ((FILE), ",%u,%u\n", (int)(SIZE), (ALIGN) / (BITS_PER_UNIT)); \ + } \ + while (0) + +/* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named + NAME whose size is SIZE bytes and alignment is ALIGN bytes. + Try to use asm_output_aligned_bss to implement this macro. */ + +#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ + do { \ + ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN); \ + } while (0) + +/* This says how to output an assembler line to define a local common + symbol. */ + +#define ASM_OUTPUT_ALIGNED_LOCAL(FILE,NAME,SIZE,ALIGN) \ + ( fputs ("\t.lcomm ", (FILE)), \ + assemble_name ((FILE), (NAME)), \ + fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", \ + (SIZE), ((ALIGN) / BITS_PER_UNIT))) + +/*** Output and Generation of Labels. */ + +/* Globalizing directive for a label. */ +#define GLOBAL_ASM_OP "\t.global\t" + +/* This is how to store into the string LABEL + the symbol_ref name of an internal numbered label where + PREFIX is the class of label and NUM is the number within the class. + This is suitable for output with `assemble_name'. */ + +#undef ASM_GENERATE_INTERNAL_LABEL +#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ + sprintf ((LABEL), "*%s%s%ld", (LOCAL_LABEL_PREFIX), (PREFIX), (long)(NUM)) + +/*** Macros Controlling Initialization Routines. */ + +#define INIT_SECTION_ASM_OP "\t.init" +#define FINI_SECTION_ASM_OP "\t.fini" + +/*** Output of Assembler Instructions. */ + +#define REGISTER_NAMES \ + { "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7", \ + "%r8", "%r9", "%fp", "__arg__" } + +#define ADDITIONAL_REGISTER_NAMES \ + { { "%a", 0 }, { "%ctx", 6 }, { "%r10" , 10 } } + +#define LOCAL_LABEL_PREFIX "." +#define USER_LABEL_PREFIX "" + +#define PRINT_OPERAND(STREAM,X,CODE) \ + bpf_print_operand ((STREAM),(X),(CODE)) + +#define PRINT_OPERAND_ADDRESS(STREAM,X) \ + bpf_print_operand_address ((STREAM), (X)) + +/*** Assembler Commands for Alignment. */ + +/* This is how to output an assembler line that says to advance the + location counter to a multiple of 2**LOG bytes. */ +#define ASM_OUTPUT_ALIGN(STREAM,LOG) \ + fprintf (STREAM, "\t.align\t%d\n", (LOG)) + +/* This is how to output an assembler line + that says to advance the location counter by SIZE bytes. */ +#define ASM_OUTPUT_SKIP(FILE,SIZE) \ + fprintf (FILE, "\t.skip\t" HOST_WIDE_INT_PRINT_UNSIGNED "\n", (SIZE)) + +/**** Miscellaneous Parameters. */ + +/* Specify the machine mode that this machine uses for the index in + the tablejump instruction. */ +#define CASE_VECTOR_MODE DImode + +/* Define if operations between registers with integral mode smaller + than a word are always performed on the entire register. */ +#define WORD_REGISTER_OPERATIONS 1 + +/* C expression indicating when insns that read memory in MEM_MODE, an + integral mode narrower than a word, set the bits outsize of + MEM_MODE to be either the sign-extension or the zero-extension of + the data read. */ +#define LOAD_EXTEND_OP(MODE) ZERO_EXTEND + +/* The maximum number of bytes that a single instruction can move + quickly between memory and registers or between two memory + locations. */ +#define MOVE_MAX 8 + +/* An alias for the machine mode for pointers. */ +#define Pmode DImode + +/* An alias for the machine mode used for memory references to + functions being called, in 'call' RTL expressions. */ +#define FUNCTION_MODE Pmode + +/* No libm on eBPF (for now.) */ +#define MATH_LIBRARY "" + +/**** libgcc settings. */ + +/* Iterating over the global constructors and destructors and + executing them requires the ability of doing indirect calls. + + eBPF doesn't support indirect calls, so no chance of supporting + constructors and destructors. */ +#define DO_GLOBAL_CTORS_BODY \ + do { } while (0) +#define DO_GLOBAL_DTORS_BODY \ + do { } while (0) + +#endif /* ! GCC_BPF_H */ |