Files
gps/tools/local/circt/include/llvm/ABI/TargetInfo.h
T
2026-07-12 11:01:51 +03:00

91 lines
3.0 KiB
C++

//===----- TargetInfo.h - Target ABI information ------------------- 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
//
//===----------------------------------------------------------------------===//
///
/// \file
/// Target-specific ABI information and factory functions.
///
//===----------------------------------------------------------------------===//
#ifndef LLVM_ABI_TARGETINFO_H
#define LLVM_ABI_TARGETINFO_H
#include "llvm/ABI/FunctionInfo.h"
#include "llvm/ABI/Types.h"
#include <cassert>
namespace llvm {
namespace abi {
enum RecordArgABI {
/// Pass it using the normal C aggregate rules for the ABI, potentially
/// introducing extra copies and passing some or all of it in registers.
RAA_Default = 0,
/// Pass it on the stack using its defined layout. The argument must be
/// evaluated directly into the correct stack position in the arguments area,
/// and the call machinery must not move it or introduce extra copies.
RAA_DirectInMemory,
/// Pass it as a pointer to temporary memory.
RAA_Indirect
};
/// Flags controlling target-specific ABI compatibility behaviour.
/// Construct with the default constructor for the current ABI, or use
/// fromVersion() to get the flags that match a specific Clang version.
struct ABICompatInfo {
bool PassInt128VectorsInMem : 1;
bool ReturnCXXRecordGreaterThan128InMem : 1;
bool ClassifyIntegerMMXAsSSE : 1;
bool HonorsRevision98 : 1;
bool Clang11Compat : 1;
ABICompatInfo()
: PassInt128VectorsInMem(true), ReturnCXXRecordGreaterThan128InMem(true),
ClassifyIntegerMMXAsSSE(true), HonorsRevision98(true),
Clang11Compat(true) {}
/// Return flags matching the ABI emitted by the given Clang major version.
// TODO: fill in per-version flag overrides.
static ABICompatInfo fromVersion(unsigned /*ClangMajor*/) {
return ABICompatInfo();
}
};
class TargetInfo {
private:
ABICompatInfo CompatInfo;
public:
TargetInfo() : CompatInfo() {}
explicit TargetInfo(const ABICompatInfo &Info) : CompatInfo(Info) {}
virtual ~TargetInfo() = default;
/// Populate FI with the target's ABI-lowering decisions for each argument
/// and return value.
virtual void computeInfo(FunctionInfo &FI) const = 0;
virtual bool isPassByRef(const Type *Ty) const { return false; }
const ABICompatInfo &getABICompatInfo() const { return CompatInfo; }
protected:
LLVM_ABI RecordArgABI getRecordArgABI(const RecordType *RT) const;
LLVM_ABI RecordArgABI getRecordArgABI(const Type *Ty) const;
LLVM_ABI bool isPromotableInteger(const IntegerType *IT) const;
LLVM_ABI ArgInfo getNaturalAlignIndirect(const Type *Ty,
bool ByVal = true) const;
LLVM_ABI bool isAggregateTypeForABI(const Type *Ty) const;
};
LLVM_ABI std::unique_ptr<TargetInfo> createBPFTargetInfo(TypeBuilder &TB);
} // namespace abi
} // namespace llvm
#endif // LLVM_ABI_TARGETINFO_H