![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
llvm
文章平均质量分 89
春江花月夜晨
这个作者很懒,什么都没留下…
展开
-
LLVM 目标无关代码生成器
转载来自P2Tree十分感谢翻译成果。LLVM 目标无关代码生成器1 介绍:LLVM 目标无关代码生成器由 6 个主要的组件组成:1.1 代码生成1.2 代码生成器的高层设计1.3 使用 TableGen 来描述目标平台2 目标描述类2.1 TargetMachine 类2.2 DataLayout 类2.3 TargetLowering 类2.4 TargetRegisterInfo 类2.5 TargetInstrInfo 类2.6 TargetFrameLowering 类2.7 TargetSu转载 2021-04-11 22:39:42 · 686 阅读 · 0 评论 -
llvm编译器实战 第六章 后端
llvm编译器实战 第六章 后端1、LLVM 后端组织结构的概述代码生成器的不同阶段描述(1)指令选择阶段:(2)指令调度(3)寄存器分配(4)代码输出后端代码结构目标无关的代码生成器库指令选择阶段介绍2、如何解释描述后端的各种TableGen文件3、LLVM中的指令选择4、指令调度和寄存器分配5、代码输出6、如何自定义后端编译流程不错的后端讲解1、LLVM 后端组织结构的概述代码生成器的不同阶段描述(1)指令选择阶段:(2)指令调度(3)寄存器分配(4)代码输出后端代码结构原创 2021-03-02 20:34:38 · 1486 阅读 · 1 评论 -
乘加转DSP
1、创建project,加入source Verilog和constraint set_delay.xdcset_max_delay -from [all_inputs] -to [all_outputs] 102、如果需要跑仿真,看时序图时,需要添加panda_tb.v文件和value.txt ,并修改数据修改相关端口,实例化当为1时,会触发上升沿通过反正仿真看时序图2、利用脚本自动测数据create_project s8_u8_u8 /home/cpan/workspace/6-2原创 2020-12-30 16:47:54 · 191 阅读 · 1 评论 -
HLS 设计流程基本概念
数字电路设计中一般有源码实现、综合、布局布线等三个主流阶段。综合后门级仿真也叫前仿真,用于输出一个标准的网表文件,即描述电路的连接关系的文件。时序仿真也叫后仿真,用于将时延信号加入仿真模型,并以最坏的情况对电路的运行状态进行评估,得到相应的仿真波形图。IP 核即知识产权核,分为:软 IP、固 IP 和硬 IP软 IP:用 Verilog/VHDL 等硬件描述语言描述的功能模块;固 IP:完成了综合的功能模块;硬 IP:完成布局布线后得到的最终成品——掩膜;Test Bench 文..原创 2020-12-07 20:56:42 · 525 阅读 · 0 评论 -
llvm Writing a custom pass 用llvm编写自己的pass
《Getting Started with LLVM Core Libraries》Writing a custom passSuppose that we want to count the number of arguments for each function in a program, outputting the function name as well. Let’s write a pass to do this. First, we need to choose the right原创 2020-11-25 14:20:19 · 474 阅读 · 0 评论 -
指针参数处理算法的基本框架
需处理问题:1、函数的指针参数之间独立性分析与解决。2、函数参数为数组指针中的元素指针,导致数组指针整体信息丢失。2020-8-18 整理的基本框架2020-8-19void processEligibleCallInst(call_list){}...原创 2020-08-19 15:42:37 · 105 阅读 · 0 评论 -
clang --help编译选项 中文说明
OVERVIEW: clang LLVM compiler-B-CC--config \-C-c-dD-dependency-dot -dependency-file -dI-dM-D \=\-emit-ast-emit-llvm-E)USAGE: clang [options] OPTIONS:-B\<dir\> Add \<dir> to search path for binaries and object files used implicitly 添加到隐原创 2020-08-05 16:46:54 · 3043 阅读 · 0 评论 -
llvm memset/memcpy是否初始化判断算法
确定memset/memcpy指令之前没有AllocaInst的user局部变量处理算法:(1)首先对Function的函数指针参数做标记,函数参数是否在Function内部进行内存操作 。(目前觉得指针传进function,必然会对其memory操作)(2)其次遍历Alloca的直接、间接的load、store、memset、memcpy操作,记录所在BasicBlock含有内存操作。(3)最后从当前的memset、memcpy的basicblock内部查看在其之前是否有内存操作标记,如果没有,原创 2020-08-01 08:47:02 · 282 阅读 · 0 评论 -
llvm IR基础结构
llvm IR基础结构 个人描述一 、llvm背景知识二、Module三、FunctionBasicBlockInstruction一 、llvm背景知识llvm的前端就是clang,clang将源码编译为IR文件,IR经过N个pass的优化处理,生成优化后的IR执行效率更低、体积更小(bitcode是代码的一种表示形式),后端则是把优化后的bitcode编译为指定目标架构的机器码。 IR属于llvm的前端。二、ModuleModule相当于一个.c文件,每个Module之间相互独立,Module主原创 2020-07-27 20:43:14 · 1101 阅读 · 0 评论 -
memset memcpy 使用场景分析
memset memcpy 使用场景分析memset定义:memset在IR中使用场景注意点:memcpy定义:参数返回值功能特点memset定义:memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。void *memset(void *s, int ch, size_t n);函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。memse原创 2020-07-17 11:32:36 · 424 阅读 · 0 评论 -
llvm memset memcpy 处理流程
llvm memset memcpy 处理流程code 框架:code 框架:ProcessMemIntrinsic(Module *m) {//遍历module的function,寻找name为memset、memcpy的function。ProcessMemset(memset_func);ProcessMemcpy(memcpy_func);}ProcessMemset(memset_func) {//遍历memset_func的user,对每条memset instruction进原创 2020-07-16 08:45:06 · 1032 阅读 · 2 评论 -
clang 11 documentation 学习记录
clang description:clang is a C, C++, and Objective-C compiler which encompasses preprocessing, parsing, optimization, code generation, assembly, and linking.clang 编译 C文件过程:1、Preprocessing 对头文件预处理2、Parsing and Semantic Analysis 将输入文件生成“Abstract Syntax T原创 2020-07-11 11:31:24 · 444 阅读 · 0 评论 -
ESL_0.2debug 流程
case的bc是否正确run.tcl 是否正确case的目录下esl run.tcl检查生成的DG图是否一样:gvimdiff main_list_final.sch /home/wqwan/workspace/esl_0.2/testcase/CHStone/adpcm/main_list_final.sch检查Verilog是否正确:gvimdiff output/main.v /home/wqwan/workspace/esl_0.2/testcase/CHStone/ad.原创 2020-06-30 11:49:26 · 170 阅读 · 0 评论 -
DG OPT (DGBuilder generateDesign())
DG OPT一、DGBuild的入口函数是:generateDesign();bool DGBuilder::runOnModule(llvm::Module &m) { clock_t start_time = clock(); generateDesign(); clock_t end_time = clock(); PrintTime(start_time, end_time, "DGBuilder"); …………}二、generateDesign()内部处理流程原创 2020-06-16 20:26:29 · 318 阅读 · 0 评论 -
Dependency Graph construction
第一步是为DG生成nodes第二步通过CDFG生成CFG,就是将每个basic block看做一个点,分析每个节点之间的依赖关系,得出新的CFGCDFG的CFG图,通过CFG判断control的dependency,生成CDG。再分析Data dependency,生成DG。实线为data dependency,虚线为control dependency。...原创 2020-06-15 21:25:34 · 659 阅读 · 0 评论 -
函数传递为struct数组的首地址时,需要记录数组的index,
遇到的问题:H264中写C程序为:其中PINGPONGbuffer,Pic,Pic_info都是三个结构体类型变量,其中Pic,Pic_info为数组,当传递时值传递了首地址,此时指针无法知道指向哪个memory。StorablePicture Pic[MAX_REFERENCE_PICTURES];StorablePictureInfo Pic_info[MAX_REFERENCE_PICTURES];NALU_t PINGPONGbuffer;decode_main(&PINGPON原创 2020-06-14 21:21:24 · 435 阅读 · 0 评论 -
tpdn_opt H264 说明
Conclusion:High Level Synthesis of Complex Applications:An H.264 Video DecoderAim:Why need H.264:what is H.264:H.264 Video Decodingthe reason to choose H.264Introduce High Level SynthesisMETHODOLOGYH264 case 编译整理说明H264论文下载链接Aim:The article main shares t原创 2020-06-03 21:18:12 · 363 阅读 · 0 评论 -
vivado HLS 优化总结以及相关流程
HLS优化一、for 循环优化之pipeline二、for 循环优化之unroll三、for 循环优化之merge四、for 循环优化之数据流DataFlow五、for 循环优化之嵌套循环优化六、数组优化 - - 数组分割七、函数层面优化InlineAllocationDataflow八、总结分析改善吞吐率( Throughput )改善时延( Latency)改善资源( Area)一、for 循环优化之pipeline二、for 循环优化之unroll在默认情况下 for 循环是折叠的(rolle原创 2020-05-27 18:27:38 · 4825 阅读 · 2 评论 -
ESL0.1中优化开关
1、逻辑优化#if 1 //logic optimization ArithOptimize* ArithOpt = new ArithOptimize(&m); ArithOpt->binaryOpt(); Optimizer opt; opt.reset(); opt.setOutputFileName("hw_aft_arithopt.bc"); opt.setNoOutput(false); opt.optimize(m); //printf("l原创 2020-05-13 15:38:49 · 219 阅读 · 0 评论 -
shell 编写 (修改run tcl的脚本,测试clang_O1_O3)
#!/bin/bash#j=0#for i in `ls -1`#do # folder_list[j]=$i# j=`expr $j + 1`#done##for n in ${folder_list[@]};#do # echo ${n}#donecase_array=($(awk '{print $1}' list))for test_case in ${case_array[@]};do cp run.tcl /home/cpan/workspace/esl_0.2_原创 2020-05-09 21:09:20 · 775 阅读 · 0 评论 -
new rm_struct pass’s process FunctionList
rm_strcut处理的重点:按照每一个Function进行处理instructions。(1)processFunctionList遍历FunctionList,处理current Function。void processFunctionList(list<Function*> &func_list, const unordered_set<StructType ...原创 2020-04-23 12:23:53 · 154 阅读 · 2 评论 -
new rm_struct pass’s StructTypeDAG
setVertexLevelIndex():目标:给每个vertex添加level_index1、先从StructType_map_得到set<Vertex *> unindex_vertex;这些是需要加index的vertex。2、为vertexs添加level_index。unindex_vertex用来遍历每个vertex的children_vertexs,需要一个和u...原创 2020-04-22 09:57:50 · 139 阅读 · 0 评论 -
remove struct 伪代码思路
#include<DAG.h>struct str { x,y;};//Convert ConstantExpr as Instruction//%1 = load volatile i64, i64* getelementptr inbounds (%struct.str, %struct.str* @global, i64 0, i32 1)//->%1.1...原创 2020-04-08 11:42:57 · 222 阅读 · 0 评论 -
memset llvm定义及作用说明
llvm官方定义memset函数的作用:以dest为起始位置的n个字节的内存区域用整数set来进行填充,len为要填充的字节数,返回值为目标dest内存的起始地址特别说明:len表示的是字节数,函数是以字节的形式每次赋值给目标地址例子另一个casellvm对memmove定义原型:extern void *memmove(void *dest, const void *sr...原创 2020-03-23 17:46:11 · 391 阅读 · 0 评论 -
run.tcl
这个tcl是跑rm_struct pass用的tcl。set design structset out_dir output# Set device, which will load the specific *.tclset_device Virtex7 #set_parameter CLOCK_PERIOD 10set_clock_period 10#source legup.t...原创 2020-03-23 09:00:06 · 1508 阅读 · 0 评论 -
利用ESL pass出现的问题和make相关问题
1、没有ESL_pass中的hw_flow.cc没有inline,修改后的代码为:/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil -*- *//* vim: set tabstop=2 softtabstop=2 shiftwidth=2 expandtab: *///==============================...原创 2020-03-22 16:52:08 · 266 阅读 · 0 评论 -
当处理Function时,函参为arraystruct,需将其分解为下一层的arraystructType
函数Function *RemoveStruct::CreateMidFunction(Function *F, StructType *val_st, const int argNo) 通过val_num将所有的array记录,再利用createArrayStructType函数根据sub_struct type创建相应的sub array struct typeelse if (IsA...原创 2020-03-20 10:01:48 · 157 阅读 · 0 评论 -
2020-01-17rm_struct总结文档
代码总框架:一、第一层函数 :RemoveStructMain()其中changBC是主要处理函数,函数findStruct()是用于检测BC文件是否存在structType,以后会用while循环处理。void RemoveStruct::RemoveStructMain(){ changeBC(); if (findStruct()){ cout<<"Remo...原创 2020-01-17 19:25:03 · 160 阅读 · 0 评论 -
llvm 基础知识
llvm定义:LLVM项目是模块化、可重用的编译器以及工具链技术的集合。首先llvm出生为一个编译器框架。llvm作为C++、JAVA等多种语言的后端,对编程语言的编译时间等进行优化。llvm框架:(1)将前端和后端隔离开,不同的前端和后端都使用共同的中间代码:LLVM Intermediate Representation (LLVM IR)。(2)IR在经过不同PASS进行优化。...原创 2019-12-14 16:18:48 · 292 阅读 · 0 评论 -
struct例子测试流程
1、# Optimization Level 3 exec clang ${design}.c -emit-llvm -c -fno-builtin -O3 -fno-vectorize -fno-slp-vectorize -fno-unroll-loops -o ${design}_O3.bc使用clang O3进行编译出BC2、找到hw_flow.cc文件,将inline的OPT打开,并将...原创 2019-12-09 09:52:41 · 174 阅读 · 0 评论 -
对IR中 BitcastInst语句的处理算法
处理BitcastInst语句,首先总结其遇到的情况:1、通过struct Value 遍历到该变量user为BitcastInst。 %35 = bitcast (%1) to i16* //%1为struct Value的user(1)当%1为struct全局或局部变量时(1.1)当被memcpy语句使用时,通过memcpyToBitCast(memcpy_dest, bitc...原创 2019-12-05 19:30:52 · 439 阅读 · 0 评论 -
函数传参struct算法流程
目标:替换call指令和其对应define函数中struct参数1、遍历struct value userlist,struct value作为call指令参数,将call define Function 存入set中。2、处理set中Function,目标创建new Function(1) Function(str)创建Mid Function(str, x, y) P.S. x、...原创 2019-11-27 09:43:35 · 638 阅读 · 0 评论 -
MPS、Vivado HLS数据测试对比
目标:测试struct不同情况的case,测试对比vivado的IR与我分解IR,再通过MPS跑数据对比,还有直接用vivado跑出的结果,三者比较。我的综合结果测试流程:1、将在:~/workspace/esl_0.2/cpan_test_1目录下运行run.tcl,得出我的rm_struct.bc。2、再通过MPS跑综合,在:~/workspace/esl_0.1_2019/esl_0....原创 2019-11-07 16:24:27 · 424 阅读 · 0 评论 -
关于esl_0.1_2019目录说明
/workspace/esl_0.1_2019/esl_0.1/testcase/pan(使用esl_0.1工具进行测试,目标为了生成Verilog .v文件)testcasr/pan以下有三个文件夹每个处理的文件夹都必须含有boards、run.tcl 和原始.c文件包含两个文件夹byFunction & byHandbyFunction 处理的是removeStruc...原创 2019-07-19 15:39:52 · 440 阅读 · 0 评论 -
struct align 对齐注意事项
1、不可以把全局的最大align作为对齐数栗子:struct{char a; struct{char a;char b};struct{int a}}内存为8,要是把int最为全局最大,内存便会错误的认为是12了。原创 2019-08-02 17:16:22 · 862 阅读 · 1 评论 -
工作目录
一、ESL在ESL0.2进行调试(1)cpan@smooth:~/workspace/esl_0.2/cpan_test_1$ gdb ../bin/Linux_64/esl-debug(2)cpan@smooth:~/workspace/esl_0.2$ make -j12; make debug -j12(3)cpan@smooth:~/workspace/esl_0.2/cpan_t...原创 2019-07-25 20:15:09 · 117 阅读 · 0 评论 -
llvm基础了解叙述
1、what is llvm(Low Level Virtual Machine):是模块化、可重用的编译器及其工具链技术的集合。2、编译器架构:源码 ~ Frontend ~ Optimizer ~ Backend ~ 可执行文件前端(clang):词法分析(token)、语法分析(语法树AST)、语义分析、生成中间代码(IR)优化器:中间代码优化(pass)后端:生成机器码3、小细...原创 2019-09-04 11:17:15 · 453 阅读 · 0 评论 -
llvm Bitwise Binary Operations & Conversion Operations
1、‘shl’ InstructionThe ‘shl’ instruction returns the first operand shifted to the left a specified number of bits.op1是需要左移的数,左移的位数是op2,value = op1 * 2op2 mod 2n,如果左移的位数大于op1本身的bit数,将会报错。<result&...原创 2019-09-05 15:26:16 · 893 阅读 · 0 评论 -
llvm phi
‘phi’ InstructionLLVM 指令都使用 SSA (Static Single Assignment,静态一次性赋值) 方式表示。意思是所有变量都只能被赋值一次,这样做主要是便于后期的代码优化。<result> = phi <ty> [ <val0>, <label0>], ...The ‘phi’ instruction i...原创 2019-09-05 19:46:58 · 1750 阅读 · 1 评论 -
llvm memcpy
memcpy函数:The ‘llvm.memcpy.*’ intrinsics copy a block of memory from the source location to the destination location.从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。Note that, unlike the standard libc ...原创 2019-09-07 15:31:48 · 732 阅读 · 0 评论