mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 03:52:19 +02:00
Add em_asm intrinsic
This commit is contained in:
parent
c8ca955e5b
commit
6bde23b75e
1 changed files with 45 additions and 3 deletions
|
@ -3076,10 +3076,52 @@ void BfIRCodeGen::HandleNextCmd()
|
||||||
{
|
{
|
||||||
case BfIRIntrinsic__PLATFORM:
|
case BfIRIntrinsic__PLATFORM:
|
||||||
{
|
{
|
||||||
FatalError(StrFormat("Unable to find intrinsic '%s'", intrinsicData->mName.c_str()));
|
if (intrinsicData->mName == "em_asm_internal")
|
||||||
|
{
|
||||||
|
llvm::StringRef strContent;
|
||||||
|
llvm::ConstantDataArray* dataArray;
|
||||||
|
if (const llvm::ConstantExpr* ce = llvm::dyn_cast<llvm::ConstantExpr>(args[0]))
|
||||||
|
{
|
||||||
|
llvm::Value* firstOperand = ce->getOperand(0);
|
||||||
|
if (llvm::GlobalVariable* gv = llvm::dyn_cast<llvm::GlobalVariable>(firstOperand))
|
||||||
|
{
|
||||||
|
if (gv->getType()->isPointerTy())
|
||||||
|
{
|
||||||
|
if (dataArray = llvm::dyn_cast<llvm::ConstantDataArray>(gv->getInitializer()))
|
||||||
|
{
|
||||||
|
strContent = dataArray->getAsString();
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
FatalError("Value is not ConstantExpr");
|
||||||
|
|
||||||
|
|
||||||
|
auto charType = llvm::IntegerType::get(*mLLVMContext, 8);
|
||||||
|
std::vector<llvm::Constant*> chars(strContent.size());
|
||||||
|
for (unsigned int i = 0; i < strContent.size(); i++)
|
||||||
|
{
|
||||||
|
chars[i] = llvm::ConstantInt::get(charType, strContent[i]);;
|
||||||
|
}
|
||||||
|
|
||||||
|
chars.push_back(llvm::ConstantInt::get(charType, 0));
|
||||||
|
auto stringType = llvm::ArrayType::get(charType, chars.size());
|
||||||
|
|
||||||
|
auto globalVar = (llvm::GlobalVariable*)mLLVMModule->getOrInsertGlobal("", stringType);
|
||||||
|
globalVar->setSection("em_asm");
|
||||||
|
globalVar->setInitializer(llvm::ConstantArray::get(stringType, chars));
|
||||||
|
globalVar->setConstant(true);
|
||||||
|
globalVar->setLinkage(llvm::GlobalValue::LinkageTypes::ExternalLinkage);
|
||||||
|
globalVar->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
|
||||||
|
|
||||||
|
SetResult(curId, llvm::ConstantExpr::getBitCast(globalVar, charType->getPointerTo()));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
FatalError(StrFormat("Unable to find intrinsic '%s'", intrinsicData->mName.c_str()));
|
||||||
|
break;
|
||||||
|
}
|
||||||
case BfIRIntrinsic_Add:
|
case BfIRIntrinsic_Add:
|
||||||
case BfIRIntrinsic_And:
|
case BfIRIntrinsic_And:
|
||||||
case BfIRIntrinsic_Div:
|
case BfIRIntrinsic_Div:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue