
*****************************************************************************
*                                                                           
*                      免责声明
*                                                                          
*  Sun Microsystems, Inc. 拥有与本文档中所提及技术相关
*  的知识产权。需特别指出的是（但不局限于此），这些知识
*  产权可能包括一项或多项在 http://www.sun.com/patents 
*  上列出的美国专利，以及一项或多项在美国和其它国家（地区）
*  的其它专利或待批的专利申请。Sun 明确保留可能拥有的所有
*  权利。
*
*
*  版权所有 (c) 2003 Sun Microsystems, Inc., 
*  4150 Network Circle, Santa Clara, California 95054, U.S.A. 
*  保留所有权利。
*  
*  美国政府权利 - 商业软件。政府用户应遵
*  守 Sun Microsystems, Inc. 标准许可证协
*  议和 FAR 及其补充材料的适用条款。
*  
*  须按照许可条款进行使用。
*  
*  本发行物可能包含第三方开发的材料。
*  
*  Sun、Sun Microsystems、Sun 徽标、Solaris 和 Sun[tm] ONE Studio 
*  是 Sun Microsystems, Inc. 在美国和其它国家（地区）的商标或注册
*  商标。
*  
*  本文档按“原样”提供，对所有明示或默示的
*  条件、陈述和担保，包括对适销性、特殊用
*  途的适用性或非侵权性的默示保证，均不承
*  担任何责任，除非此免责声明的适用范围在
*  法律上无效。
*  
*****************************************************************************


                            Sun Dwarf2 扩展

本文档介绍对 Dwarf2 调试格式所作
的 Sun 扩展。

----------------------------------------------------------------------------

标记

     DW_TAG_SUN_function_template (0x4201)

          本标记现用于定义 C++ 函数
          模板。（它应类似于 GNU
          扩展 DW_TAG_function_template，但由于我们
          没有该 GNU 扩展的详细资料，因此我们觉得还
          是创建我们自己的标记更为安全）。
          本标记可以获取与标准
          DW_TAG_subprogram 相同的属性。

     DW_TAG_SUN_class_template (0x4202)

          本标记现用于定义 C++ 类模
          板。（它应类似于 GNU 扩展
          DW_TAG_class_template 标记）。
          仅当在模板定义中使用了关键字
          “class”时，才能使用此标记。
          本标记的属性应与标准
          DW_TAG_class_type 相同。

     DW_TAG_SUN_struct_template (0x4203)

          本标记现用于定义 C++ 结构模
          板。（它应类似于 GNU 扩展
          DW_TAG_class_template 标记）。
          仅当在模板定义中使用了关键字
          “struct”时，才能使用本标记。
          本标记的属性应与标准
          DW_TAG_class_type 相同。

     DW_TAG_SUN_union_template (0x4204)

          本标记现用于定义 C++ 联合模
          板。（它应类似于 GNU 扩展
          DW_TAG_class_template 标记）。
          仅当在模板定义中使用了关键字
          “union”时，才能使用本标记。
          本标记的属性应与标准
          DW_TAG_class_type 相同。

     DW_TAG_SUN_virtual_inheritance (0x4205)

          本标记现用于提供 Sun C++ ABI 虚拟
          继承信息。
          本标记的属性应与标准
          DW_TAG_inheritance 相同。

     DW_TAG_SUN_codeflags (0x4206)

          本标记用于记录一个特定的布尔逻辑标志，
          该标志与当前函数中的任意多条指令相关
          联。这些指令是以函数的 low_pc 中的
          偏移来标识的。此标记仅出现在函数内。

          它具有两个有效属性。

          DW_AT_SUN_cf_kind 用于记录代码值，该值
          代表应与给定指令相关联的布尔标志。这些
          代码值定义为以 DW_ATCF_SUN_ 开头的符号。
          有关可能的标志及其含义的列表，请参见本
          文档其他地方的说明。

          DW_AT_SUN_func_offsets 用于记录应使用
          本标志标记的指令的偏移。偏移使用行程
          编码进行排序和记录。该属性值中的第一个
          数字表示从函数的 low_pc 到具有本标志的
          第一条指令的偏移。第二个数字表示第一条
          标记指令与第二条标记指令间的偏移，依此
          类推。

     DW_TAG_SUN_memop_info (0x4207)

          本信息是发给性能分析器的，用
          于标识具有所访问类型或结构成
          员的内存操作。每个标记分别表
	  示代码中一条特定内存指令的有
	  关信息。
	  
          属性有：
	  DW_AT_SUN_func_offset       无符号常量
	  DW_AT_SUN_memop_type_ref    引用
	  DW_AT_SUN_profile_id        无符号常量
	  DW_AT_SUN_memop_signature   无符号常量

	  DW_AT_SUN_func_offset 记录函数内指令的
	  偏移。

	  DW_AT_SUN_memop_type_ref 记录 DIE 引
	  用，该引用指向本内存指令当前引用的变
	  量的类型。如果当前访问的是结构成员，
	  则上述引用指向该成员的 DW_AT_member 标
	  记。

	  DW_AT_SUN_profile_id 记录性能
	  分析器系统所使用的不透明数。

	  DW_AT_SUN_memop_signature 记录
	  性能分析器系统所使用的不透明数。
	  
    DW_TAG_SUN_omp_child_func (0x4208)

	  本标记用于容纳 DW_TAG_SUN_omp_child_func 属
	  性。不能将多个同种属性附加至同一个标记。所以
 	  只有将本标记附加至某个子程序标记，它才能容纳
	  单个属性。
		
         
----------------------------------------------------------------------------

属性

     DW_AT_SUN_template (0x2201)（引用）

          可将本属性提供给代表 C++ 模板具体实例
          的任何 C++ DW_TAG_structure_type、
          DW_TAG_union_type、DW_TAG_class_type 或
          DW_TAG_subprogram 标记。本属性应具有一个
          将会引用模板定义的引用，例如，此属性应引
          用标记 DW_TAG_SUN_function_template、
          DW_TAG_SUN_class_template、
          DW_TAG_SUN_struct_template
          或 DW_TAG_SUN_union_template 中的一个。
          本属性提供来自实际 C++ 模板
          具体实例的连接，以及模板定义。
          该标记可获取与标准
          DW_TAG_class_type 相同的属性。

     DW_AT_SUN_alignment (0x2202)（无符号常量）

          可将本属性提供给任何
          DW_TAG_structure_type、DW_TAG_union_type 或
          DW_TAG_class_type 标记，只要该类型变量的缺省
          对齐方式是硬件非标准对齐。
          Sun 编译器有一条指令“#pragma pack(n)”，
          该指令可更改类型的缺省对齐方式，并
          强制采用该对齐方式来紧缩类型的字段。
          本属性的值是一个常量，表示用户
          在 #pragma pack 指令中请求的对
          齐方式，该值只能是 1、2、4 或 8。

     DW_AT_SUN_vtable (0x2203)（带符号常量）

          可在虚的 DW_TAG_class_type 上
          提供本属性，以便为该类型提供在
          虚表中的 Sun C++ ABI 偏移。其
          值为常量，表示表索引。

     DW_AT_SUN_count_guarantee (0x2204)（无符号常量）

          当 DW_TAG_pointer_type 恰好是用 C99 语
          法声明的某个形式参数的类型时，可在其上
          使用本属性。使用本属性目的是为了提供该
          指针也要引用的保证数量的元素。该
          指针实际上是指向对象数组的引用，
          而计数保证指的是保证能在该地址获
          得多少个元素。
          在 C99 中使用时，表示形参是用 C99 语
          法声明的，此语法定义该形参具有数组类
          型，且数组类型含有最低保证数量的元素。
          只能将本属性置于
          类型为 DW_TAG_formal_parameter 类型
          的 DW_TAG_pointer_type 上。
          例如：void f(int a[static 5]){}

     DW_AT_SUN_command_line (0x2205)（字符串）

          只能将本属性置于
          DW_TAG_compile_unit 上，并且其中包
          含按编译器提供的方式生成该编译单元
          （目标文件）时所用的编译行。

     DW_AT_SUN_vbase (0x2206)（带符号常量）

          本属性与 DW_AT_SUN_vtable 类似，
          但只能在 DW_TAG_inheritance 或
          DW_TAG_SUN_virtual_inheritance 上使用，
          用于表示在虚表中的偏移。

     DW_AT_SUN_compile_options (0x2207)（字符串）

          只能将本属性置于
          DW_TAG_compile_unit 上，并且其中包含
          与 Sun Stabs N_OPT stab 相同的信息，即以“;”分
          隔的一系列 name=value 模式，它们用于检测
          编译以及所生成代码的各种特性。

     DW_AT_SUN_language (0x2208)（无符号常量）

          本属性的使用方法与 DW_AT_language
          属性完全相同，但可以将其置于需要
          设置语言标志的任何标记上，以表示
          该标记现标为要使用与 DW_TAG_compile_unit 上
          语言设置不同的语言链接或语义。通常，
          当 C++ 源代码包含“extern "C" { }”
          块的使用时，您将会看到这一点。

     DW_AT_SUN_browser_file (0x2209)（字符串）

          只能将本属性置于
          DW_TAG_compile_unit 上，并且其中包含
          与 Sun Stabs N_BROWS stab 相同的信息。

     DW_AT_SUN_vtable_abi (0x2210)（无符号常量）

          只能将本属性置于
          DW_TAG_structure_type、DW_TAG_union_type 或
          DW_TAG_class_type 上，并且其中将包含该虚表
          相应的 Sun C++ 编译器虚表 ABI 版本。

     DW_AT_SUN_func_offsets (0x2211)（块）

          本属性是记录带符号 LEB 数字数组的通用
          方式。它由 DW_AT_TAG_codeflags 使用。

     DW_AT_SUN_cf_kind (0x2212)（无符号常量）

          本属性用于记录 codeflags 块的
          类型代码。参见 DW_TAG_SUN_codeflags。

     DW_AT_SUN_vtable_index (0x2213)（带符号常量）

          只能将本属性置于 C++ 虚函数的 DW_TAG_subroutine 上，
          并且其中将包含该方法相应的 Sun C++ 编译器虚表
          索引。

     DW_AT_SUN_omp_tpriv_addr (0x2214)（地址）

          这是编译器所创建的具有指针大小的变
          量的地址，目的是为了用本属性在每个
          线程上实现此变量的副本。该地址的使
          用方式依赖于实现，调试器使用它来访
          问变量在每个线程上的版本。这种机制
          链接程序和libthread 直接支持的 TLS
          变量所取代。
          “地址”类型的属性在 dwarf 中很少见。
          引用另一变量的通常方式是引用该变量
          的 DIE（标记）。但我们没有这样做，
	  这是因为在生成 dwarf 时我们手边没
          有该句柄。最好是引用 DIE，此时该引
          用将是局部 DIE 引用，而不是地址。
          而且将无需重新定位链接程序。

     DW_AT_SUN_omp_child_func (0x2215)（引用）

          本属性属于某个 DW_TAG_SUN_omp_child_func die，
	  该 die 位于某个函数 DIE 中并指向
          另一个函数 DIE，应将后者视为在第
          一个函数中具有嵌套作用域。本属性
          用来描述并行区域恰巧为 OpenMP 处
          理一部分的“概要轮廓”。具有 OpenMP 并
          行区域的原始函数将以上述标记/属性对
          中的某一个来结尾，这些组对指向将由多
 	  个线程执行的人造函数的 DIE。  

          只需在原始函数的 DW_TAG_subprogram 内
          嵌套轮廓函数的 DW_TAG_subprogram，
          便有可能实现这一点，尽管这不
          是编写源代码惯用的方式。
          但我不知道这样做是否可行。最初
          实现本属性是为了模仿 stabs 格式
          描述相同信息的方式。更改人造函数
          的实际作用域将会影响
          调试生成库和 dbx。

          由于本属性出现在 DW_TAG_SUN_omp_child_func 中，
	  因此本应称其为“DW_AT_SUN_func_ref”。
	  因而可以将此属性重用于其它目的。

     DW_AT_SUN_func_offset (0x2216)（无符号常量）

          本属性表示到函数的 low_pc 的偏移，
	  该函数包含具有本属性的标记。
	  本属性现由 DW_TAG_SUN_memop_info 使用，
	  其它标记将来也可能会使用它。
	  
     DW_AT_SUN_memop_type_ref (0x2217)（引用）

          本属性由 DW_TAG_SUN_memop_info 使用。
	  有关详细信息，参见该标记的说明。
	  
     DW_AT_SUN_profile_id  (0x2218)（无符号常量）
     
          本属性由 DW_TAG_SUN_memop_info 使用。
	  有关详细信息，参见该标记的说明。
	  
     DW_AT_SUN_memop_signature (0x2219)（无符号常量）
     
          本属性由 DW_TAG_SUN_memop_info 使用。
	  有关详细信息，参见该标记的说明。

     DW_AT_SUN_obj_dir (0x2220)（字符串）
     DW_AT_SUN_obj_file (0x2221)（字符串）

          这两个属性可应用于
          DW_TAG_compilation_unit，用于描述
          在生成 dwarf 信息时要创建的目标文件
          的位置和名称。调试器通常不需要该信息，
          但它有助于在同一目标文件的
          两个不同版本之间建立 dwarf 信息
          的相互关联。

          目录名中不能包含斜线字符，建议与
           DW_AT_comp_dir 采用相同的形式，
          即“hostname:path”或“:path”。
          在 SUN 实现中，路径应始终采用完整路径名。
          DW_AT_obj_file 不能包含任何“/”字符。
          路径名还可以是到 DW_AT_comp_dir 中
          的目录的相对路径。

     DW_AT_SUN_original_name (0x2222)（字符串）

          当原始源文件名与传送给编译器的源
	  文件不同时，本属性将被应用于编译
	  单元标记。例如，用户先将 .c 文件
	  预处理成 .i 文件，然后编译 .i 文
	  件。在这种情况下，.i 文件具有 #line 指令，
	  这些指令会致使行号信息指向原始的 .c 文
	  件。但调试器可能同时需要这两个名称方可
	  使用。如果源文件具有与此类似的两个名称，
	  则 DW_AT_name 属性将具有馈送给编译器
	  （.i 文件）的名称，而 DW_AT_SUN_original_name
	  将具有源文件（.c 文件）的原始名称。
	  相同的机制亦适用于 yacc 和 lex 文件。
	                 

----------------------------------------------------------------------------

基本类型

     DW_ATE_SUN_interval_float (0x91)

          Sun“间隔”类型允许使用本扩展。

     DW_ATE_SUN_imaginary_float (0x92)

          C99 基本“虚数”类型允许使用本
          扩展。

----------------------------------------------------------------------------

语言

     DW_LANG_SUN_Assembler (0x9001)

          本语言设置现已成为 SUN 编译器
          的显式设置，而不再使用“未知”语言
          值。有些情况表明 Sun 汇编程序可
          能会生成源级汇编调试信息，并且这
          也被认为是需要的。

----------------------------------------------------------------------------

代码标志

     这些类型代码（种类）用于在 codeflags 条
     目中定义不同种类的指令属性。
     参见

     DW_TAG_SUN_codeflags 标记用于记录函数中
     各条指令的布尔属性。每个 codeflags 标记
     都会在指令列表上设置一个特定的布尔属性。
     该列表是 DW_TAG_SUN_codeflags 标记的可能类型列表。
     这些值是 DW_TAG_SUN_codeflags 标记
     的 DW_AT_SUN_cf_kind 属性的可能值。

     注意：如果将 DW_TAG_SUN_codeflags 当作 dwarf 标准，则
     标准 dwarf ATCF 条目应从 0x01 处开始

     注意：包含“_mop_”的 cf_kind 名称是内存操作
      ([M]emory [OP]eration) 的标记符号。该信息
     用于内存访问检查功能。(Sun dbx RTC)

     DW_ATCF_SUN_mop_bitfield (0x41)

          标记可能从尚未初始化为已知值的
          内存中读取数据的位字段加载。

     DW_ATCF_SUN_mop_spill (0x42)

          标记用于将标量和浮点寄存器内容
          倾倒至栈中的读写操作。

     DW_ATCF_SUN_mop_scopy (0x43)

          本代码标志会映射到 Stabs N_PATCH 或
          N_CODETAG stabs。它用于标记结构的加
          载或存储。

     DW_ATCF_SUN_func_start (0x44)

          本代码标志会映射到 Stabs N_PATCH 或
          N_CODETAG stabs。它用于标记函数用户
          指令的开始位置（略过所有不可见函数
          设置代码和帧设置）。

     DW_ATCF_SUN_end_ctors (0x45)

          本代码标志会映射到 Stabs N_PATCH 或
          N_CODETAG stabs。它用于标记函数指令
          的开始位置（略过所有上级构造函数
          调用）。

     DW_ATCF_SUN_branch_target (0x46)

          本代码标志标记作为分支指令目标的
          指令。

     DW_ATCF_SUN_mop_stack_probe (0x47)

          本代码标志标记用于检查栈
          界的特殊内存探测指令。


----------------------------------------------------------------------------

最后更新日期：02/12/03
