[llvm] r187212 - Add a way to get the context of any particular scope.

Eric Christopher echristo at gmail.com
Fri Jul 26 10:47:33 PDT 2013


On Fri, Jul 26, 2013 at 10:33 AM, David Blaikie <dblaikie at gmail.com> wrote:
> On Fri, Jul 26, 2013 at 10:02 AM, Eric Christopher <echristo at gmail.com> wrote:
>> Author: echristo
>> Date: Fri Jul 26 12:02:36 2013
>> New Revision: 187212
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=187212&view=rev
>> Log:
>> Add a way to get the context of any particular scope.
>>
>> Modified:
>>     llvm/trunk/include/llvm/DebugInfo.h
>>     llvm/trunk/lib/IR/DebugInfo.cpp
>>
>> Modified: llvm/trunk/include/llvm/DebugInfo.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo.h?rev=187212&r1=187211&r2=187212&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/DebugInfo.h (original)
>> +++ llvm/trunk/include/llvm/DebugInfo.h Fri Jul 26 12:02:36 2013
>> @@ -187,6 +187,9 @@ namespace llvm {
>>    public:
>>      explicit DIScope(const MDNode *N = 0) : DIDescriptor (N) {}
>>
>> +    /// Gets the parent scope for this scope node or returns a
>> +    /// default constructed scope.
>> +    DIScope getContext() const;
>>      StringRef getFilename() const;
>>      StringRef getDirectory() const;
>>    };
>>
>> Modified: llvm/trunk/lib/IR/DebugInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=187212&r1=187211&r2=187212&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
>> +++ llvm/trunk/lib/IR/DebugInfo.cpp Fri Jul 26 12:02:36 2013
>> @@ -692,6 +692,31 @@ Value *DITemplateValueParameter::getValu
>>    return getField(DbgNode, 4);
>>  }
>>
>> +// If the current node has a parent scope then return that,
>> +// else return an empty scope.
>> +DIScope DIScope::getContext() const {
>
> As discussed offline, a FIXME or notes about the necessity/problems
> with some more general solution to this API might be nice.
>
>> +
>> +  if (isType())
>> +    return DIType(DbgNode).getContext();
>> +
>> +  if (isSubprogram())
>> +    return DISubprogram(DbgNode).getContext();
>> +
>> +  if (isLexicalBlock())
>> +    return DILexicalBlock(DbgNode).getContext();
>> +
>> +  if (isLexicalBlockFile())
>> +    return DILexicalBlockFile(DbgNode).getContext();
>> +
>> +  if (isNameSpace())
>> +    return DINameSpace(DbgNode).getContext();
>> +
>> +  if (isFile() || isCompileUnit())
>
> Given that this 'if' and the trailing block are the same, this seems
> unnecessary, perhaps just ending with:
>
> assert(isFile() || isCompileUnit());
> return DIScope();
>
> (technically different behavior from your original code if there are
> other DIScope types or if you call getContext() on a null DIScope (in
> which case I assume all the is* functions return false, which would
> lead you to the final unconditional return in your version and an
> assert failure in mine)
>
> would suit?
>

Yup, good idea:

M lib/IR/DebugInfo.cpp
Committed r187224

-eric

>> +    return DIScope();
>> +
>> +  return DIScope();
>> +}
>> +
>>  StringRef DIScope::getFilename() const {
>>    if (!DbgNode)
>>      return StringRef();
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list