
Currently, GlobalObject has an "alignment" property... but it's basically nonsense: alignment doesn't mean the same thing for variables and functions, and it's completely meaningless for ifuncs. This "removes" (actually marking protected) the methods from GlobalObject, adds the relevant methods to Function and GlobalVariable, and adjusts the code appropriately. This should make future alignment-related cleanups easier.
63 lines
1.8 KiB
C++
63 lines
1.8 KiB
C++
//===- Function.cpp - The Function class of Sandbox IR --------------------===//
|
|
//
|
|
// 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/SandboxIR/Function.h"
|
|
#include "llvm/IR/Value.h"
|
|
#include "llvm/SandboxIR/Context.h"
|
|
|
|
namespace llvm::sandboxir {
|
|
|
|
FunctionType *Function::getFunctionType() const {
|
|
return cast<FunctionType>(
|
|
Ctx.getType(cast<llvm::Function>(Val)->getFunctionType()));
|
|
}
|
|
|
|
void Function::setAlignment(MaybeAlign Align) {
|
|
Ctx.getTracker()
|
|
.emplaceIfTracking<
|
|
GenericSetter<&Function::getAlign, &Function::setAlignment>>(this);
|
|
cast<llvm::Function>(Val)->setAlignment(Align);
|
|
}
|
|
|
|
#ifndef NDEBUG
|
|
void Function::dumpNameAndArgs(raw_ostream &OS) const {
|
|
auto *F = cast<llvm::Function>(Val);
|
|
OS << *F->getReturnType() << " @" << F->getName() << "(";
|
|
interleave(
|
|
F->args(),
|
|
[this, &OS](const llvm::Argument &LLVMArg) {
|
|
auto *SBArg = cast_or_null<Argument>(Ctx.getValue(&LLVMArg));
|
|
if (SBArg == nullptr)
|
|
OS << "NULL";
|
|
else
|
|
SBArg->printAsOperand(OS);
|
|
},
|
|
[&] { OS << ", "; });
|
|
OS << ")";
|
|
}
|
|
|
|
void Function::dumpOS(raw_ostream &OS) const {
|
|
dumpNameAndArgs(OS);
|
|
OS << " {\n";
|
|
auto *LLVMF = cast<llvm::Function>(Val);
|
|
interleave(
|
|
*LLVMF,
|
|
[this, &OS](const llvm::BasicBlock &LLVMBB) {
|
|
auto *BB = cast_or_null<BasicBlock>(Ctx.getValue(&LLVMBB));
|
|
if (BB == nullptr)
|
|
OS << "NULL";
|
|
else
|
|
OS << *BB;
|
|
},
|
|
[&OS] { OS << "\n"; });
|
|
OS << "}\n";
|
|
}
|
|
#endif // NDEBUG
|
|
|
|
} // namespace llvm::sandboxir
|