slang_rs_backend.cpp revision 462aefd62cc646d2ff753c1d003ef3cd7bbea26
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <vector> 2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string> 3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_backend.hpp" 5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_context.hpp" 6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_var.hpp" 7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_func.hpp" 8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_type.hpp" 9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/Metadata.h" /* for class llvm::NamedMDNode */ 11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/ADT/Twine.h" /* for class llvm::Twine */ 12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/AST/DeclGroup.h" /* for class clang::DeclGroup */ 14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/ADT/StringExtras.h" /* for function llvm::utostr_32() and llvm::itostr() */ 15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/Support/IRBuilder.h" /* for class llvm::IRBuilder */ 17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/Constant.h" /* for class llvm::Constant */ 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/Constants.h" /* for class llvm::Constant* */ 19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/Module.h" /* for class llvm::Module */ 20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/Function.h" /* for class llvm::Function */ 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/DerivedTypes.h" /* for class llvm::*Type */ 22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define MAKE 24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSBackend::RSBackend(RSContext* Context, 28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Diagnostic &Diags, 29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const CodeGenOptions& CodeGenOpts, 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const TargetOptions& TargetOpts, 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const PragmaList& Pragmas, 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::raw_ostream* OS, 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao SlangCompilerOutputTy OutputType) : 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mContext(Context), 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Backend(Diags, 36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao CodeGenOpts, 37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao TargetOpts, 38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Pragmas, 39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao OS, 40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao OutputType), 41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mExportVarMetadata(NULL) 42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao{ 43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSBackend::HandleTopLevelDecl(DeclGroupRef D) { 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Backend::HandleTopLevelDecl(D); 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSBackend::HandleTranslationUnitEx(ASTContext& Ctx) { 52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mContext->processExport(Ctx); 53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Dump export variable info */ 55462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(mContext->hasExportVar()) { 56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(mExportVarMetadata == NULL) 57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mExportVarMetadata = llvm::NamedMDNode::Create(mLLVMContext, "#rs_export_var", NULL, 0, mpModule); 58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::SmallVector<llvm::Value*, 2> ExportVarInfo; 60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 61462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_var_iterator I = mContext->export_vars_begin(); 62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != mContext->export_vars_end(); 63462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportVar* EV = *I; 66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* ET = EV->getType(); 67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* variable name */ 69462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportVarInfo.push_back( llvm::MDString::get(mLLVMContext, EV->getName().c_str()) ); 70462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* type name */ 72462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ET->getClass() == RSExportType::ExportClassPrimitive) 73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportVarInfo.push_back( llvm::MDString::get(mLLVMContext, llvm::utostr_32(static_cast<const RSExportPrimitiveType*>(ET)->getType())) ); 74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(ET->getClass() == RSExportType::ExportClassPointer) 75462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportVarInfo.push_back( llvm::MDString::get(mLLVMContext, ("*" + static_cast<const RSExportPointerType*>(ET)->getPointeeType()->getName()).c_str()) ); 76462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportVarInfo.push_back( llvm::MDString::get(mLLVMContext, EV->getType()->getName().c_str()) ); 78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mExportVarMetadata->addOperand( llvm::MDNode::get(mLLVMContext, ExportVarInfo.data(), ExportVarInfo.size()) ); 80462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportVarInfo.clear(); 82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Dump export function info */ 86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(mContext->hasExportFunc()) { 87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(mExportFuncMetadata == NULL) 88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mExportFuncMetadata = llvm::NamedMDNode::Create(mLLVMContext, "#rs_export_func", NULL, 0, mpModule); 89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::SmallVector<llvm::Value*, 1> ExportFuncInfo; 91462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_func_iterator I = mContext->export_funcs_begin(); 93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != mContext->export_funcs_end(); 94462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 95462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportFunc* EF = *I; 97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* function name */ 99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!EF->hasParam()) 100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportFuncInfo.push_back( llvm::MDString::get(mLLVMContext, EF->getName().c_str()) ); 101462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else { 102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::Function* F = mpModule->getFunction(EF->getName()); 103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::Function* HelperFunction; 104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const std::string HelperFunctionName = ".helper_" + EF->getName(); 105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(F && "Function marked as exported disappeared in Bitcode"); 107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Create helper function */ 109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::PointerType* HelperFunctionParameterTypeP = llvm::PointerType::getUnqual(EF->getParamPacketType()->getLLVMType()); 111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::FunctionType* HelperFunctionType; 112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::vector<const llvm::Type*> Params; 113462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Params.push_back(HelperFunctionParameterTypeP); 115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao HelperFunctionType = llvm::FunctionType::get(F->getReturnType(), Params, false); 116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao HelperFunction = llvm::Function::Create(HelperFunctionType, llvm::GlobalValue::ExternalLinkage, HelperFunctionName, mpModule); 118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao HelperFunction->addFnAttr(llvm::Attribute::NoInline); 120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao HelperFunction->setCallingConv(F->getCallingConv()); 121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 122462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Create helper function body */ 123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 124462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::Argument* HelperFunctionParameter = &(*HelperFunction->arg_begin()); 125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::BasicBlock* BB = llvm::BasicBlock::Create(mLLVMContext, "entry", HelperFunction); 126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::IRBuilder<>* IB = new llvm::IRBuilder<>(BB); 127462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::SmallVector<llvm::Value*, 6> Params; 128462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::Value* Idx[2]; 129462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 130462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Idx[0] = llvm::ConstantInt::get(llvm::Type::getInt32Ty(mLLVMContext), 0); 131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* getelementptr and load instruction for all elements in parameter .p */ 133462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(int i=0;i<EF->getNumParameters();i++) { 134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* getelementptr */ 135462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Idx[1] = llvm::ConstantInt::get(llvm::Type::getInt32Ty(mLLVMContext), i); 136462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::Value* Ptr = IB->CreateInBoundsGEP(HelperFunctionParameter, Idx, Idx + 2); 137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* load */ 138462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::Value* V = IB->CreateLoad(Ptr); 139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Params.push_back(V); 140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* call and pass the all elements as paramter to F */ 143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::CallInst* CI = IB->CreateCall(F, Params.data(), Params.data() + Params.size()); 144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao CI->setCallingConv(F->getCallingConv()); 145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(F->getReturnType() == llvm::Type::getVoidTy(mLLVMContext)) 147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao IB->CreateRetVoid(); 148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao IB->CreateRet(CI); 150462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao delete IB; 152462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 154462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportFuncInfo.push_back( llvm::MDString::get(mLLVMContext, HelperFunctionName.c_str()) ); 156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 157462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 158462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mExportFuncMetadata->addOperand( llvm::MDNode::get(mLLVMContext, ExportFuncInfo.data(), ExportFuncInfo.size()) ); 159462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 160462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportFuncInfo.clear(); 161462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 162462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 163462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Dump export type info */ 165462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(mContext->hasExportType()) { 166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::SmallVector<llvm::Value*, 1> ExportTypeInfo; 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 168462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_type_iterator I = mContext->export_types_begin(); 169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != mContext->export_types_end(); 170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* First, dump type name list to export */ 173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* ET = I->getValue(); 174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportTypeInfo.clear(); 176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* type name */ 177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ExportTypeInfo.push_back( llvm::MDString::get(mLLVMContext, ET->getName().c_str()) ); 178462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ET->getClass() == RSExportType::ExportClassRecord) { 180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(mExportTypeMetadata == NULL) 183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mExportTypeMetadata = llvm::NamedMDNode::Create(mLLVMContext, "#rs_export_type", NULL, 0, mpModule); 184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mExportTypeMetadata->addOperand( llvm::MDNode::get(mLLVMContext, ExportTypeInfo.data(), ExportTypeInfo.size()) ); 186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Now, export struct field information to %[struct name] */ 188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string StructInfoMetadataName = "%" + ET->getName(); 189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::NamedMDNode* StructInfoMetadata = llvm::NamedMDNode::Create(mLLVMContext, StructInfoMetadataName.c_str(), NULL, 0, mpModule); 190462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::SmallVector<llvm::Value*, 3> FieldInfo; 191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(StructInfoMetadata->getNumOperands() == 0 && "Metadata with same name was created before"); 193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin(); 194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FI != ERT->fields_end(); 195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FI++) 196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 197462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType::Field* F = *FI; 198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 1. field name */ 200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldInfo.push_back( llvm::MDString::get(mLLVMContext, F->getName().c_str()) ); 201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 2. field type name */ 202462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldInfo.push_back( llvm::MDString::get(mLLVMContext, F->getType()->getName().c_str()) ); 203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 204462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 3. field kind */ 205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(F->getType()->getClass()) { 206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPrimitive: 207462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassVector: 208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao RSExportPrimitiveType* EPT = (RSExportPrimitiveType*) F->getType(); 210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldInfo.push_back( llvm::MDString::get(mLLVMContext, llvm::itostr(EPT->getKind())) ); 211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldInfo.push_back( llvm::MDString::get(mLLVMContext, llvm::itostr(RSExportPrimitiveType::DataKindUser)) ); 216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao StructInfoMetadata->addOperand( llvm::MDNode::get(mLLVMContext, FieldInfo.data(), FieldInfo.size()) ); 220462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldInfo.clear(); 222462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } /* ET->getClass() == RSExportType::ExportClassRecord */ 224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 229462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSBackend::~RSBackend() { 231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 234462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} /* namespace slang */ 235