//===- BPFCORE.h - Common info for Compile-Once Run-EveryWhere  -*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_BPF_BPFCORE_H
#define LLVM_LIB_TARGET_BPF_BPFCORE_H

#include "llvm/ADT/StringRef.h"

namespace llvm {

class BasicBlock;
class Instruction;
class Module;

class BPFCoreSharedInfo {
public:
  enum PatchableRelocKind : uint32_t {
    FIELD_BYTE_OFFSET = 0,
    FIELD_BYTE_SIZE,
    FIELD_EXISTENCE,
    FIELD_SIGNEDNESS,
    FIELD_LSHIFT_U64,
    FIELD_RSHIFT_U64,
    BTF_TYPE_ID_LOCAL,
    BTF_TYPE_ID_REMOTE,
    TYPE_EXISTENCE,
    TYPE_SIZE,
    ENUM_VALUE_EXISTENCE,
    ENUM_VALUE,

    MAX_FIELD_RELOC_KIND,
  };

  enum BTFTypeIdFlag : uint32_t {
    BTF_TYPE_ID_LOCAL_RELOC = 0,
    BTF_TYPE_ID_REMOTE_RELOC,

    MAX_BTF_TYPE_ID_FLAG,
  };

  enum PreserveTypeInfo : uint32_t {
    PRESERVE_TYPE_INFO_EXISTENCE = 0,
    PRESERVE_TYPE_INFO_SIZE,

    MAX_PRESERVE_TYPE_INFO_FLAG,
  };

  enum PreserveEnumValue : uint32_t {
    PRESERVE_ENUM_VALUE_EXISTENCE = 0,
    PRESERVE_ENUM_VALUE,

    MAX_PRESERVE_ENUM_VALUE_FLAG,
  };

  /// The attribute attached to globals representing a field access
  static constexpr StringRef AmaAttr = "btf_ama";
  /// The attribute attached to globals representing a type id
  static constexpr StringRef TypeIdAttr = "btf_type_id";

  /// llvm.bpf.passthrough builtin seq number
  static uint32_t SeqNum;

  /// Insert a bpf passthrough builtin function.
  static Instruction *insertPassThrough(Module *M, BasicBlock *BB,
                                        Instruction *Input,
                                        Instruction *Before);
};

} // namespace llvm

#endif
