From 6bde23b75e12d3193a32ad182007dfd5d7ac2f6f Mon Sep 17 00:00:00 2001 From: hermansimensen Date: Thu, 3 Aug 2023 13:29:04 +0200 Subject: [PATCH] Add em_asm intrinsic --- IDEHelper/Compiler/BfIRCodeGen.cpp | 48 ++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/IDEHelper/Compiler/BfIRCodeGen.cpp b/IDEHelper/Compiler/BfIRCodeGen.cpp index 15315440..6a81da38 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.cpp +++ b/IDEHelper/Compiler/BfIRCodeGen.cpp @@ -3075,11 +3075,53 @@ void BfIRCodeGen::HandleNextCmd() switch (intrinsicData->mIntrinsic) { case BfIRIntrinsic__PLATFORM: + { + if (intrinsicData->mName == "em_asm_internal") { - FatalError(StrFormat("Unable to find intrinsic '%s'", intrinsicData->mName.c_str())); - } - break; + llvm::StringRef strContent; + llvm::ConstantDataArray* dataArray; + if (const llvm::ConstantExpr* ce = llvm::dyn_cast(args[0])) + { + llvm::Value* firstOperand = ce->getOperand(0); + if (llvm::GlobalVariable* gv = llvm::dyn_cast(firstOperand)) + { + if (gv->getType()->isPointerTy()) + { + if (dataArray = llvm::dyn_cast(gv->getInitializer())) + { + strContent = dataArray->getAsString(); + } + } + } + } + else + FatalError("Value is not ConstantExpr"); + + auto charType = llvm::IntegerType::get(*mLLVMContext, 8); + std::vector 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_And: case BfIRIntrinsic_Div: