下载代码

git clone https://github.com/llvm/llvm-project.git

安装cmake,如果系统没有或者版本比较低,可以用如下方法快速安装

wget https://github.com/Kitware/CMake/releases/download/v3.23.1/cmake-3.23.1-linux-x86_64.sh
sudo ./cmake-3.23.1-linux-x86_64.sh --skip-license --exclude-subdir --prefix=/usr

安装依赖

​sudo apt install build-essential
sudo apt install ninja-build

配置

cd llvm-project && mkdir build && cd build
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../binary -DLLVM_TARGETS_TO_BUILD="X86;RISCV" -DLLVM_ENABLE_PROJECTS="clang;" -DLLVM_DEFAULT_TARGET_TRIPLE="riscv64-unknown-linux-gnu"  ../llvm

编译,在build目录中,执行ninja

ninja

安装

执行ninja install

llvm compile2

git clone -b release/12.x https://github.com/llvm/llvm-project && cd llvm-project

$ mkdir -p build && cd build
$ cmake ../llvm -GNinja -DCMAKE_INSTALL_PREFIX=$HOME/.local/llvm -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt;cross-project-tests;libc;libclc;lld;lldb;openmp;polly;pstl" -DCMAKE_BUILD_TYPE=Release
$ ninja install

GLSL/SPIR-V编译环境搭建

git clone https://github.com/KhronosGroup/glslang.git

$ cd glslang/
$ python update_glslang_sources.py

$ mkdir build && cd build
$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="../binary" ../
$ make -j8
$ make install

spir-v和LLVM转换环境

下载LLVM

caozilong@caozilong-Vostro-3268:~/Workspace$ git clone https://github.com/llvm/llvm-project.git
正克隆到 'llvm-project'...
remote: Enumerating objects: 5054222, done.
remote: Counting objects: 100% (2571/2571), done.
remote: Compressing objects: 100% (340/340), done.
remote: Total 5054222 (delta 2396), reused 2267 (delta 2231), pack-reused 5051651
接收对象中: 100% (5054222/5054222), 2.01 GiB | 1.72 MiB/s, 完成.
处理 delta 中: 100% (4139391/4139391), 完成.
正在检出文件: 100% (120564/120564), 完成.
$ cd llvm-project/llvm/projects
$ git clone https://github.com/KhronosGroup/SPIRV-LLVM-Translator.git
caozilong@caozilong-Vostro-3268:~/Workspace/llvm-project/llvm/projects$ git clone https://github.com/KhronosGroup/SPIRV-LLVM-Translator.git
正克隆到 'SPIRV-LLVM-Translator'...
remote: Enumerating objects: 25316, done.
remote: Counting objects: 100% (1169/1169), done.
remote: Compressing objects: 100% (631/631), done.
remote: Total 25316 (delta 640), reused 887 (delta 463), pack-reused 24147
接收对象中: 100% (25316/25316), 12.54 MiB | 6.89 MiB/s, 完成.
处理 delta 中: 100% (18563/18563), 完成.

编译

$ cd llvm-project
$ mkdir build && cd build
$ export PKG_CONFIG_PATH=/home/caozilong/Workspace/glslang/binary/lib/pkgconfig/
$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../binary -DLLVM_ENABLE_PROJECTS="clang;" ../llvm
$ ninja llvm-spirv

编译结果

验证编译结果

编写shader文件

#version 430
/**/
layout (location = 0) in vec3 vertPos;
layout (location = 1) in vec3 vertNormal;
vec4 varyingColor;struct PositionalLight
{   vec4 ambient;vec4 diffuse;vec4 specular;vec3 position;
};
struct Material
{   vec4 ambient;vec4 diffuse;vec4 specular;float shininess;
};vec4 globalAmbient;
PositionalLight light;
Material material;
mat4 mv_matrix;
mat4 proj_matrix;
mat4 norm_matrix;void main(void)
{   vec4 color;// convert vertex position to view spacevec4 P = mv_matrix * vec4(vertPos,1.0);// convert normal to view spacevec3 N = normalize((norm_matrix * vec4(vertNormal,1.0)).xyz);// calculate view-space light vector (from point to light)vec3 L = normalize(light.position - P.xyz);//  view vector is negative of view space positionvec3 V = normalize(-P.xyz);//  R is reflection of -L around the plane defined by Nvec3 R = reflect(-L,N);// ambient, diffuse, and specular contributionsvec3 ambient =((globalAmbient * material.ambient)+ (light.ambient * material.ambient)).xyz;vec3 diffuse =light.diffuse.xyz * material.diffuse.xyz* max(dot(N,L), 0.0);vec3 specular =pow(max(dot(R,V), 0.0f), material.shininess)* material.specular.xyz * light.specular.xyz;// send the color output to the fragment shadervaryingColor = vec4((ambient + diffuse + specular), 1.0);// send the position to the fragment shader, as beforegl_Position = proj_matrix * mv_matrix * vec4(vertPos,1.0);
}
caozilong@caozilong-Vostro-3268:~/Workspace/glslang/binary/bin$ ./glslangValidator -V -S vert -o vertex.spv vertex.gls
vertex.gls
caozilong@caozilong-Vostro-3268:~/Workspace/glslang/binary/bin$ ls -l
总用量 592276
-rwxr-xr-x 1 caozilong caozilong 180650664 10月  3 09:56 glslangValidator
-rwxr-xr-x 1 caozilong caozilong   2903864 10月  3 09:53 spirv-as
-rwxr-xr-x 1 caozilong caozilong   2480184 10月  3 09:53 spirv-cfg
-rwxr-xr-x 1 caozilong caozilong   3485912 10月  3 09:53 spirv-dis
-rwxr-xr-x 1 caozilong caozilong       866 10月  2 21:36 spirv-lesspipe.sh
-rwxr-xr-x 1 caozilong caozilong  69247904 10月  3 09:55 spirv-link
-rwxr-xr-x 1 caozilong caozilong  67723632 10月  3 09:56 spirv-lint
-rwxr-xr-x 1 caozilong caozilong 156290072 10月  3 09:55 spirv-opt
-rwxr-xr-x 1 caozilong caozilong  92484416 10月  3 09:56 spirv-reduce
-rwxr-xr-x 1 caozilong caozilong   2019096 10月  3 09:56 spirv-remap
-rwxr-xr-x 1 caozilong caozilong  29148608 10月  3 09:53 spirv-val
-rw-rw-r-- 1 caozilong caozilong      1474 10月  3 10:42 vertex.gls
-rw-rw-r-- 1 caozilong caozilong      3576 10月  3 10:45 vertex.s

片段着色器

./glslangValidator -V -S frag  -o pixel.spv pixel.gls
#version 460 corevoid main(void)
{// Do Nothing...
}
caozilong@caozilong-Vostro-3268:~/Workspace/glslang/binary/bin$ ./glslangValidator -V -S frag  -o pixel.spv pixel.gls
pixel.gls
caozilong@caozilong-Vostro-3268:~/Workspace/glslang/binary/bin$ xxd -g 1 pixel.gls
00000000: 23 76 65 72 73 69 6f 6e 20 34 36 30 20 63 6f 72  #version 460 cor
00000010: 65 0a 0a 76 6f 69 64 20 6d 61 69 6e 28 76 6f 69  e..void main(voi
00000020: 64 29 0a 7b 0a 20 20 20 20 2f 2f 20 44 6f 20 4e  d).{.    // Do N
00000030: 6f 74 68 69 6e 67 2e 2e 2e 0a 7d 0a 0a           othing....}..
caozilong@caozilong-Vostro-3268:~/Workspace/glslang/binary/bin$ xxd -g 1 pixel.spv
00000000: 03 02 23 07 00 00 01 00 0a 00 08 00 06 00 00 00  ..#.............
00000010: 00 00 00 00 11 00 02 00 01 00 00 00 0b 00 06 00  ................
00000020: 01 00 00 00 47 4c 53 4c 2e 73 74 64 2e 34 35 30  ....GLSL.std.450
00000030: 00 00 00 00 0e 00 03 00 00 00 00 00 01 00 00 00  ................
00000040: 0f 00 05 00 04 00 00 00 04 00 00 00 6d 61 69 6e  ............main
00000050: 00 00 00 00 10 00 03 00 04 00 00 00 07 00 00 00  ................
00000060: 03 00 03 00 02 00 00 00 cc 01 00 00 05 00 04 00  ................
00000070: 04 00 00 00 6d 61 69 6e 00 00 00 00 13 00 02 00  ....main........
00000080: 02 00 00 00 21 00 03 00 03 00 00 00 02 00 00 00  ....!...........
00000090: 36 00 05 00 02 00 00 00 04 00 00 00 00 00 00 00  6...............
000000a0: 03 00 00 00 f8 00 02 00 05 00 00 00 fd 00 01 00  ................
000000b0: 38 00 01 00                                      8...

spir-v IR转LLVM

SPIR-V对于Vulkan而言是仅有的官方支持的着色语言。它在API层被接受并且最终用于构造流水线,这些流水线是配置一个Vulkan设备的对象,为你的应用完成工作。SPIR-V被设计为对一些工具和驱动而言非常容易处理的表示。这通过不同实现之间的多样性来提升可移植性。一个SPIR-V模块的内部表示是一条32位字的流,存放在存储器中。除非你是一位工具写手或计划自己生成SPIR-V,否则的话你不太需要直接处理SPIR-V的二进制编码。而是说,你要么可以看SPIR-V的可读的文本表示,或是使用诸如 glslangvalidator 这样的官方Khronos GLSL编译工具来生成SPIR-V。
首先用spirv-dis工具反编译上面生成的.spv文件,生成 SPIRV IR文件,而SPIRV IR文件可以转换为LLVM IR文件。

./spirv-dis -o spirv.dis pixel.spv
./spirv-dis -o spirv2.dis vertex.spv

经过下面两步将代码转换为LLVM IR

caozilong@caozilong-Vostro-3268:~/Workspace/glslang/binary/bin/spirv-as --target-env spv1.0 spirv2.dis -o spirv-ir.ir
caozilong@caozilong-Vostro-3268:~/Workspace/glslang/binary/bin$ ../../../llvm-project/build/bin/llvm-spirv -r spirv-ir.ir
InvalidBuiltinSetName: Expects OpenCL.std. Actual is GLSL.std.450
caozilong@caozilong-Vostro-3268:~/Workspace/glslang/binary/bin$ ../../../llvm-project/build/bin/llvm-spirv -r spirv-ir.ir
InvalidBuiltinSetName: Expects OpenCL.std. Actual is GLSL.std.450

最后出错了,有空再分析。


结束

LLVM RISCV编译器编译QuickStart相关推荐

  1. LLVM Clang前端编译与调试

    LLVM Clang前端编译与调试 iOS 关于编译 o 一.Objective-C 编译过程 o 为什么需要重新编译? o 编译步骤 o 二.编译步骤的详细说明 o 1.预处理 o 2.编译 o 词 ...

  2. python是脚本语言不需要编译器编译执行_都有Python了,还要什么编译器!

    编译的目的是将源码转化为机器可识别的可执行程序,在早期,每次编译都需要重新构建所有东西,后来人们意识到可以让编译器自动完成一些工作,从而提升编译效率. 但"编译器不过是用于代码生成的软机器, ...

  3. g++ linux 编译开栈_方舟编译器编译hello world踩坑全记录

    闲来无事,看到方舟编译器完整开源,于是打算拿来试着编译一个东西来,接下来把踩过的一些坑记录一下. 参考文档 方舟编译器的官网是 OpenArkCompiler​www.openarkcompiler. ...

  4. RISCV toolchain编译工具链搭建

    目录 写在前面 1.获取源文件 2.安装相关依赖包 3.修改环境变量 4.编译GCC 写在前面 刚刚接触RISCV编译器,根据网上RISCV toolchain工具链的搭建方法,结合自己体会,写点儿学 ...

  5. LLVM与Clang编译图例

    LLVM与Clang编译图例 参考链接: https://blog.csdn.net/u012874859/article/details/108530256

  6. ViSP安装之Windows系统基于VS2019编译器编译获得VISP动态库

    Windows系统基于VS2019编译器编译获得VISP动态库 官网地址: Installation from source for Windows with Visual C++ 2019 (vc1 ...

  7. 【Android Protobuf 序列化】Protobuf 使用 ( protoc 编译器简介 | 下载 protoc 编译器 | 使用 protoc 编译器编译 .proto 源文件 )

    文章目录 一.protoc 编译器简介 二.下载 protoc 编译器 三.使用 protoc 编译器编译 addressbook.proto 源文件 四.参考资料 一.protoc 编译器简介 在上 ...

  8. gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

    例子:由多个源文件组成的C程序,经过编辑.预处理.编译.链接等阶段才能生成最终的可执行程序.此过程中,在__c__阶段可以发现被调用的函数未定义. A. 编辑和预处理 B. 预处理 C. 编译 D. ...

  9. keil如何看c语言编译器,MDK Keil编译器编译窗口的设置

    MDK Keil编译器编译窗口的设置 在使用MDK Keil编译器时会遇到一些和编辑窗户设置相关的问题,如字体的大小.颜色,字符字符串的颜色等.现按照配置(configuation)的顺序归纳如下: ...

最新文章

  1. c语言实验七实验报告,C语言实验七 数 实验报告.doc
  2. Soa和Wcf(转)
  3. B09_NumPy迭代数组(控制遍历顺序,修改数组中元素的值,使用外部循环,广播迭代)
  4. python学习-字符串的基本操作
  5. django笔记精炼 200304
  6. 总结Django一些开发经验
  7. 简单的jq动态修改checkbox的checked值
  8. 《Android Studio开发实战 从零基础到App上线》出版后记
  9. 如何彻底卸载office!!
  10. 微信小游戏正式发布!什么!审核失败!流量主广告接入指南!
  11. IntelliJ IDEA激吗? 活 ——集火吗
  12. 2019年2月星环科技大数据应用开发面试(2年工作经验)
  13. 软件测试基础篇二之linux
  14. Java 实现多继承
  15. 输入数字N,然后输入N个数,计算这N个数的和。
  16. Qt 之 模仿 QQ登陆界面——旋转窗口篇
  17. 签入/签出是什么意思?
  18. OSChina 周五乱弹 ——程序员脱单攻略!
  19. django-连接Oracle数据库
  20. 基本面量化(Quantamental)——财务指标量化策略

热门文章

  1. Vue.js中使用nprogress进度条
  2. .net 连接oracle 无法解析指定的连接标识符,asp.net – Oracle.ManagedDataAccess:TNS:无法解析指定的连接标识符...
  3. 一朝发祥地,两代帝王城
  4. 【数仓】数据仓库—数据集成
  5. 如何在电脑上多开微信?(windows)
  6. leaf框架源码分析
  7. Amazing! 从“几何深度学习”看深度学习江湖的统一
  8. 分布式的登录如何实现的
  9. ISO认证怎么办理,申请流程
  10. win10双屏锁屏后再登陆导致副屏窗口全部移到主屏的解决方法