栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LLVM系列第二章:模块Module

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LLVM系列第二章:模块Module

系列文章目录

LLVM系列第一章:编译LLVM源码
LLVM系列第二章:模块Module
LLVM系列第三章:函数Function
LLVM系列第四章:逻辑代码块Block
LLVM系列第五章:全局变量Global Variable
LLVM系列第十一章:写一个Hello World
LLVM系列第十二章:写一个简单的词法分析器Lexer
LLVM系列第十三章:写一个简单的语法分析器Parser
LLVM系列第十四章:写一个简单的语义分析器Semantic Analyzer
LLVM系列第十五章:写一个简单的中间代码生成器IR Generator
LLVM系列第十六章:写一个简单的编译器


本文目录
  • 系列文章目录
  • 前言
  • 一、Hello Module
  • 二、编译
  • 三、运行
  • 四、总结


前言

在此记录下用LLVM生成模块(Module)的过程,以备查阅。

开发环境的配置请参考第一章 《LLVM系列第一章:编译LLVM源码》。

简单来说,LLVM中的模块(Module),代表了一块代码。它是一个比较完整独立的代码块,是一个最小的编译单元。需要注意的是,它跟我们平常说的“程序模块”不一样。程序模块是一个更大的集合,包含了很多个编译单元;而LLVM中的模块(Module),我们可以把它初步理解为一个编译单元。

在LLVM IR的基本概念(构件)中,模块是一个组合,它包含了其它更小的基本构件。比如,它可以包含的基本构件有全局变量、函数、数据结构等。

在这一章,我们就用LLVM的API来创建一个最简单的模块。

一、Hello Module

用LLVM创建模块之前,需要首先初始化LLVMContext,然后才能调用LLVM API,代码如下(示例):

// HelloModule.cpp

#include "llvm/IR/Module.h"
#include "llvm/IR/LLVMContext.h"

using namespace llvm;

int main(int argc, char* argv[])
{
    LLVMContext context;
    Module* module = new Module("HelloModule", context);

    module->print(outs(), nullptr);

    return 0;
}
二、编译

用clang++进行编译(示例):

# Set up C++ standard library and header path
export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)

# Compile
clang++ -w -o HelloModule `llvm-config --cxxflags --ldflags --system-libs --libs core` HelloModule.cpp

以上命令会生成一个名为HelloModule的可执行程序。

三、运行

运行HelloModule(示例):

./HelloModule

输出结果如下(示例):

; ModuleID = 'HelloModule'
source_filename = "HelloModule"
四、总结

我们用LLVM提供的C++ API,创建了一个最简单的模块(Module),并打印出了它的IR代码。完整源码示例请参看:
https://github.com/wuzhanglin/llvm-IR-examples

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/969007.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号