TableGen 语言语法介绍
LLVM目前的更新很活跃,请注意跟踪项目最新变更 如果你之前没了解过 TableGen,请先看我的另一篇文章:有关于TableGen的简单介绍 有关于TableGen语言语法的文章,LLVM官方发布有两篇: TableGen Language Introductionbcain-llvm.readthedocs.io/projects/llvm/en/latest/TableGen/LangIntro/ TableGen Language Referencereleases.llvm.org/10.0.0/docs/TableGen/LangRef.html 文章开头声明说,第一篇不是规范的参考文档,第二篇是规范的参考文档,并且两篇都有点年久失修。我把两篇都看了一下,确实感觉第二篇更规范一些,尤其是语法描述的章节,特别严谨。但是,我这里还是选择以第一篇的内容作为参考文档,主要是因为从易读性的角度来说,第一篇更容易理解(读者友好型),当然,第二篇作为参考查阅更...
Effective C++ 学习笔记 2:构造、析构、赋值运算
Effective C++ 学习笔记 1:让自己习惯 C++Effective C++ 学习笔记 2:构造、析构、赋值运算Effective C++ 学习笔记 3:资源管理Effective C++ 学习笔记 4:设计与声明Effective C++ 学习笔记 5:实现Effective C++ 学习笔记 6:继承与面向对象设计Effective C++ 学习笔记 7:模板与泛型编程Effective C++ 学习笔记 8:定制 new 和 deleteEffective C++ 学习笔记 9:杂项讨论 条款 05:了解 C++ 默默编写并调用哪些函数Know what functions C++ silently writes and calls. C++ 中,空类并不是空的。 如果你没有指定构造函数,编译器会自动生成 default 构造函数,如果没有指定 copy 构造函数、copy 赋值操作符和析构函数,编译器也会自动生成空的版本(C++11 中还增加了移动构造函数和移动赋值运算符函数)。这几个自动生成的函数是 public 和 inline 的,析构函数是非 virt...
学习非暴力沟通
我掌握感受沟通情绪的技巧,最早是因为一本书,书名叫《非暴力沟通》,我非常乐意把这本书推荐给你。 作者马歇尔 · 卢森堡博士是非暴力沟通的最早传播者,里边介绍了很多他遇到的案例,同时也很细心的把这些案例按主题分类。 书中介绍了非暴力沟通的四个步骤,非常有实用价值,分别是:观察、感受、需要、请求(这四个词放在这里不好理解,推荐你去看书,毕竟作者把这四个词扩展成了一本书)。 你可能在想,不就是不要用暴力和冲突去沟通嘛,哪有那么多道理。但事实上,这是技巧,是能力,并且很多人只懂概念,但做不到(或者不知道怎么做)。我把自己所学的精华分享出来。 非暴力沟通的前提是先体会自己的内心情绪变化,观察自己的情绪,感受自己的内在体会,挖掘自己实际上产生这种情绪和体会的内心需要,以及自己对对方的请求是什么。 其实印度的文化中就融入了这种非暴力沟通的精神 @圣雄甘地,瑜伽练习的一部分就是在做这个事情(从第五实修——制感开始)。完成这些事情之后,我们自己内心就会平静下来,这需要先刻意去做,才会逐渐变得自然。 等调整好自己的内在之后,自己的情绪就很难被别人的言语所干扰。这时,你便可以主导沟通的情绪氛围了。为...
Effective C++ 学习笔记 1:让自己习惯 C++
Effective C++ 学习笔记 1:让自己习惯 C++Effective C++ 学习笔记 2:构造、析构、赋值运算Effective C++ 学习笔记 3:资源管理Effective C++ 学习笔记 4:设计与声明Effective C++ 学习笔记 5:实现Effective C++ 学习笔记 6:继承与面向对象设计Effective C++ 学习笔记 7:模板与泛型编程Effective C++ 学习笔记 8:定制 new 和 deleteEffective C++ 学习笔记 9:杂项讨论 条款 01:让自己习惯 C++Accustoming Yourself to C++. C++是语言联邦,它综合了多种编程语言的特点,是多重范型编程语言(注意是范型,不是泛型),支持过程形式(procedural),面向对象形式(object-oriented),函数形式(functionnal),泛型形式(generic),元编程形式(meta programming)。 将 C++认为是多种次语言的结合,次语言有四种: C 语言基础。C++最早出现时,从 C 中派生出来的...
有关于TableGen的简单介绍
本文主要参考了官方的一篇文档:TableGen - LLVM 10 documentationllvm.org/docs/TableGen/ 因为工作相关,需要整理学习一下llvm中TableGen的相关知识,本文不是对官方文档的直接翻译,故仅供参考。有关于LLVM的基础知识,可以参考我之前的文章:LLVM基本概念入门 - 知乎 (zhihu.com) 基本介绍TableGen在llvm中是一个比较重要的部分,它连接着很多不同功能的模块,它的主要目的是帮助开发人员更便捷的维护领域特定信息(domain-specific information),比如说和目标机器平台相关的信息,或者和编程语言相关的信息,它可以帮助开发人员在编译器开发过程中减小冗余代码,降低维护修改难度,以及提供更好的开发框架来有利于扩充信息。 TableGen是llvm中的一个组成部分,它的功能就是读取一个文件(td文件),解析这个文件,输出成不同的结果文件(比如说C++语法的.inc后缀文件)。现在来说,其服务的功能模块主要有2个,分别是LLVM后端的平台不相关的代码生成(...
LLVM基本概念入门
LLVM目前的更新很活跃,请注意跟踪项目最新变更 入职新公司以后,开始着手基于LLVM开发编译器,之前在前东家那里主要做gcc的开发,所以也算是有点基础,但拿到LLVM后,除了知道clang a.c -o a之外,好像其他的都有点差异。现在经过了小一个月的学习,也算有点收获。因为网上关于LLVM的中文资料一直也不多,即使能找到的一些,也都是停留在怎么使用的层面,对于编译器开发工程师入门来说,感觉完全不够,所以我写写基础概念,能帮到大家也挺好的。本文的参考资料主要是官网的资料,经过自己的摸索和提炼,整理成文,本文需要一定的编译器基础知识。有任何建议或疑问,欢迎留言 安装与使用这部分我不讲,网上资料挺多,Clang驱动程序把整个LLVM和clang都集成起来,和gcc的调用接口统一起来了,所以会用gcc的,Clang的使用也没啥问题。 LLVM和Clang的背景它最初的编写者,是一位叫做Chris Lattner(Chris Lattner’s Homepage)的大神,硕博期间研究内容就是关于编译器优化的东西,发表了很多论文,博士论文是提出一套在编译时、链接时、运行时甚至是...
跟随一条指令来看LLVM的基本结构
LLVM是一个很复杂的软件,了解LLVM的工作原理不是很容易,然而,对于刚开始接触LLVM整个框架的工作原理来说,详细而深入,不如广泛而浅显,所以有了这一篇文章。 通过跟随一条指令在LLVM中的各个passes中的状态变化,从源程序开始,到目标代码结束,可以让我们对LLVM的整体框架有个大致的认识。 这篇文章基于Life of an instruction in LLVM,文章大部分内容与参考文章一致,但由于参考文章编辑于2012年11月,当时的LLVM版本是3.2,距现在新的LLVM版本已有一些差异,所以有部分内容我做了调整。 这篇文章不会详细讲解各个passes中的实现,尽量易于理解,尽量紧贴指令的变化过程。 有关于LLVM中的一些基本概念,可以参考:LLVM基本概念入门 输入代码使用的输入代码与参考文章一致,选择一段C语言来开始: 1234int foo(int aa, int bb, int cc) { int sum = aa + bb; return sum / cc;} 我们focus的指令是除法指令,不关注其他代码。 ClangClang是L...
在 CentOS 上编译 LLVM 源码
在公司使用llvm开发编译器,刚入门,尝试在一个CentOS系统上编译llvm的源码,本文是对过程的简要记录以及遇到的一些问题的记录。 操作步骤下载llvm库12cd /home/PWE/git clone https://github.com/llvm/llvm-project.git 开始构建12345cd llvm-projectmkdir buildcd buildcmake -G Ninja -DCMAKE_BUILD_TYPE="Debug" -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi" ../llvmninja && ninja install 说明 cmake 这一步,只指定了构建类型和允许编译子项目,构建类型不指定时默认也是 Debug,可省略;另外没有指定安装路径,所以会安装到默认路径/usr/local,如果需要指定,则使用-DCMAKE_INSTALL_PREFIX="../install_path/";其他参数请参考官网。...












