2012/7/7 ???f任 (Wei-Ren Chen) <chenwj@xxxxxxxxxxxxxxxxx>: >> 欢迎大家对内容正确性、以及写作风格提建议。 > > 我 wiki 上的?热菡?自由取用。:) > > http://people.cs.nctu.edu.tw/~chenwj/dokuwiki/doku.php?id=llvm#code_generator > 谢谢啦,你的wiki上内容蛮丰富的。 > comment below, > > 1. LLVM 文?n???f已??不是新??了。 > > [LLVMdev] New backend > http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-July/051512.html > > ?P於 WritingAnLLVMBackend.html 你可以再加上底下?a充: > > http://llvm.org/devmtg/2012-04-12/Slides/Workshops/Anton_Korobeynikov.pdf > OK. > 2. "寄存器分配" 这个词的字面意义令人误解 > > 我不是很?_定?@???~??造成何?N?`解。我猜你是想表?_寄存器分配不光是?⒅??Υ嬖? > 寄存器,也有可能?Υ??却妫?????? ?????g器有些熟悉的人?碚f,寄存器分配自然?? > ?可娴郊拇嫫骰蚴??却妫?我不?X得??有什?N?`解。??是我猜?e你的意思? :) > 我指的是"寄存器分配"这个词的字面意义可能会让新手们忽略某些方面,因为我最初入手 的时候就在它的意义上产生了些许困惑。 我个人的感觉是“寄存器分配”有广义与狭义的区分。广义的寄存器分配包括任何寄存器 和存储器的分派过程。狭义的寄存器分配仅指对函数语句(statements)涉及的值进行 存储位置的指派。当谈及一个寄存器分配算法时,通常指的是狭义的寄存器分配过程。 从这个意义上说,调用约定是广义寄存器分配过程的组成部分,同时,调用约定对狭义 寄存器分配过程的初始条件作出了约束。 > 3. 在函数定义或调用时,参数传递以及值返回虽然也与寄存器“分配”的意义类似, > 但是作为 calling convention 在 TargetLowering 的派生类中实现。 > > ?@是下一步 Prologue/Epilogue Insertion 所要做的事??? 如果是的??,我?X得?a > 上去???????x起?肀容^?B??。 > prologue和epilogue分别主要涉及到两个方面的内容: (1)函数调用帧的建立以及与caller相关的现场信息保存。 (2)函数调用帧的撤销以及与caller相关的现场信息回复。 prologue和epilogue与 “参数传递以及值返回” 应该是分开的,尽管两者对应的指令序列 是相邻的。 原因有两点: 一、实现actual args传递的代码是在caller中,在call指令之后,才会执行callee的prologue. 在为callee生成代码时,用到的formal args是假定它们处于约定的存储位置。 二、在函数的实现体中,可能有多个return语句给函数传递返回值。运行时根据情况只会执 行其中的一个,接下来即执行该函数的epilogue. > > ?f任 > > -- > Wei-Ren Chen (???f任) > Computer Systems Lab, Institute of Information Science, > Academia Sinica, Taiwan (R.O.C.) > Tel:886-2-2788-3799 #1667 > Homepage: http://people.cs.nctu.edu.tw/~chenwj > -- 杨勇勇 (Yang Yongyong)