This PR introduces `ABIFunctionInfo` and surrounding utility helpers, and is part of the set of breakout PRs to upstream the LLVM ABI lowering library prototyped in https://github.com/llvm/llvm-project/pull/140112. `ABIFunctionInfo` is directly analogous to `CGFunctionInfo` from Clang's existing CodeGen pipeline, and represents an ABI lowered view of the function signature, decoupled from both the Clang AST and LLVM IR. `ABIArgInfo` encodes lowering decisions and currently supports Direct,Extend,Indirect and Ignore which are required for our initial goal of implementing x86-64 SysV and BPF, but this will change as the library grows to represent more targets that need them. This PR is a direct precursor to the implementation of `ABIInfo` in the library as demonstrated in the PR linked above..
32 lines
1.1 KiB
C++
32 lines
1.1 KiB
C++
//===----- FunctionInfo.cpp - ABI Function 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ABI/FunctionInfo.h"
|
|
#include <optional>
|
|
|
|
using namespace llvm;
|
|
using namespace llvm::abi;
|
|
|
|
FunctionInfo *FunctionInfo::create(CallingConv::ID CC, const Type *ReturnType,
|
|
ArrayRef<const Type *> ArgTypes,
|
|
std::optional<unsigned> NumRequired) {
|
|
|
|
assert(!NumRequired || *NumRequired <= ArgTypes.size());
|
|
|
|
void *Buffer = operator new(totalSizeToAlloc<ArgEntry>(ArgTypes.size()));
|
|
|
|
FunctionInfo *FI =
|
|
new (Buffer) FunctionInfo(CC, ReturnType, ArgTypes.size(), NumRequired);
|
|
|
|
ArgEntry *Args = FI->getTrailingObjects();
|
|
for (unsigned I = 0; I < ArgTypes.size(); ++I)
|
|
new (&Args[I]) ArgEntry(ArgTypes[I]);
|
|
|
|
return FI;
|
|
}
|