Files
revng-revng/lib/FunctionIsolation/StructInitializers.cpp
Alessandro Di Federico 53f6328507 Introduce PromoteCSVs
This commit takes out of EnforceABI the part taking care of creating
wrappers for calls to helpers and promoting CSV to local variables.
This decoupling, enables to run -promote-csvs multiple times, for
instance after inlining.
2021-04-22 18:07:24 +02:00

59 lines
1.9 KiB
C++

/// \file StructInitializers.cpp
/// \brief
//
// This file is distributed under the MIT License. See LICENSE.md for details.
//
#include "revng/FunctionIsolation/StructInitializers.h"
#include "revng/Support/FunctionTags.h"
using namespace llvm;
const char *StructInitializerPrefix = "struct_initializer";
StructInitializers::StructInitializers(llvm::Module *M) :
Pool(M, false), Context(M->getContext()) {
Pool.addFnAttribute(Attribute::NoUnwind);
Pool.addFnAttribute(Attribute::ReadOnly);
Pool.setTags({ &FunctionTags::StructInitializer });
// Record existing initializers
for (Function &F : FunctionTags::StructInitializer.functions(M)) {
auto *RT = F.getFunctionType()->getReturnType();
if (auto *Struct = dyn_cast<StructType>(RT))
Pool.record(Struct, &F);
}
}
Instruction *StructInitializers::createReturn(IRBuilder<> &Builder,
ArrayRef<Value *> Values) {
// Obtain return StructType
auto *FT = Builder.GetInsertBlock()->getParent()->getFunctionType();
auto *ReturnType = cast<StructType>(FT->getReturnType());
SmallVector<Type *, 8> Types;
llvm::copy(ReturnType->elements(), std::back_inserter(Types));
// Create struct_initializer
Function *Initializer = Pool.get(ReturnType,
ReturnType,
Types,
StructInitializerPrefix);
// Lazily populate its body
if (Initializer->isDeclaration()) {
auto *Entry = BasicBlock::Create(Context, "", Initializer);
IRBuilder<> InitializerBuilder(Entry);
SmallVector<Value *, 8> Arguments;
for (Argument &Arg : Initializer->args())
Arguments.push_back(&Arg);
InitializerBuilder.CreateAggregateRet(Arguments.data(), Arguments.size());
}
// Emit a call in the caller
return Builder.CreateRet(Builder.CreateCall(Initializer, Values));
}