93 lines
2.6 KiB
C++
93 lines
2.6 KiB
C++
//==-- ABIArgInfo.h - Abstract info regarding ABI-specific arguments -------==//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Defines ABIArgInfo and associated types used by CIR to track information
|
|
// regarding ABI-coerced types for function arguments and return values. This
|
|
// was moved to the common library as it might be used by both CIRGen and
|
|
// passes.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef CLANG_CIR_ABIARGINFO_H
|
|
#define CLANG_CIR_ABIARGINFO_H
|
|
|
|
#include "mlir/IR/Types.h"
|
|
#include "clang/CIR/MissingFeatures.h"
|
|
|
|
namespace cir {
|
|
|
|
class ABIArgInfo {
|
|
public:
|
|
enum Kind : uint8_t {
|
|
/// Pass the argument directly using the normal converted CIR type,
|
|
/// or by coercing to another specified type stored in 'CoerceToType'). If
|
|
/// an offset is specified (in UIntData), then the argument passed is offset
|
|
/// by some number of bytes in the memory representation. A dummy argument
|
|
/// is emitted before the real argument if the specified type stored in
|
|
/// "PaddingType" is not zero.
|
|
Direct,
|
|
|
|
/// Ignore the argument (treat as void). Useful for void and empty
|
|
/// structs.
|
|
Ignore,
|
|
|
|
// TODO: more argument kinds will be added as the upstreaming proceeds.
|
|
};
|
|
|
|
private:
|
|
mlir::Type typeData;
|
|
struct DirectAttrInfo {
|
|
unsigned offset;
|
|
unsigned align;
|
|
};
|
|
union {
|
|
DirectAttrInfo directAttr;
|
|
};
|
|
Kind theKind;
|
|
|
|
public:
|
|
ABIArgInfo(Kind k = Direct) : directAttr{0, 0}, theKind(k) {}
|
|
|
|
static ABIArgInfo getDirect(mlir::Type ty = nullptr) {
|
|
ABIArgInfo info(Direct);
|
|
info.setCoerceToType(ty);
|
|
assert(!cir::MissingFeatures::abiArgInfo());
|
|
return info;
|
|
}
|
|
|
|
static ABIArgInfo getIgnore() { return ABIArgInfo(Ignore); }
|
|
|
|
Kind getKind() const { return theKind; }
|
|
bool isDirect() const { return theKind == Direct; }
|
|
bool isIgnore() const { return theKind == Ignore; }
|
|
|
|
bool canHaveCoerceToType() const {
|
|
assert(!cir::MissingFeatures::abiArgInfo());
|
|
return isDirect();
|
|
}
|
|
|
|
unsigned getDirectOffset() const {
|
|
assert(!cir::MissingFeatures::abiArgInfo());
|
|
return directAttr.offset;
|
|
}
|
|
|
|
mlir::Type getCoerceToType() const {
|
|
assert(canHaveCoerceToType() && "invalid kind!");
|
|
return typeData;
|
|
}
|
|
|
|
void setCoerceToType(mlir::Type ty) {
|
|
assert(canHaveCoerceToType() && "invalid kind!");
|
|
typeData = ty;
|
|
}
|
|
};
|
|
|
|
} // namespace cir
|
|
|
|
#endif // CLANG_CIR_ABIARGINFO_H
|