collect end line number for scope

Hi All,

int global;
int func( int t)
{
//scope 1
{

} <-----
return x;
}

For the above code, i want to collect endline (indicated by <—) for the scope. Can we get this information from the Dwarf Information in llvm 2.9 ?

Thanks & Regards,
Pankaj

I don’t know about 2.9 in specific, but current top of tree will get you that information.

-eric

What do you mean by “current top of tree”?

Pankaj

Hi,

He is referring to current SVN head.

Regards,
Alex

Hi,

My problem definition is to collect “end line” for each scope (i.e. start and end line for a scope). I need to dump this information while emitting target code for an architecture. Though I understand that scoping details are not modeled in LLVM. Reference: http://llvm.org/docs/SourceLevelDebugging.html#format_common_lifetime

There are 2 classes I am referring, viz, DIScope and DbgScope.
I am also not sure on the approach.

Regards,
Pankaj

You have misread this link. We use metadata attached to instructions to model scopes. Look for DW_TAG_lexical_block in the output. I’m working on this area at the moment to make it more precise, but for the general case this should work just fine.

-eric

Pankaj,

Hi,

The link and the information shared was helpful.

I will make my problem definition more clear.
While I am “asm printing” target code, I also want to emit scope related information.
Scope related information includes,

  • for each scope, start line, end line, start column, end column
    and
  • scope heirarchy.
    As scope is delimited by “{” and “}” (for an input C/C++ code), hence wanted to collect “endline” for scope.
    When I went through the “.ll” emitted by llc, i could find the “startline” in metadata.

For this I could think of 2 approaches

  1. Create a pass in llvm, to collect this information from the llvm instructions, by simply traversing them.
    Identifying line number for each instruction and checking on the lexical block it points to. Also would maintain the parent/child lexical block relation using metadata information.
    My “startline” is least line number associated with lexical block, and “endline” number is max line number associated with lexical block.
  2. While “asm printing”, traverse through the machine instruction and collect the information in similar way as 1.

I am not sure whether I should collect it from Clang AST nodes.

Regards,
Pankaj

Pankaj,

If you want to decorate MachineInstrs then for the end of scope you’re not looking at “}” but instead you’re looking at last machine instruction in that scope. Now, if you want to find out start and end MachineInstrs for a lexical scope (and corresponding line numbers) then see CodeGen/LexicalScopes pass. It collects lexical scope information and maps MIs to respective lexical scopes.

Hi,

I had a look at CodeGen/LexicalScopes and decided to use it. I contains almost everything I want (other attributes can be easily extracted).
As I am using llvm 2.9 and can’t migrate to the latest llvm as of now, so I am using the LexicalScopes information while printing.

Thanks.

Pankaj