91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

開發和調試第一個 LLVM Pass

發布時間:2020-06-29 18:11:02 來源:網絡 閱讀:1005 作者:xcmer2005 欄目:安全技術

1. 下載和編譯 LLVM

LLVM 下載地址 http://releases.llvm.org/download.html,
目前最新版是 6.0.0,下載完成之后,執行 tar 解壓 llvm 包:

tar -xzvf llvm-6.0.0.src.tar.xz

再下載 Clang 解壓:

tar -xzvf cfe-6.0.0.src.tar.xz

將 cfe-6.0.0.src 目錄復制到 llvm-6.0.0.src/tools,重命名為 clang。通過 brew 安裝 cmake:

brew install cmake

然后在命令行下切換到 llvm-6.0.0.src 目錄,新建 build 目錄,切換到 build 目錄執行 cmake 生成配置文件,命令如下:

mkdir build
cd build
cmake -G Xcode CMAKE_BUILD_TYPE="Debug" ..

執行完成之后,可以看到 Xcode 的工程文件 LLVM.xcodeproj,打開工程文件,會提示是否自動創建 Schemes,如圖所示:

開發和調試第一個 LLVM Pass

點擊 Manually Manage Schemes 手動創建,添加 ALL_BUILD,如圖所示:

開發和調試第一個 LLVM Pass

然后在 Xcode 上進行編譯,編譯過程比如慢,可能得二十分鐘到半小時左右,全部編譯完文件會在 11G 左右。

2. 編寫 Pass 代碼

我們編寫第一個 Pass 的功能很簡單,只是輸出程序中的每個方法名,操作步驟如下:

(1) 在 lib/Transforms 目錄下新建一個文件夾,文件夾名稱為 TestPass,在 TestPass 目錄下創建文件 TestPass.cpp,代碼如下:

//導入頭文件
#include "llvm/ADT/Statistic.h"
#include "llvm/IR/Function.h"
#include "llvm/Pass.h"
#include "llvm/Support/raw_ostream.h"

using namespace llvm;  //指定所使用的 LLVM 命名空間

namespace {

  //定義 First 類繼承自 FunctionPass
  struct First : public FunctionPass {
    static char ID; // Pass ID
    First() : FunctionPass(ID) {}

    //定義 runOnFunction 重載繼承父類的抽象虛函數
    bool runOnFunction(Function &F) override {

      //打印每個函數的名字
      errs() << "First: ";
      errs().write_escaped(F.getName()) << '\n';
      return false;
    }
  };
}

char First::ID = 0;  //初始化 Pass ID

//最后注冊 FirstPass, 指定命令行參數為 First
static RegisterPass<First> X("First", "First Pass");

(2) 然后再在 lib/Transforms/TestPass 下新建 CMakeList.txt,編輯內容如下:

add_llvm_loadable_module( LLVMFirstPass
  FirstPass.cpp

  DEPENDS
  intrinsics_gen
  PLUGIN_TOOL
  opt
  )

(3) 在 lib/Transforms/CMakeLists.txt 添加 add_subdirectory(TestPass)

(4) 重新編譯整個工程,添加 LLVMFirstPass 到 Scheme,如圖:

開發和調試第一個 LLVM Pass

編譯 LLVMFirstPass 成功之后,動態庫保存在 build/Debug/lib/LLVMFirstPass.dylib。

3. 使用 opt 加載和調試 Pass

(1) 編寫一段測試代碼:

#include <stdio.h>

int test() {

        printf("test\n");
        return 0;
}
int main(){

        int num = 1;
        printf("main %d\n", num);
        test();
        return 0;
}

編譯源文件,生成 Bitcode:

clang -emit-llvm -c test.c -o test.bc

(2) 在 Xcode 中將 opt 添加到 scheme,編輯 scheme 的啟動參數,-load 參數指向 LLVMFirstPass.dylib,-First 參數就是剛才在源代碼里注冊的參數,如圖所示:

開發和調試第一個 LLVM Pass

編譯 opt 并運行起來,可以看到輸出了程序的每個函數名稱,并且前面還打印了 First 字符串,效果如下:

First: test
First: main
Program ended with exit code: 0

opt 編譯成功保存在 build/Debug/bin/opt。也可以給 pass 的代碼下斷點,在 Xcode 上運行 opt 就可以調試 pass,效果如圖:

開發和調試第一個 LLVM Pass

原文地址:https://www.exchen.net/開發和調試第一個-llvm-pass.html

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苗栗市| 鄢陵县| 蕉岭县| 唐海县| 南木林县| 巴南区| 临桂县| 牡丹江市| 磴口县| 金沙县| 寿阳县| 若尔盖县| 沂源县| 瑞安市| 宜章县| 健康| 南靖县| 镇远县| 巴楚县| 梁平县| 凉城县| 新乡市| 将乐县| 鹤庆县| 黄浦区| 平舆县| 仁化县| 武宁县| 大田县| 容城县| 翁牛特旗| 唐山市| 安西县| 麻栗坡县| 汝城县| 友谊县| 宾川县| 平顺县| 巧家县| 林甸县| 桂东县|