编译器技术
文章平均质量分 88
wuhui_gdnt
这个作者很懒,什么都没留下…
展开
-
指令选择器调查(1)
原作者:gabriel hjort blindell(Sweden)1. 介绍编译器是计算机科学最古老且研究得最彻底的问题之一;每项使用某个编程语言来实现一个软件的任务,而不是使用目标机器的汇编语言,都使得编译器成为必要(编译器的简介参考附录A)。把高级的源代码翻译为目标机器特定的代码,作为编译器的核心使命,需要处理范围广泛的中间问题(intermediate problems)—翻译 2016-01-19 12:03:47 · 1590 阅读 · 2 评论 -
LLVM中垃圾收集安全点
原文:http://llvm.org/docs/Statepoints.html状态本文档描述了LLVM的一组实验性扩展。小心使用,因为这些固有函数是实验性的。LLVM发布间的兼容也是不保证的。对支持使用gcroot固有函数的保守垃圾收集,LLVM目前支持另一种机制。这里描述的机制与gcroot实现很少有相同的地方,这个机制被寄予厚望,将最终替换gcroot机制。概观为了收集死翻译 2016-08-12 11:36:19 · 1179 阅读 · 0 评论 -
x86-64上的栈帧布局
原作者:Eli Benderskyhttp://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64几个月前,我写了一篇名为Wherethe top oft he stack is on x86的文章,目的在于澄清有关x86架构上栈使用的一些误解。这篇文章包括了一幅展示了一个典型函数调用栈帧布局的有用的图形。在本文我将调翻译 2016-08-26 11:42:48 · 6165 阅读 · 0 评论 -
缓冲溢出保护
https://en.wikipedia.org/wiki/Buffer_overflow_protection#Clang.2FLLVM来自Wikipedia,免费的百科全书缓冲溢出保护是在软件开发期间,通过检测栈上分配变量的缓冲溢出,并防止它们导致程序行为异常,或成为严重安全漏洞,来增加可执行程序安全性的各种技术。栈缓冲溢出发生在程序写入该程序调用栈上预期数据结构之外的一个内存地址时,翻译 2016-09-23 11:18:35 · 1629 阅读 · 0 评论 -
瞅一眼编译器的内部:保留我的memset
原文地址:http://blog.quarkslab.com/a-glance-at-compiler-internals-keep-my-memset.html作者:Serge Guelton为什么一些memset调用会被编译器优化掉?让我们去调查一下!C11标准引入了memset_s (3)函数,memset(3)的一个安全版本,它不会被编译器优化掉。为什么编译器可以优化掉我的翻译 2016-11-04 11:44:56 · 3835 阅读 · 0 评论 -
LLVM的SafeStack缓冲溢出保护的优缺点
作者:SamuelGroß原文地址:http://blog.includesecurity.com/2015/11/LLVM-SafeStack-buffer-overflowprotection.html引子在2015年6月,一个能减少内存破坏,称为SafeStack的新模块,由Google的PeterCollingbourne整合进llvm的开发分支,在将要到来的3.8版发布中可以翻译 2016-09-30 11:24:47 · 2508 阅读 · 0 评论 -
让我们致力于一个LLVM超级优化器
作者:JohnRegehr, Professor of Computer Science, University of Utah, USA原文地址:http://blog.regehr.org/archives/1109编译器优化有两个基本部分。首先,它需要识别IR(中间表示)中的一个可优化情形,比如同一个变量的邻近递增。要使优化效能最大化,情形识别器应该尽可能地广撒网。比如,注意到它可以翻译 2016-10-28 11:38:11 · 2767 阅读 · 0 评论 -
C编译器反证Fermat大定理
作者:JohnRegehr, Professor of Computer Science, University of Utah, USA原文地址:http://blog.regehr.org/archives/140【更新:本文没有非常清楚地解释底下的问题。我写了一篇更好的新博】。显然,我不是认真的:编译器不擅长解决高层次的数学问题,并且有很好的理由相信这个定理不能被反证。不过我翻译 2017-03-21 11:48:40 · 778 阅读 · 0 评论 -
回顾编译器与停机
作者:John Regehr, Professor of Computer Science, Universityof Utah, USA原文地址:http://blog.regehr.org/archives/161我早先的博文C compilers Disprove Fermat’s Last Theorem在这里及Reddit上产生了大量的讨论。不幸的是,讨论充斥着各种误解。其中一些翻译 2017-04-07 11:47:12 · 422 阅读 · 0 评论 -
LLVM的源代码调试
原文地址:http://llvm.org/docs/SourceLevelDebugging.html#llvm-dbg-declare引子本文是与LLVM调试信息相关的所有信息的集大成者。它描述了LLVM调试信息采用的实际形式,这对哪些关心创建前端或直接处理这些信息的人是有用的。另外,本文提供了C/C++调试信息看起来像什么的具体例子LLVM调试信息背后的哲学LLVM调试信息的思翻译 2017-03-31 13:09:40 · 7269 阅读 · 0 评论 -
未定义行为 != 不安全的编程
原文地址:https://blog.regehr.org/archives/1467作者:John Regehr在C与C++里,未定义行为(UB)对开发者来说是一个清晰且现实的危险,特别是当他们编写将在一个信任边界执行的代码时。一类不那么为人所知的未定义行为存在于大多数优化、领先的编译器的中间表达(IR)里。例如,除了让你一脸茫然的C形式的UB外,LLVMIR还增加了undef与poiso翻译 2017-03-24 11:54:22 · 623 阅读 · 0 评论 -
是时候严肃对待利用未定义行为这件事了
原文地址:http://blog.regehr.org/archives/761作者:John Regehr[注:我答应,暂时来说,这是应该是我最后一篇关于未定义行为的博文。更多后续有来。]当前的C与C++编译器将利用未定义行为来生成高效代码(大量的例子在这里及这里),但不一致或者不好。是时候让我们严肃对待这个问题了。在本文,我将证明利用未定义行为可以显著提升代码速度,同时100%符合翻译 2017-04-28 11:40:35 · 486 阅读 · 0 评论 -
更多随机性还是更少
作者:XiWang原文地址:http://kqueue.org/blog/2012/06/25/more-randomness-or-less/CVE-2006-0166是一个将未初始化内存用于随机数生成的名声狼藉的例子。一个Debian维护者注掉了两行代码来使Valgrind闭嘴,它抱怨未初始化内存的使用是熵的一个额外来源,这个改变使得OpenSSL在基于Debian的系统上生成伪键值(翻译 2017-04-20 11:45:21 · 491 阅读 · 0 评论 -
未定义行为:不只是编程语言
原文地址:https://blog.regehr.org/archives/1438作者:John Regehr这是一个老掉牙但好用的桥段。从这个前提开始:a = b两边同乘以a:a2 = ab两边同减去b2:a2 – b2 = ab – b2左边提取公因数:(a+ b)(a – b) = ab – b2右边提取公因数:(a+ b)(a – b) =翻译 2017-06-23 11:37:35 · 308 阅读 · 0 评论 -
调用惯例的历史
调用惯例的历史作者:Raymond Chen在x86平台上关于调用惯例的好处是有如此多的选择!在16位的世界中,调用惯例的部分是由指令集固定的:BP寄存器缺省为SS选择子,而其他寄存器缺省为DS选择子。因此BP寄存器是访问基于栈的参数必须的寄存器。用于返回值的寄存器也是由指令集自动选择的。AX寄存器作为累加器,因此是传递返回值的显然选择。8086指令集还有把DA:AX对处理为单个3翻译 2017-12-01 11:44:47 · 452 阅读 · 0 评论 -
给初学者的链接器指南
原文地址:http://www.lurklurk.org/linkers/linkers.html本文目的在于帮助C与C++程序员理解链接器工作的实质。多年来,我已经在若干学院宣讲之,因此是时候将它写下来,使更多人可以看到它(这样,我就无需再次解释它了)。【在2009年3月更新,包括了Windows上链接特性的更多信息,加上一次定义规则的一些澄清】。促成这个解释的一个典型例子是,在我帮助某...翻译 2018-11-09 11:31:29 · 923 阅读 · 0 评论 -
C++异常的幕后14:多个着陆垫与大师的教导
原文地址:https://monoinfinito.wordpress.com/2013/04/23/c-exceptions-under-the-hood-14-multiple-landing-pads-the-teachings-of-the-guru/作者:nicolasbrailo在大量困难的工作后,上次我们最终得到了可工作的personality函数,它无需libstdc++就...翻译 2019-05-24 11:40:38 · 326 阅读 · 0 评论 -
优化的x64代码的调试挑战
原文地址:https://blogs.msdn.microsoft.com/ntdebugging/2009/01/09/challenges-of-debugging-optimized-x64-code/如果你还没有调试过优化的x64代码的奢华体验,不要等太久而落后于时代!因为x64类似于fastcall的调用惯例与丰富的通用寄存器,查找在调用栈的任意点的变量值确实非常棘手。在本文,我翻译 2016-09-02 11:36:33 · 2135 阅读 · 0 评论 -
静态链接中库的次序
原作者:Eli Benderskyhttp://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking我将以一个有点卑劣但有教育性的例子开始。假定我们有这样的代码:volatilechar src[] = {1,2, 3,4, 5};volatilechar dst[50] = {0};翻译 2016-08-19 11:22:03 · 683 阅读 · 0 评论 -
在LLVM中使用垃圾收集
原文:http://llvm.org/docs/GarbageCollection.html摘要本文论及如何将LLVM整合进一个支持垃圾收集语言的编译器。注意LLVM本身不支持垃圾收集。你必须自己提供。快速开始首先,你应该选择一个收集器策略。LLVM包括若干内置策略,但你还可以一个定制的定义来实现一个可载入的插件。注意收集器策略是一个LLVM应该如何生成代码,使它与你的收集器及运行翻译 2016-08-05 11:31:38 · 2582 阅读 · 0 评论 -
共享库载入时重定位
共享库载入时重定位原作者:Eli Benderskyhttp://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries本文的目的是解释现代操作系统如何使得共享库载入时重定位成为可能。它关注运行在32位x86的LinuxOS,但通用的原则也适用于其他OS与CPU。共享库有许多名字——共享库,翻译 2016-04-01 11:38:43 · 3333 阅读 · 0 评论 -
指令选择器调查(2)
原作者:gabriel hjort blindell(Sweden)3. 树覆盖宏展开的一个主要局限是其活动范围局限于单个编程语言结构或IR节点。如果输入程序与机器指令都被转换为图形化的表示,一个更强有力的做法是可行的。因为机器指令将形成比输入程序更小的图,这样指令选择问题被简化为查找机器指令的一个排列,它们产生与该程序相等的图。让我们假设输入程序可以被转换为一组树,翻译 2016-03-11 13:16:09 · 1120 阅读 · 0 评论 -
x64共享库中的位置无关代码(PIC)
原作者:Eli Benderskyhttp://eli.thegreenplace.net/2011/11/11/position-independent-code-pic-in-shared-libraries-on-x64之前的文章,以为x86架构编译的代码为例子,解释了位置无关代码(PIC)如何工作。我承诺在另一篇文章里涉及x64[1]上的PIC,现在就是了。本文将不会太进入细节,因翻译 2016-04-15 11:45:29 · 3327 阅读 · 1 评论 -
共享库中的位置无关代码(PIC)
原作者:Eli Benderskyhttp://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/在之前的文章里我已经描述过在将共享库载入程序地址空间时需要特殊的处理。简而言之,在链接器创建共享库时,它不能预先知道这个库将在哪里载入。这给在库里访问数据与代码带来了麻烦,应该使翻译 2016-04-08 11:11:22 · 10715 阅读 · 3 评论 -
指令选择器调查(3)
3.4. 分离模式匹配与选择在前面所讨论的做法里,模式匹配及模式选择的任务组成了单个步骤。尽管这使得单遍代码生成成为可能,但它阻碍了指令选择器进行最优的模式选择,因为在进行决策前,它不能收集所有适用模式的信息。保持两者独立可以解决这个问题,代价是必须在表达式树上执行多个遍。3.4.1. 通过树解析的模式匹配多年来,已经找出许多算法来查找另一棵树中子树的匹配。应用在指翻译 2016-05-13 11:06:46 · 746 阅读 · 0 评论 -
静态链接库如何在Linux上运行
作者:Eli Benderskyhttp://eli.thegreenplace.net/2012/08/13/how-statically-linked-programs-run-on-linux/在本文里我希望探究在Linux上执行一个静态链接库时会发生什么。静态链接,我的意思是一个不需要任何共享对象,即使无所不在的libc,而运行的程序。在现实中Linux上遇到的大多数程序不是静态链翻译 2016-05-13 11:09:14 · 825 阅读 · 0 评论 -
指令选择器调查(5)
4. DAG覆盖就像我们在前一章看到的,唯一地依赖树的一个内在缺点是不能正确地对公共子表达式建模。这意味着一个表达式必须要么分成一个树林,要么在每棵子树中重复操作。两者都不是好的解决案,因为它们都导致次优的代码。这个问题的一个解决方案是不要把表达式建模为树,而是有向无环图(DAG)。DAG允许节点有多个外出边,因此使得中间节点的值可以共享及重用。执行指令选择可以使用与树相同的模式匹配翻译 2016-05-27 11:42:38 · 1992 阅读 · 0 评论 -
理解x64代码模型
原作者:Eli Benderskyhttp://eli.thegreenplace.net/2012/01/03/understanding-the-x64-code-models在编写x64架构代码时一个有趣的问题是使用哪个代码模型。这可能是一个不广为人知的议题,但如果想理解编译器生成的x64机器代码,熟悉代码模型是有教育意义的。这与优化及对哪些真正关心性能,从哪怕最小的指令也要抠性能的翻译 2016-04-22 11:42:32 · 3297 阅读 · 0 评论 -
指令选择器调查(4)
3.5. 动态规划优化模式选择在1985年Aho与Ganapathi【6】展示了一个称为CGL的语言,它提供了一个Glanville-Graham风格的记法来描述模式。描述送到一个预处理器,产生一个可以被包括在编译器后端的指令选择器。指令选择器以Aho-Corasick算法为基础进行模式匹配,包含了Aho与Johnson之前使用的动态规划(DP)技术的一个简化版。指令选择器在输翻译 2016-05-20 11:43:23 · 1978 阅读 · 0 评论 -
指令选择器调查(7完)
6. 模拟指令选择器的最后一个分类是那些通过分析及比较一条指令在目标机器上的作用,决定选择哪条指令。与输入程序给定部分具有相同作用的一条指令是兼容的,因此该部分可由这条指令来达成(参考图6.1)。我们称这些概念为模拟(simulation)。模拟与基于覆盖方法间的一个关键区别是,在输入程序不能观察到所有输出模式(即模式不是确切匹配输入图)时,后者通常不能利用具有多个输出的模式。相反,翻译 2016-06-24 11:15:10 · 1790 阅读 · 0 评论 -
指令选择器调查(6)
5. 基于图的做法依赖图覆盖的指令选择器是目前能得到的最强大的代码生成器。通过允许输入及模式具有任意的图形状,指令选择器能够接受整个函数为输入——这被称为全局指令选择——有可能处理各种机器指令,包括硬件循环及SIMD指令。最重要的,与局限在单个基本块的基于DAG覆盖的技术相比,全局指令选择器可以在多个块间自由地移动及覆盖节点。这增加了应用复杂模式的机会,这可能导致性能提升及减少功耗。翻译 2016-06-03 11:55:46 · 1944 阅读 · 0 评论 -
LLVM 3.0类型系统重写
原文地址:http://blog.llvm.org/2011/11/llvm-30-type-system-rewrite.htmlLLVM 3.0中最为普遍的IR(因此编译器API)改变之一是完全重新实现LLVMIR类型。这个改变拖延了很久(最初的类型系统自LLVM1.0延续),它使得编译器更快,极大地简化VMCore的一个关键子系统,并消除了IR某些通常导致混淆与不方便的设计点。本文解释为翻译 2016-07-22 11:52:47 · 1979 阅读 · 0 评论 -
异常处理表
原文地址:https://mentorembedded.github.io/cxx-abi/exceptions.pdf本节描述了编译器生成的数据,使运行时能够找到关于在异常发生时所采取行动的合适信息。概览从当前PC查找异常处理信息的过程总结在下图:所有的表都在“代码”空间。由typeinfo指针指向的类型由一个GP相对偏移确定。系统回滚表这些都描述在《翻译 2016-07-08 11:41:36 · 3755 阅读 · 0 评论 -
LLVM 3.0异常处理重设计
原文:http://blog.llvm.org/2011/11/llvm-30-exception-handling-redesign.htmlLLVM 3.0中最大的IR改变之一是重新设计、实现了LLVMIR异常处理模型。旧的模型,虽然对大多数情形都工作,在某些关键情形下跌倒,导致隐蔽的误编译,未达成的优化,以及差劲的编译用时。本文讲述LLVM3.0中的改变,以及如何将一个现有的LLVM前端翻译 2016-07-08 11:45:47 · 1530 阅读 · 0 评论 -
LLVM里的异常处理
原文:http://llvm.org/docs/ExceptionHandling.html#funclet-parent-tokens介绍本文是与LLVM里有关异常处理的所有信息的集散地。它描述了LLVM异常处理信息所具有的格式,这对对构建前端或直接处理该信息感兴趣的人是有用的。另外,本文提供了关于在C与C++中使用什么异常处理信息的特定例子。Itanium ABI零开销异常处理翻译 2016-07-08 11:47:31 · 5483 阅读 · 1 评论 -
LLVM中的栈映射与补丁点
原文地址:http://llvm.org/docs/StackMaps.html定义在本文我们将所有充当LLVM客户端的组件统称为“运行时”。包括LLVMIR生成器,目标代码消费者,以及代码修补程序。栈映射(stack map)记录在一个特定指令地址处的活动值。这些活动值不是指生存期跨越该栈映射的LLVM值。相反,它们只是运行时要求在这个点存活的值。例如,它们可能是在与包含该栈映射的函翻译 2016-07-29 11:25:07 · 1451 阅读 · 0 评论 -
ThinLTO:可扩展及增量的LTO
原文地址:http://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.htmlThinLTO首先是在2015年EuroLLVM上提出的(LTO即link time optimization),由clang与LLVM里的一个原型实现给出结果。自此,几个RFC审查了这个设计,它已经在LLVM里实现(对gold及libLTO),...翻译 2019-07-12 11:36:19 · 3544 阅读 · 0 评论