mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-22 13:05:52 -04:00

*** to conform to clang-format’s LLVM style. This kind of mass change has *** two obvious implications: Firstly, merging this particular commit into a downstream fork may be a huge effort. Alternatively, it may be worth merging all changes up to this commit, performing the same reformatting operation locally, and then discarding the merge for this particular commit. The commands used to accomplish this reformatting were as follows (with current working directory as the root of the repository): find . \( -iname "*.c" -or -iname "*.cpp" -or -iname "*.h" -or -iname "*.mm" \) -exec clang-format -i {} + find . -iname "*.py" -exec autopep8 --in-place --aggressive --aggressive {} + ; The version of clang-format used was 3.9.0, and autopep8 was 1.2.4. Secondly, “blame” style tools will generally point to this commit instead of a meaningful prior commit. There are alternatives available that will attempt to look through this change and find the appropriate prior commit. YMMV. llvm-svn: 280751
59 lines
2.2 KiB
Python
59 lines
2.2 KiB
Python
#!/usr/bin/python
|
|
|
|
import lldb
|
|
import shlex
|
|
|
|
|
|
@lldb.command("shadow")
|
|
def check_shadow_command(debugger, command, exe_ctx, result, dict):
|
|
'''Check the currently selected stack frame for shadowed variables'''
|
|
process = exe_ctx.GetProcess()
|
|
state = process.GetState()
|
|
if state != lldb.eStateStopped:
|
|
print >>result, "process must be stopped, state is %s" % lldb.SBDebugger.StateAsCString(
|
|
state)
|
|
return
|
|
frame = exe_ctx.GetFrame()
|
|
if not frame:
|
|
print >>result, "invalid frame"
|
|
return
|
|
# Parse command line args
|
|
command_args = shlex.split(command)
|
|
# TODO: add support for using arguments that are passed to this command...
|
|
|
|
# Make a dictionary of variable name to "SBBlock and SBValue"
|
|
shadow_dict = {}
|
|
|
|
num_shadowed_variables = 0
|
|
# Get the deepest most block from the current frame
|
|
block = frame.GetBlock()
|
|
# Iterate through the block and all of its parents
|
|
while block.IsValid():
|
|
# Get block variables from the current block only
|
|
block_vars = block.GetVariables(frame, True, True, True, 0)
|
|
# Iterate through all variables in the current block
|
|
for block_var in block_vars:
|
|
# Since we can have multiple shadowed variables, we our variable
|
|
# name dictionary to have an array or "block + variable" pairs so
|
|
# We can correctly print out all shadowed variables and whow which
|
|
# blocks they come from
|
|
block_var_name = block_var.GetName()
|
|
if block_var_name in shadow_dict:
|
|
shadow_dict[block_var_name].append(block_var)
|
|
else:
|
|
shadow_dict[block_var_name] = [block_var]
|
|
# Get the parent block and continue
|
|
block = block.GetParent()
|
|
|
|
num_shadowed_variables = 0
|
|
if shadow_dict:
|
|
for name in shadow_dict.keys():
|
|
shadow_vars = shadow_dict[name]
|
|
if len(shadow_vars) > 1:
|
|
print '"%s" is shadowed by the following declarations:' % (name)
|
|
num_shadowed_variables += 1
|
|
for shadow_var in shadow_vars:
|
|
print >>result, str(shadow_var.GetDeclaration())
|
|
if num_shadowed_variables == 0:
|
|
print >>result, 'no variables are shadowed'
|