E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
GCC-3.4.6
Studying note of
GCC-3.4.6
source (167)
5.13.5.2. OutputassembleforpendingvariablesReturnfinish_file,wehaveseenthatflag_unit_at_a_timeissetatlevelabove‘-O2’.Thisflagalsocanbesetbyoption-funit-at-a-timewhichdescribedin[6]asbelow:
wuhui_gdnt
·
2011-02-26 15:00
tree
alignment
output
compilation
variables
whitespace
GCC-3.4.6
源代码学习笔记(167)
5.13.5.2. 为待定变量发布汇编回到finish_file,我们已经看到flag_unit_at_a_time在‘-O2’以上优化级别中设置为1。这个标记也可以由选项-funit-at-a-time来设定,【6】对其描述如下:在开始产生代码之前,解析整个编译单元。这允许进行某些额外的优化,不过会消耗更多内存(总体而言)。使用unit-at-a-time模式有一些兼容性
wuhui_gdnt
·
2011-02-26 15:00
汇编
function
tree
alignment
output
compilation
Studying note of
GCC-3.4.6
source (166)
5.13.5.1.3. PreparealiassetHowever,theentrypointforcreatingaliassetisget_alias_setbelow.Bothnodeoftypeandnodeofdeclarationcanclaimforaliasanalysis,butdeclaration’saliassetisdeterminedbythealiass
wuhui_gdnt
·
2011-02-19 11:00
object
tree
Class
compiler
Types
Pointers
GCC-3.4.6
源代码学习笔记(166)
5.13.5.1.3. 准备别名集构建别名集的入口是下面的get_alias_set。类型节点及声明节点可以要求别名分析,不过声明的别名集由其底层类型的别名集确定。在467行的条件选出声明的节点。在C++前端,475行的钩子get_alias_set指向cxx_get_alias_set。这个函数主要处理类型定义节点,我们暂时不管这个函数。 449 HOST_WIDE_INT450 g
wuhui_gdnt
·
2011-02-19 11:00
GCC-3.4.6
源代码学习笔记(165)
5.13.5. 代码分析及优化5.13.5.1. 预备知识-别名集分析5.13.5.1.1. 别名集概念在维基百科(wikipedia)中,给出了如下的别名集的一个很好的解释。别名分析是在编译器理论中的一个技术,用于确定一个存储位置是否可能以多个方式访问。两个指针通常被认为别名,如果它们指向同一个位置。别名分析技术通常分为流-敏感(flow-sensit
wuhui_gdnt
·
2011-02-19 11:00
优化
struct
tree
编译器
conflict
behavior
Studying note of
GCC-3.4.6
source (164)
5.13.4.7.1.3. BuildnodesforthefunctioncallReturnfrombuild_function_call,coerced_paramsatline2494holdstheconvertedarguments.Ifthefunctioninvokedisbuiltinfunciton,thebuiltinfunctionscanbeexpandedhereand
wuhui_gdnt
·
2011-02-19 11:00
Studying note of
GCC-3.4.6
source (163)
5.13.4.7.1.2. DoappropriateconversionforargumentsInthissection,wegoalittledeepertoseeindetailhowtomatchtheargumentwiththeparameter,anddonecessaryconversionappropriately.InC++front-end,functionparamete
wuhui_gdnt
·
2011-02-19 11:00
GCC-3.4.6
源代码学习笔记(163)
5.13.4.7.1.2. 为实参执行适合的转换在这一节中,我们要深入一些来看一下如何把实参匹配形参,并执行必须的转换。在C++前端中,函数形参被记录在FUNCTION_TYPE的TYPE_ARG_TYPES域中,它是一个tree_list类型的串,其节点中的TREE_VALUE是对应形参的类型;TREE_PURPOSE是缺省实参值的一个表达式,如果有的话。如果在该链表中最后的节点是void_li
wuhui_gdnt
·
2011-02-19 11:00
Studying note of
GCC-3.4.6
source (162 - continue)
Atline5350current_class_ptristhePARM_DECLforthe`this'pointer,whenwe'reprocessingamemberfunction.Seethatinbelowonlythetypeofinstancecanbeknownforsureitreturnsnon-null.Comparedwithconditionatline5281,wh
wuhui_gdnt
·
2011-02-19 11:00
GCC-3.4.6
源代码学习笔记(162-续)
在5350行,当我们正在处理一个成员函数时,current_class_ptr是用于‘this’指针的PARM_DECL。看到在下面,仅当instance的类型是可以明确知道的情形,才返回非空值。与5281行的条件相比,5281行的条件表示一个指针,而在C++里,它可以是该类层次中不同的类型,以提供多态。因此作为结果,它返回NULL_TREE。 5275 statictree5276 fixe
wuhui_gdnt
·
2011-02-19 11:00
function
tree
null
Integer
Build
Constructor
Studying note of
GCC-3.4.6
source (162)
5.13.4.7.1. Generatingcodeforfunctioninvocation5.13.4.7.1.1. Buildexpressiontotakefunction’saddressNow,webeginanewlongoffshootawayfromourmainroute.Whenwewritecodelike:f(a,b);tocallfunctionf,thec
wuhui_gdnt
·
2011-02-19 11:00
function
tree
Integer
Class
Build
fold
GCC-3.4.6
源代码学习笔记(162)
5.13.4.7.1. 为函数调用产生代码5.13.4.7.1.1. 构建获取函数地址的表达式当我们写出类似:f(a,b);的代码来调用f,编译器需要努力使得这个调用以期望的方式可行。下面的函数泄露了编译器的所作所为。 2420 tree2421 build_function_call(treefunction,treeparams)
wuhui_gdnt
·
2011-02-19 11:00
function
tree
Integer
Class
Build
fold
Studying note of
GCC-3.4.6
source (161)
5.13.4.7. GeneratecodeforinvokinginitializerfunctionaccordingtopriorityIfiterationtakenbycodebetweenline2573to2800turnsoutstable–thatisnothingnewisgeneratedorinotherwordsallobjectsexplicit
wuhui_gdnt
·
2011-02-13 17:00
function
tree
Constructor
initialization
destructor
Instantiation
GCC-3.4.6
源代码学习笔记(161)
5.13.4.7. 发布代码根据优先级调用初始化函数如果由代码2573至2800行执行的迭代稳定了下来——即不再产生新的东西,或者换句话说,所有显式或隐式涉及的对象都已经处理了,就可以继续完成机器代码分别这个目标。 finish_file(continue) 2801 /*Allusedinlinefunctionsmusthaveadefinitionatthispoi
wuhui_gdnt
·
2011-02-13 17:00
GCC-3.4.6
源代码学习笔记(160)
5.13.4.5. 迭代–处理名字空间中的全局对象前面我们已经为需要构造函数及析构函数的全局或静态对象准备、注册好了初始化函数及退出函数。这一次的迭代检查是否还有没有处理的全局对象,并处理之。函数walk_namespaces从上至下以前序访问名字空间树。 848 int849 walk_namespaces(walk_namespaces_fnf,void*dat
wuhui_gdnt
·
2011-02-11 08:00
Studying note of
GCC-3.4.6
source (159)
5.13.4.4. Iterate–emittingcodefordeferredfunctionFunctiongeneratedbythecompiler(viaimplicitly_declare_fn,mark_decl_instantiated,orbuild_clone)orinlinemethodiscachedindeferred_fns.Arrivingh
wuhui_gdnt
·
2011-02-11 08:00
GCC-3.4.6
源代码学习笔记(159)
5.13.4.4. 迭代–为延迟函数发布代码由编译器产生的函数(经由implicitly_declare_fn,mark_decl_instantiated或build_clone)或内联函数缓存在deferred_fns中。因为到这里,我们已经完成了整个源文件的代码解析,处理这些延迟函数的信息都应该齐备了。首先,对于由编译器自己产生的“人造”函数,其设置了标记DECL_A
wuhui_gdnt
·
2011-02-11 08:00
function
tree
null
Build
Constructor
nested
Studying note of
GCC-3.4.6
source (158)
5.13.4.3. Iterate–emittingcodeforctor/dtorofglobalaggregateNextintheDOWHILEloop,atline2651static_aggregatesisalistthatholdsaggregateshavingconstructorordestructorandresideintheglobalscope.
wuhui_gdnt
·
2011-02-11 08:00
function
tree
Integer
Build
initialization
destructor
GCC-3.4.6
源代码学习笔记(158)
5.13.4.3. 迭代–发布全局聚集类的构造函数/析构函数接着在这个DOWHILE循环中,在2651行static_aggregates是一个链表,它包含了在全局绑定域中具有构造函数或析构函数的聚集类。正如我们已经看过,编译器需要确保在进入“main”函数之前,所有全局变量必须已经分配了内存及被初始化。5.13.4.3.1. 修整需要初始化的变量因此在2651
wuhui_gdnt
·
2011-02-11 08:00
function
tree
Integer
Build
initialization
destructor
Studying note of
GCC-3.4.6
source (157)
5.13.4.2. Iterate-emittingtinfoNowalltinfosneedcodeemittedhavebeenchainedintounemitted_tinfo_decls,theninfinish_fileatline2628,emit_tinfo_decldetermineswhetherthetinfoofdeclneedsbeemitted,
wuhui_gdnt
·
2011-02-11 08:00
String
tree
null
Class
Build
Constructor
GCC-3.4.6
源代码学习笔记(157)
5.13.4.2. 迭代–发布tinfo现在所有需要代码发布的tinfo已经被串入unemitted_tinfo_decls中。接着在finish_file的2628行,emit_tinfo_decl确定decl的tinfo是否需要发布,如果需要,则返回true。下面,看到之前在finish_file的2571行调用的emit_support_tinfos中,doing_r
wuhui_gdnt
·
2011-02-11 07:00
String
tree
null
Build
Constructor
nested
Studying note of
GCC-3.4.6
source (156)
5.13.3. GeneratetinfoforfundamentaltypesAfteroutputtingPCHfileifrequired,backinfinish_filetocontinuethestruggleofassembleemitting.Next,thecompilershouldpreparetinfoforthefundamentaltypes. finish_f
wuhui_gdnt
·
2011-02-02 09:00
GCC-3.4.6
源代码学习笔记(156)
5.13.3. 为基本类型产生tinfo操持完PCH文件,回到finish_file中继续为汇编代码的生成而奋斗。接下来编译器将为基本类型准备tinfo。 finish_file(continue) 2546 /*Otherwise,GDBcangetconfused,becauseinonlyknows2547 aboutsourceforLINENO-1lines. */2
wuhui_gdnt
·
2011-02-02 09:00
function
tree
output
initialization
compilation
Instantiation
Studying note of
GCC-3.4.6
source (155)
5.13.2. OutputPCHfileSeeingsomethingrelatedtoconversion,resumesourexampleinafter-parsingstage.Returnfromexpand_or_defer_fnwearebackcp_parser_function_definition_after_declaratorwhichreturnstheFUNC
wuhui_gdnt
·
2011-02-02 09:00
struct
object
File
null
structure
Pointers
GCC-3.4.6
源代码学习笔记(155)
5.13.2. 输出PCH文件看过了转换相关的内容后,回到我们例子的解析后的阶段,从expand_or_defer_fn返回,我们回到cp_parser_function_definition_after_declarator,并立即返回FUNCTION_DECL,这个FUNCTION_DECL为cp_parser_function_definition_from_specifiers_a
wuhui_gdnt
·
2011-02-02 09:00
Studying note of
GCC-3.4.6
source (154)
5.13.1.2.3.1. Casestudy:topointerconversion5.13.1.2.3.1.1. FromclasstopointerConversiontopointersisinteresting,itworthesalook.Thefunctionhandlingthisconversioniscp_convert_to_pointerbelow.Clas
wuhui_gdnt
·
2011-01-29 15:00
GCC-3.4.6
源代码学习笔记(154)
5.13.1.2.3.1. 案例学习:到指针的转换5.13.1.2.3.1.1. 从类到指针到指针的转换是很有趣的,值得一看。处理这个转换的函数是下面的cp_convert_to_pointer。类可以被转换到指针类型,仅当它定义了一个这样做的用户定义转换。 76 statictree77 cp_convert_to_pointer(treetype,treeexp
wuhui_gdnt
·
2011-01-29 15:00
Studying note of
GCC-3.4.6
source (153)
5.13.1.2.2.3. InvokingtheinitializingmethodBelow,flag_elide_constructorbydefaultis1whichmeansattempttoelideconstructorswhenpossible.Whethertheconstructor(includesoperator=(constX&)ifdefined)canbeelide
wuhui_gdnt
·
2011-01-29 15:00
function
tree
Class
Build
reference
Constructor
GCC-3.4.6
源代码学习笔记(153)
5.13.1.2.2.3. 调用初始化方法在下面默认的,flag_elide_constructor是1,这表示尽可能消减构造函数。构造函数(包括operator=(constX&),如果定义了)是否可以被削减,依赖于它是否是平凡的。断言TYPE_HAS_COMPLEX_INIT_REF成立,如果该类类型具有非平凡拷贝构造函数;而断言TYPE_HAS_COMPLEX_ASSIGN_REF成立,如果
wuhui_gdnt
·
2011-01-29 15:00
tree
null
Build
reference
Constructor
fold
Studying note of
GCC-3.4.6
source (152)
5.12.5.2.2.2.2. DefaultargumentsIfargexhausted,butparmdoesn’t,parmmustcontaindefaultarguments,forwhichthelistshouldbeterminatedbythespecialvoid_list_node.Thenincorrespondingnode,TREE_VALUEhold
wuhui_gdnt
·
2011-01-29 15:00
GCC-3.4.6
源代码学习笔记(152)
5.12.5.2.2.2.2. 缺省实参如果耗尽了arg,但parm还没有,parm必然包含了缺省实参,该形参列表应该以特殊节点void_list_node来结尾。那么在对应的节点中,TREE_VALUE保存了该类型,而TREE_PURPOSE是缺省实参的表达式。 4258tree4259convert_default_arg(treetype,treearg,treefn,int
wuhui_gdnt
·
2011-01-29 15:00
Studying note of
GCC-3.4.6
source (151)
5.13.1.2. TherealconversionInprevioussection,theconversionsequenceisdetermined;thenexecutingthissequence,itcangetthetargettypefromtheconversion.InC++front-end,inconvert_like_realbelowconve
wuhui_gdnt
·
2011-01-29 15:00
function
tree
null
Build
Constructor
Warnings
GCC-3.4.6
源代码学习笔记(151)
5.13.1.2. 真正的转换在前一节,转换序列被确定;那么执行这个序列,可以从转换中得到目标类型。在C++的前端中,在下面的convert_like_real里,转换将真正执行。在其参数中,fn及argnum用于诊断的目的,其中argnum是从0开始,-1表示方法的‘this’指针实参。而inner是非0值,当被调用继续一个转换链时。当应用一个引用绑定时,它是负值;否则就
wuhui_gdnt
·
2011-01-29 15:00
Studying note of
GCC-3.4.6
source (150)
5.13.1.1.3.2. ReferencetoknowntypeForalreadyknownfrom-type,reference_bindingdoeswithbelowcode. reference_binding(continue) 958 if(TREE_CODE(from)==REFERENCE_TYPE)959 {960 /*Anythingwithrefe
wuhui_gdnt
·
2011-01-29 14:00
tree
Class
Build
reference
Constructor
binding
GCC-3.4.6
源代码学习笔记(150)
5.13.1.1.3.2. 对确定类型的引用对于已确定的类型,reference_binding用下面的代码来处理。 reference_binding(continue) 958 if(TREE_CODE(from)==REFERENCE_TYPE)959 {960 /*Anythingwithreferencetypeisanlvalue. */961 lval
wuhui_gdnt
·
2011-01-29 14:00
function
tree
Class
Build
reference
binding
Studying note of
GCC-3.4.6
source (149)
5.13.1.1.3. CaseofconversionforreferencetypeIfthetargettypeisofreferencekind(seeline1106inimplicit_conversion),itisthecaseofreferencebindingspecifiedby[3],clause13.3.3.1.4“Referencebinding”[over
wuhui_gdnt
·
2011-01-22 09:00
GCC-3.4.6
源代码学习笔记(149)
5.13.1.1.3. 引用类型的转换如果目标类型是引用类型(参见implicit_conversion的1106行),这是由【3】条文13.3.3.1.4“引用绑定”[over.ics.ref]所指定的引用绑定的情形。1. 当一个引用类型的形参直接绑定(8.5.3)到一个实参表达式,其隐式转换序列是恒等转换,除非该实参表达式的类型是形参类型的一个派生类,这时其隐式转换序列是一个派生类
wuhui_gdnt
·
2011-01-22 09:00
function
tree
Build
reference
Types
Instantiation
Studying note of
GCC-3.4.6
source (148 continue)
Readbelowcommentcarefullybeforegoingahead.Infactthereisanotherpossibilitythatwewilldropinbelow.Consideringbelowexampe:voidf(unsignedshorti){}voidf(unsignedchari){}intmain(){ f(5);}Thestandardconvers
wuhui_gdnt
·
2011-01-22 09:00
function
tree
user
reference
Constructor
wrapper
GCC-3.4.6
源代码学习笔记(148 - 续)
继续前进之前,仔细阅读下面的注释。事实上,存在一个可能,我们会在下面失败退出。考虑以下例子:voidf(unsignedshorti){}voidf(unsignedchari){}intmain(){ f(5);}这两个函数实参的标准转换序列都不是彼此的子序列,因而需要下面的代码来进行进一步的调整。 compare_ics(continue) 5417 /*Otherwise,oneseq
wuhui_gdnt
·
2011-01-22 08:00
GCC-3.4.6
源代码学习笔记(147-续2)
unify(continue) 9964 casePTRMEM_CST:9965 {9966 /*Apointer-to-memberconstantcanbeunifiedonlywith9967 anotherconstant. */9968 if(TREE_CODE(arg)!=PTRMEM_CST)9969 return1;99
wuhui_gdnt
·
2011-01-22 08:00
function
tree
null
Integer
Class
Types
GCC-3.4.6
源代码学习笔记(147-续1)
然后如果一切顺利,最后通过10401的fn_type_unifcation把推导后实参放入targs。而这些实参接着在resolve_overloaded_unification的9334行,立即由tsubst替代入模板形参。接着在下面的函数中,tparms指向模板形参;orig_targs是推导出的实参的vector;两者都是调用者resolve_overloaded_unification的参
wuhui_gdnt
·
2011-01-22 08:00
vector
tree
Integer
Class
Parameters
reference
GCC-3.4.6
源代码学习笔记(147)
5.13.1.1.2.1.2. 添加模板方法下面的隐式转换的机制将尝试查是否能隐式地调用某个模板转换操作符。这个过程不能被命令行选项“–fimiplicit-template”所关闭。因为该模板函数是隐式调用的,它不能直接地指定模板实参;该模板实参只能根据调用实参推导。而那些不能推导出来的,将不被选中。在调用点上,ctype是‘this’指针的类型,explicit_targs是显
wuhui_gdnt
·
2011-01-22 08:00
function
tree
null
Parameters
templates
Types
Studying note of
GCC-3.4.6
source (146)
5.13.1.1.2. CaseofuserdefinedconversionsequenceIfstandardconversioncan’twork,convatline1107inimplicit_conversionwouldbeNULL.Itwillseeifthereisanyuser-definedconversionapplicable.Itinvolvesthepro
wuhui_gdnt
·
2011-01-22 08:00
function
tree
Class
Path
Constructor
initialization
GCC-3.4.6
源代码学习笔记(146)
5.13.1.1.2. 用户定义转换序列如果标准转换不奏效,在implicit_conversion的1107行conv将是NULL。它将要看是否有可用的用户定义的转换。这涉及重载解析的过程,【3】条文13.3“重载解析”,对此定义如下:1. 给定一个作为调用实参的表达式列表,及一组在调用上下文中可被调用的候选函数,重载解析是从中选择最佳调用函数的机制。这个最佳函数的选择准则是,参数的
wuhui_gdnt
·
2011-01-22 08:00
function
struct
tree
Build
Path
Constructor
Studying note of
GCC-3.4.6
source (145)
5.13. Stageafterparsing5.13.1. Preliminaries-detailofconversion5.13.1.1. DetermineappropriateconversionC++isatype-stronglanguage.However,inpractice,wealwayscanwritecodelike:“1+5.0f;”,
wuhui_gdnt
·
2011-01-15 11:00
object
function
tree
Class
Build
reference
GCC-3.4.6
源代码学习笔记(145)
5.13. 解析后阶段5.13.1. 预备知识—转换的细节5.13.1.1. 确定合适的转换C++是一个强类型语言。不过,在实践中,我们总是可以写出这样的代码:“1+5.0f;”,其中“1”是整数类型,而“5.0f”是一个浮点类型。我们甚至可以写出更惊人的代码,像这样:“a+b;”,假定“a”及“b”都是某个类的实例。这是因为编译器将为我们产生执行必要、合适转换的
wuhui_gdnt
·
2011-01-15 11:00
tree
Class
Build
reference
编译器
binding
Studying note of
GCC-3.4.6
source (144)
5.12.5.2.2.2.2. ThereturnexpressionReturnsincp_parser_simple_declaration,“;”in“SmallObjectkeyword;6071 switch(keyword)6072 { …6096 caseRID_RETURN:6097 {6098 treeexpr;
wuhui_gdnt
·
2011-01-15 11:00
GCC-3.4.6
源代码学习笔记(144)
5.12.5.2.2.2.2. Return表达式返回到cp_parser_simple_declaration,在“SmallObjectkeyword;6071 switch(keyword)6072 { …6096 caseRID_RETURN:6097 {6098 treeexpr;6099 6100 /*I
wuhui_gdnt
·
2011-01-15 11:00
function
tree
null
Constructor
optimization
returning
Studying note of
GCC-3.4.6
source (143)
5.12.5.2.2.2.1.4. FinishinstantiationNowcontinuetoprocessourtemplateinstantiationexample,insectionFront-endinitialization,wehaveseenwhenusingthe-frepocommand-lineoption,init_repowouldgeneratea.rpofi
wuhui_gdnt
·
2011-01-15 11:00
GCC-3.4.6
源代码学习笔记(143)
5.12.5.2.2.2.1.4. 完成具现现在继续我们模板具现例子的处理,在前端部分的初始化一节,我们已经看到当使用命令行选项-frepo时,init_repo会产生一个.rpo文件,或读入一个已经存在的.rpo文件。下面的repo_template_used将在对应的.rpo文件中记录该模板具现的使用,这个信息将被编译器及collect2(GCC自带的链接器)在以后使用。 instanti
wuhui_gdnt
·
2011-01-15 11:00
function
tree
Integer
delete
Build
destructor
上一页
1
2
3
4
5
6
7
8
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他