llvm libLLVMCore源码分析 22

编程入门 行业动态 更新时间:2024-10-06 12:22:08

llvm libLLVMCore<a href=https://www.elefans.com/category/jswz/34/1770099.html style=源码分析 22"/>

llvm libLLVMCore源码分析 22

源码路径

llvm\include\llvm\IR\Metadata.h

llvm\include\llvm\IR\DebugInfoMetadata.h

DebugInfoMetadata

DebugInfoMetadata是特殊的元数据类型,用于调试:

除了MDTuple,其余都是 DebugInfoMetadata。

DILocation

DILocation表示源代码中的位置。用第1个Operand表示范围,类型为DILocalScope;用第2个Operand表示函数Inline的位置,只在该处位置存在函数inline的时候存在。

class DILocation : public MDNode {Metadata *getRawScope() const { return getOperand(0); }DILocalScope *getScope() const { return cast<DILocalScope>(getRawScope()); }Metadata *getRawInlinedAt() const {if (getNumOperands() == 2)return getOperand(1);return nullptr;}DILocation *getInlinedAt() const {return cast_or_null<DILocation>(getRawInlinedAt());}
};

IR示例如下:

!0 = !DILocation(line: 2900, column: 42, scope: !1, inlinedAt: !2)

DIExpression

表示DWARF Expression,用Operand从左往右依次存储DWARF Expression的操作数和操作符。被用到llvm debug intrinsic中(如llvm.dbg.declare and llvm.dbg.value)。

当前支持的操作符:

  • DW_OP_deref:解引用expression stack的栈顶。
  • DW_OP_plus :从expression stack中pop两个元素,相加后把结果压栈。
  • DW_OP_minus :从expression stack中pop两个元素,相减后把结果压栈。
  • DW_OP_plus_uconst, 93:表达式加上93
  • DW_OP_LLVM_fragment,16,8 :varible frament在表达式中的offset为16,size为8
  • DW_OP_LLVM_convert, 16, DW_ATE_signed:expression stack栈顶元素转换为16bit,DW_ATE_signed类型。
  • DW_OP_LLVM_tag_offset, tag_offset:offset偏移处的memory tag应用到指针。
  • DW_OP_swap:交换expression stack中的两个元素。
  • DW_OP_xderef:expression stack的栈顶元素作为地址,expression stack的第2个元素作为addrspace。
  • DW_OP_stack_value:标记一个常量。
  • DW_OP_LLVM_entry_value,N:在MIR中使用。
  • DW_OP_LLVM_arg,N:用于引用多个值的intrinsics。
  • DW_OP_breg:表示指定寄存器中的有符号的offset。
  • DW_OP_push_object_address :将对象的地址压栈。
  • DW_OP_over:复制expression stack中的第二个entry。
  • DW_OP_LLVM_implicit_pointer :表达一个解引用的值。

IR示例如下:

IR for "*ptr = 4;"
--------------
call void @llvm.dbg.value(metadata i32 4, metadata !17, metadata !20)
!17 = !DILocalVariable(name: "ptr1", scope: !12, file: !3, line: 5,type: !18)
!18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !19, size: 64)
!19 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!20 = !DIExpression(DW_OP_LLVM_implicit_pointer))IR for "**ptr = 4;"
--------------
call void @llvm.dbg.value(metadata i32 4, metadata !17, metadata !21)
!17 = !DILocalVariable(name: "ptr1", scope: !12, file: !3, line: 5,type: !18)
!18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !19, size: 64)
!19 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !20, size: 64)
!20 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!21 = !DIExpression(DW_OP_LLVM_implicit_pointer,DW_OP_LLVM_implicit_pointer))

DIGlobalVariableExpression 

DIGlobalVariableExpression,表示一对(DIGlobalVariable,DIExpression),用第1个Operand表示DIGlobalVariable,用第2个操作数表示DIExpression。

class DIGlobalVariableExpression : public MDNode {Metadata *getRawVariable() const { return getOperand(0); }DIGlobalVariable *getVariable() const {return cast_or_null<DIGlobalVariable>(getRawVariable());}Metadata *getRawExpression() const { return getOperand(1); }DIExpression *getExpression() const {return cast<DIExpression>(getRawExpression());}
};

IR示例如下:

@lower = global i32, !dbg !0
@upper = global i32, !dbg !1
!0 = !DIGlobalVariableExpression(var: !2,expr: !DIExpression(DW_OP_LLVM_fragment, 0, 32))
!1 = !DIGlobalVariableExpression(var: !2,expr: !DIExpression(DW_OP_LLVM_fragment, 32, 32))
!2 = !DIGlobalVariable(name: "split64", linkageName: "split64", scope: !3,file: !4, line: 8, type: !5, declaration: !6)

 DIMacroNode

表示DWARF MACRO信息(DW_MACINFO_*),有2个子类:DIMacro,DIMacroFile。

DlMacro

表示宏的定义和去定义,用第1个Operand存储名字,第2个Operand存储值:

class DIMacro : public DIMacroNode {StringRef getName() const { return getStringOperand(0); }StringRef getValue() const { return getStringOperand(1); }MDString *getRawName() const { return getOperandAs<MDString>(0); }MDString *getRawValue() const { return getOperandAs<MDString>(1); }
};

IR示例如下:

!2 = !DIMacro(macinfo: DW_MACINFO_define, line: 7, name: "foo(x)",value: "((x) + 1)")
!3 = !DIMacro(macinfo: DW_MACINFO_undef, line: 30, name: "foo")

DIMacroFile

表示include方式引入的宏,用第1个Operand存储include的DIFile,第2个保存包含的DIMacroNodeArray(一组DlMacro和DIMacroFile):

class DIMacroFile : public DIMacroNode {DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }DIMacroNodeArray getElements() const {return cast_or_null<MDTuple>(getRawElements());}Metadata *getRawFile() const { return getOperand(0); }Metadata *getRawElements() const { return getOperand(1); }
};

IR示例如下:

!2 = !DIMacroFile(macinfo: DW_MACINFO_start_file, line: 7, file: !2,nodes: !3)

更多推荐

llvm libLLVMCore源码分析 22

本文发布于:2024-03-14 05:13:36,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1735707.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:源码   llvm   libLLVMCore

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!