Eli Bendersky
2011-Mar-07 12:16 UTC
[LLVMdev] DW_TAG_lexical_block structure in debug information
Hello,
The documentation for debug information
(http://llvm.org/docs/SourceLevelDebugging.html) says the structure of
block descriptors metadata is:
!3 = metadata !{
i32, ;; Tag = 11 + LLVMDebugVersion (DW_TAG_lexical_block)
metadata,;; Reference to context descriptor
i32, ;; Line number
i32 ;; Column number
}
However, looking at the generated metadata, there are 2 extra fields
not documented here. From the source code it appears to be a link to
the function holding the block, and a unique integer ID:
DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
unsigned Line, unsigned Col) {
// Defeat MDNode uniqing for lexical blocks by using unique id.
static unsigned int unique_id = 0;
Value *Elts[] = {
GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
Scope,
ConstantInt::get(Type::getInt32Ty(VMContext), Line),
ConstantInt::get(Type::getInt32Ty(VMContext), Col),
File,
ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
};
return DILexicalBlock(MDNode::get(VMContext, &Elts[0],
array_lengthof(Elts)));
}
Is this an error in the documentation?
Thanks in advance,
Eli
Devang Patel
2011-Mar-08 16:30 UTC
[LLVMdev] DW_TAG_lexical_block structure in debug information
On Mar 7, 2011, at 4:16 AM, Eli Bendersky wrote:> Hello, > > The documentation for debug information > (http://llvm.org/docs/SourceLevelDebugging.html) says the structure of > block descriptors metadata is: > > !3 = metadata !{ > i32, ;; Tag = 11 + LLVMDebugVersion (DW_TAG_lexical_block) > metadata,;; Reference to context descriptor > i32, ;; Line number > i32 ;; Column number > } > > However, looking at the generated metadata, there are 2 extra fields > not documented here. From the source code it appears to be a link to > the function holding the block, and a unique integer ID: > > DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File, > unsigned Line, unsigned Col) { > // Defeat MDNode uniqing for lexical blocks by using unique id. > static unsigned int unique_id = 0; > Value *Elts[] = { > GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), > Scope, > ConstantInt::get(Type::getInt32Ty(VMContext), Line), > ConstantInt::get(Type::getInt32Ty(VMContext), Col), > File, > ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++) > }; > return DILexicalBlock(MDNode::get(VMContext, &Elts[0], array_lengthof(Elts))); > } > > Is this an error in the documentation? >These two fields were added to support scopes inside template functions (r107919). I updated the docs today in r127249. Thanks! - Devang