国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

LLVM(5)ORC實(shí)例分析

這篇具有很好參考價(jià)值的文章主要介紹了LLVM(5)ORC實(shí)例分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

ORC實(shí)例總結(jié)

總結(jié)

  1. 因?yàn)锳PI茫茫多,邏輯上的一些概念需要搞清,編碼時(shí)會(huì)容易很多。
  2. JIT的運(yùn)行實(shí)體使用LLVMOrcCreateLLJIT可以創(chuàng)建出來(lái),邏輯上的JIT實(shí)例。
  3. JIT實(shí)例需要加入運(yùn)行庫(kù)(依賴庫(kù))和用戶定義的context(運(yùn)行內(nèi)容)才能運(yùn)行,LLVMOrcLLJITAddLLVMIRModule函數(shù)負(fù)責(zé)將運(yùn)行庫(kù)和ctx加入JIT實(shí)例。
  4. context相當(dāng)于給用戶自定義代碼的上下文,其中可以加入多個(gè)module,每個(gè)module中又可以加入多個(gè)function??梢岳斫鉃橐粋€(gè)工程(context)里面加入多個(gè)文件,每個(gè)文件(module)中又包含多個(gè)函數(shù)(function)。

LLVM(5)ORC實(shí)例分析,llvm,lang,pgsql,llvm,jit,orc

ps. module的構(gòu)造還可以構(gòu)造machine在上面構(gòu)造module
LLVM(5)ORC實(shí)例分析,llvm,lang,pgsql,llvm,jit,orc

注釋文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-726365.html

LLVMOrcThreadSafeModuleRef createDemoModule(void) {
// 創(chuàng)建一個(gè)新的ThreadSafeContext和底層的LLVMContext。
LLVMOrcThreadSafeContextRef TSCtx = LLVMOrcCreateNewThreadSafeContext();

// 獲取底層的LLVMContext的引用。
LLVMContextRef Ctx = LLVMOrcThreadSafeContextGetContext(TSCtx);

// 創(chuàng)建一個(gè)新的LLVM模塊。
LLVMModuleRef M = LLVMModuleCreateWithNameInContext("demo", Ctx);

// 添加一個(gè)名為"sum"的函數(shù):
// - 創(chuàng)建函數(shù)類型和函數(shù)實(shí)例。
LLVMTypeRef ParamTypes[] = {LLVMInt32Type(), LLVMInt32Type()};
LLVMTypeRef SumFunctionType =
LLVMFunctionType(LLVMInt32Type(), ParamTypes, 2, 0);
LLVMValueRef SumFunction = LLVMAddFunction(M, "sum", SumFunctionType);

// - 向函數(shù)添加一個(gè)基本塊。
LLVMBasicBlockRef EntryBB = LLVMAppendBasicBlock(SumFunction, "entry");

// - 創(chuàng)建一個(gè)IR構(gòu)建器并將其定位到基本塊的末尾。
LLVMBuilderRef Builder = LLVMCreateBuilder();
LLVMPositionBuilderAtEnd(Builder, EntryBB);

// - 獲取兩個(gè)函數(shù)參數(shù),并使用它們構(gòu)造一個(gè)"add"指令。
LLVMValueRef SumArg0 = LLVMGetParam(SumFunction, 0);
LLVMValueRef SumArg1 = LLVMGetParam(SumFunction, 1);
LLVMValueRef Result = LLVMBuildAdd(Builder, SumArg0, SumArg1, "result");

// - 構(gòu)建返回指令。
LLVMBuildRet(Builder, Result);

// 演示模塊現(xiàn)在已經(jīng)完成。將其和ThreadSafeContext封裝到ThreadSafeModule中。
LLVMOrcThreadSafeModuleRef TSM = LLVMOrcCreateNewThreadSafeModule(M, TSCtx);

// 釋放本地的ThreadSafeContext值。底層的LLVMContext將由ThreadSafeModule TSM保持活動(dòng)狀態(tài)。
LLVMOrcDisposeThreadSafeContext(TSCtx);

// 返回結(jié)果。
return TSM;
}

int main(int argc, char *argv[]) {
int MainResult = 0;

// 解析命令行參數(shù)并初始化LLVM Core。
LLVMParseCommandLineOptions(argc, (const char **)argv, "");
LLVMInitializeCore(LLVMGetGlobalPassRegistry());

// 初始化本地目標(biāo)代碼生成和匯編打印器。
LLVMInitializeNativeTarget();
LLVMInitializeNativeAsmPrinter();

// 創(chuàng)建LLJIT實(shí)例。
LLVMOrcLLJITRef J;
{
LLVMErrorRef Err;
if ((Err = LLVMOrcCreateLLJIT(&J, 0))) {
MainResult = handleError(Err);
goto llvm_shutdown;
}
}

// 創(chuàng)建演示模塊。
LLVMOrcThreadSafeModuleRef TSM = createDemoModule();

// 將演示模塊添加到JIT中。
{
LLVMOrcJITDylibRef MainJD = LLVMOrcLLJITGetMainJITDylib(J);
LLVMErrorRef Err;
if ((Err = LLVMOrcLLJITAddLLVMIRModule(J, MainJD, TSM))) {
// 如果添加ThreadSafeModule失敗,我們需要自己清理它。
// 如果添加成功,JIT將管理內(nèi)存。
LLVMOrcDisposeThreadSafeModule(TSM);
MainResult = handleError(Err);
goto jit_cleanup;
}
}

// 查找演示入口點(diǎn)的地址。
LLVMOrcJITTargetAddress SumAddr;
{
LLVMErrorRef Err;
if ((Err = LLVMOrcLLJITLookup(J, &SumAddr, "sum"))) {
MainResult = handleError(Err);
goto jit_cleanup;
}
}

// 如果程序執(zhí)行到這里,說(shuō)明一切順利。執(zhí)行JIT生成的代碼。
int32_t (Sum)(int32_t, int32_t) = (int32_t()(int32_t, int32_t))SumAddr;
int32_t Result = Sum(1, 2);

// 打印結(jié)果。
printf("1 + 2 = %i\n", Result);

jit_cleanup:
// 銷(xiāo)毀JIT實(shí)例。這將清理JIT所擁有的任何內(nèi)存。
// 這個(gè)操作是非平凡的(例如,可能需要JIT靜態(tài)析構(gòu)函數(shù)),也可能失敗。
// 如果失敗,我們希望將錯(cuò)誤輸出到stderr,但不要覆蓋任何現(xiàn)有的返回值。
{
LLVMErrorRef Err;
if ((Err = LLVMOrcDisposeLLJIT(J))) {
int NewFailureResult = handleError(Err);
if (MainResult == 0) MainResult = NewFailureResult;
}
}

llvm_shutdown:
// 關(guān)閉LLVM。
LLVMShutdown();

return MainResult;
}

ORC完整

//===------ OrcV2CBindingsBasicUsage.c - Basic OrcV2 C Bindings Demo ------===//
//
// 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 <stdio.h>

#include "llvm-c/Core.h"
#include "llvm-c/Error.h"
#include "llvm-c/Initialization.h"
#include "llvm-c/LLJIT.h"
#include "llvm-c/Support.h"
#include "llvm-c/Target.h"

int handleError(LLVMErrorRef Err) {
  char *ErrMsg = LLVMGetErrorMessage(Err);
  fprintf(stderr, "Error: %s\n", ErrMsg);
  LLVMDisposeErrorMessage(ErrMsg);
  return 1;
}

LLVMOrcThreadSafeModuleRef createDemoModule(void) {
  // Create a new ThreadSafeContext and underlying LLVMContext.
  LLVMOrcThreadSafeContextRef TSCtx = LLVMOrcCreateNewThreadSafeContext();

  // Get a reference to the underlying LLVMContext.
  LLVMContextRef Ctx = LLVMOrcThreadSafeContextGetContext(TSCtx);

  // Create a new LLVM module.
  LLVMModuleRef M = LLVMModuleCreateWithNameInContext("demo", Ctx);

  // Add a "sum" function":
  //  - Create the function type and function instance.
  LLVMTypeRef ParamTypes[] = {LLVMInt32Type(), LLVMInt32Type()};
  LLVMTypeRef SumFunctionType =
      LLVMFunctionType(LLVMInt32Type(), ParamTypes, 2, 0);
  LLVMValueRef SumFunction = LLVMAddFunction(M, "sum", SumFunctionType);

  //  - Add a basic block to the function.
  LLVMBasicBlockRef EntryBB = LLVMAppendBasicBlock(SumFunction, "entry");

  //  - Add an IR builder and point it at the end of the basic block.
  LLVMBuilderRef Builder = LLVMCreateBuilder();
  LLVMPositionBuilderAtEnd(Builder, EntryBB);

  //  - Get the two function arguments and use them co construct an "add"
  //    instruction.
  LLVMValueRef SumArg0 = LLVMGetParam(SumFunction, 0);
  LLVMValueRef SumArg1 = LLVMGetParam(SumFunction, 1);
  LLVMValueRef Result = LLVMBuildAdd(Builder, SumArg0, SumArg1, "result");

  //  - Build the return instruction.
  LLVMBuildRet(Builder, Result);

  // Our demo module is now complete. Wrap it and our ThreadSafeContext in a
  // ThreadSafeModule.
  LLVMOrcThreadSafeModuleRef TSM = LLVMOrcCreateNewThreadSafeModule(M, TSCtx);

  // Dispose of our local ThreadSafeContext value. The underlying LLVMContext
  // will be kept alive by our ThreadSafeModule, TSM.
  LLVMOrcDisposeThreadSafeContext(TSCtx);

  // Return the result.
  return TSM;
}

int main(int argc, char *argv[]) {
  int MainResult = 0;

  // Parse command line arguments and initialize LLVM Core.
  LLVMParseCommandLineOptions(argc, (const char **)argv, "");
  LLVMInitializeCore(LLVMGetGlobalPassRegistry());

  // Initialize native target codegen and asm printer.
  LLVMInitializeNativeTarget();
  LLVMInitializeNativeAsmPrinter();

  // Create the JIT instance.
  LLVMOrcLLJITRef J;
  {
    LLVMErrorRef Err;
    if ((Err = LLVMOrcCreateLLJIT(&J, 0))) {
      MainResult = handleError(Err);
      goto llvm_shutdown;
    }
  }

  // Create our demo module.
  LLVMOrcThreadSafeModuleRef TSM = createDemoModule();

  // Add our demo module to the JIT.
  {
    LLVMOrcJITDylibRef MainJD = LLVMOrcLLJITGetMainJITDylib(J);
    LLVMErrorRef Err;
    if ((Err = LLVMOrcLLJITAddLLVMIRModule(J, MainJD, TSM))) {
      // If adding the ThreadSafeModule fails then we need to clean it up
      // ourselves. If adding it succeeds the JIT will manage the memory.
      LLVMOrcDisposeThreadSafeModule(TSM);
      MainResult = handleError(Err);
      goto jit_cleanup;
    }
  }

  // Look up the address of our demo entry point.
  LLVMOrcJITTargetAddress SumAddr;
  {
    LLVMErrorRef Err;
    if ((Err = LLVMOrcLLJITLookup(J, &SumAddr, "sum"))) {
      MainResult = handleError(Err);
      goto jit_cleanup;
    }
  }

  // If we made it here then everything succeeded. Execute our JIT'd code.
  int32_t (*Sum)(int32_t, int32_t) = (int32_t(*)(int32_t, int32_t))SumAddr;
  int32_t Result = Sum(1, 2);

  // Print the result.
  printf("1 + 2 = %i\n", Result);

jit_cleanup:
  // Destroy our JIT instance. This will clean up any memory that the JIT has
  // taken ownership of. This operation is non-trivial (e.g. it may need to
  // JIT static destructors) and may also fail. In that case we want to render
  // the error to stderr, but not overwrite any existing return value.
  {
    LLVMErrorRef Err;
    if ((Err = LLVMOrcDisposeLLJIT(J))) {
      int NewFailureResult = handleError(Err);
      if (MainResult == 0) MainResult = NewFailureResult;
    }
  }

llvm_shutdown:
  // Shut down LLVM.
  LLVMShutdown();

  return MainResult;
}

到了這里,關(guān)于LLVM(5)ORC實(shí)例分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ORC工具(使用阿里云統(tǒng)一文字識(shí)別接口實(shí)現(xiàn))

    ORC工具(使用阿里云統(tǒng)一文字識(shí)別接口實(shí)現(xiàn))

    廢話不多,直接上代碼。 轉(zhuǎn)換的字符結(jié)果是一行。

    2024年02月12日
    瀏覽(25)
  • LLVM系列(1): 在微軟Visual Studio下編譯LLVM

    LLVM系列(1): 在微軟Visual Studio下編譯LLVM

    參考鏈接: Getting Started with the LLVM System using Microsoft Visual Studio — LLVM 18.0.0git documentation 1.安裝visualstudio,版本需要大于vs2019 本機(jī)環(huán)境已安裝visual studio2022,省略 2安裝Makefile,版本需要大于3.21 本機(jī)環(huán)境已經(jīng)安裝cmake3.26 3. 用Cmake配置llvm 4.編譯LLVM(有多個(gè)選項(xiàng),例如選release,可

    2024年01月16日
    瀏覽(16)
  • HIVE表數(shù)據(jù)快速構(gòu)造(分區(qū)表、orc、text)

    HIVE表數(shù)據(jù)快速構(gòu)造(分區(qū)表、orc、text)

    引言 當(dāng)需要在hive數(shù)倉(cāng)中去創(chuàng)建測(cè)試表并構(gòu)造測(cè)試數(shù)據(jù)時(shí),通常需要在安裝了hive客戶端的服務(wù)器環(huán)境下,通過(guò)執(zhí)行命令的方式建表。通過(guò)在HDFS上上傳和加載數(shù)據(jù)文件的方式來(lái)加載數(shù)據(jù)到hive表中。其中操作算不得多復(fù)雜,但比較依賴對(duì)環(huán)境和命令的熟悉,并且操作不夠可視化

    2024年02月16日
    瀏覽(41)
  • 【發(fā)票識(shí)別】支持pdf、ofd、圖片格式(orc、信息提?。┑陌l(fā)票

    【發(fā)票識(shí)別】支持pdf、ofd、圖片格式(orc、信息提?。┑陌l(fā)票

    為了能夠滿足識(shí)別各種發(fā)票的功能,特地開(kāi)發(fā)了當(dāng)前發(fā)票識(shí)別的功能,當(dāng)前的功能支持pdf、ofd、圖片格式的發(fā)票識(shí)別,使用到的技術(shù)包括文本提取匹配、ocr識(shí)別和信息提取等相關(guān)的技術(shù),用到機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的相關(guān)技術(shù)。 體驗(yàn)地址:https://invoice.behappyto.cn/invoice-service/ 體

    2024年01月16日
    瀏覽(15)
  • LLVM 與代碼混淆技術(shù)

    LLVM 與代碼混淆技術(shù)

    項(xiàng)目源碼 LLVM 計(jì)劃啟動(dòng)于2000年,開(kāi)始由美國(guó) UIUC 大學(xué)的 Chris Lattner 博士主持開(kāi)展,后來(lái) Apple 也加入其中。最初的目的是開(kāi)發(fā)一套提供中間代碼和編譯基礎(chǔ)設(shè)施的虛擬系統(tǒng)。 LLVM 命名最早源自于底層虛擬機(jī)(Low Level Virtual Machine)的縮寫(xiě),隨著 LLVM 項(xiàng)目的不斷發(fā)展,原先的全稱

    2024年02月09日
    瀏覽(44)
  • LLVM代碼內(nèi)容

    LLVM庫(kù)包含所有LLVM頂層項(xiàng)目,可以分為以下幾類: ? LLVM核心庫(kù)和附加內(nèi)容 ? 編譯器和工具 ? 運(yùn)行時(shí)庫(kù) ? ? ? ? LLVM是一個(gè)編譯器框架。LLVM作為編譯器框架,是需要各種功能模塊支撐起來(lái)的。可以將clang和lld都看做是LLVM的組成部分??蚣艿囊馑际牵憧梢曰贚LVM提供的功能

    2024年01月20日
    瀏覽(15)
  • LLVM編譯

    歡迎到我的博客來(lái)閱讀這篇文章: https://qiu-weidong.github.io/2022/05/01/llvm/build/ 安裝Visual Studio 首先需要下載 Visual Studio Installer 的安裝程序 VisualStudioSetup.exe ,下載鏈接: https://visualstudio.microsoft.com/zh-hans/downloads/。選擇社區(qū)版,點(diǎn)擊 免費(fèi)下載 。 下載后,雙擊運(yùn)行 VisualStudioSetup.exe 。

    2024年02月07日
    瀏覽(34)
  • Macos安裝LLVM

    Macos安裝LLVM

    LLVM項(xiàng)目是模塊化、可重用的編譯器和工具鏈技術(shù)的集合。用LLVM可以創(chuàng)建編譯器,著名的編譯器Clang就是LLVM項(xiàng)目的子項(xiàng)目 平臺(tái):MacBook 按下鍵盤(pán)上的??鍵,輸入“終端”,打開(kāi)第一個(gè)結(jié)果。 在終端里面輸入以下命令: /usr/bin/ruby -e \\\"$(curl -fsSL https://raw.githubusercontent.com/Homebrew

    2024年02月21日
    瀏覽(15)
  • LLVM安裝教程

    LLVM安裝教程

    llvm下載頁(yè)面:https://releases.llvm.org/download.html 方法一:從官網(wǎng)上下載預(yù)編譯好的包 在Ubuntu 20.04安裝LLVM 13.0.0 sudo mkdir -p /usr/local cd /usr/local sudo wget https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.0/clang+llvm-13.0.0-x86_64-linux-gnu-ubuntu-20.04.tar.xz sudo tar xvf clang+llvm-13.0.0-x86_64-linux-g

    2024年02月15日
    瀏覽(11)
  • LLVM筆記1

    LLVM筆記1

    參考:https://www.bilibili.com/video/BV1D84y1y73v/?share_source=copy_webvd_source=fc187607fc6ec6bbd2c74a3d0d7484cf LLVM升級(jí): https://blog.csdn.net/weixin_51760563/article/details/127810160 https://zhuanlan.zhihu.com/p/614675827 升級(jí)cmake: https://zhuanlan.zhihu.com/p/519732843 將程序從高級(jí)語(yǔ)言翻譯到機(jī)器語(yǔ)言,得到一個(gè)可運(yùn)行的文

    2024年02月14日
    瀏覽(15)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包