[PATCH] D83731: Add Debug Info Size to Symbol Status
This revision was automatically updated to reflect the committed changes. Closed by commit rG986e3af53bfe: Add Debug Info Size to Symbol Status (authored by aelitashen, committed by Walter Erquinigo wall...@fb.com). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 Files: clang/tools/clang-format/git-clang-format lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py lldb/test/API/tools/lldb-vscode/module/Makefile lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py lldb/tools/lldb-vscode/JSONUtils.cpp Index: lldb/tools/lldb-vscode/JSONUtils.cpp === --- lldb/tools/lldb-vscode/JSONUtils.cpp +++ lldb/tools/lldb-vscode/JSONUtils.cpp @@ -7,6 +7,8 @@ //===--===// #include +#include +#include #include "llvm/ADT/Optional.h" #include "llvm/Support/FormatAdapters.h" @@ -327,6 +329,50 @@ return llvm::json::Value(std::move(object)); } +static uint64_t GetDebugInfoSizeInSection(lldb::SBSection section) { + uint64_t debug_info_size = 0; + llvm::StringRef section_name(section.GetName()); + if (section_name.startswith(".debug") || section_name.startswith("__debug") || + section_name.startswith(".apple") || section_name.startswith("__apple")) +debug_info_size += section.GetFileByteSize(); + size_t num_sub_sections = section.GetNumSubSections(); + for (size_t i = 0; i < num_sub_sections; i++) { +debug_info_size += +GetDebugInfoSizeInSection(section.GetSubSectionAtIndex(i)); + } + return debug_info_size; +} + +static uint64_t GetDebugInfoSize(lldb::SBModule module) { + uint64_t debug_info_size = 0; + size_t num_sections = module.GetNumSections(); + for (size_t i = 0; i < num_sections; i++) { +debug_info_size += GetDebugInfoSizeInSection(module.GetSectionAtIndex(i)); + } + return debug_info_size; +} + +static std::string ConvertDebugInfoSizeToString(uint64_t debug_info) { + std::ostringstream oss; + oss << " ("; + oss << std::fixed << std::setprecision(1); + + if (debug_info < 1024) { +oss << debug_info << "B"; + } else if (debug_info < 1024 * 1024) { +double kb = double(debug_info) / 1024.0; +oss << kb << "KB"; + } else if (debug_info < 1024 * 1024 * 1024) { +double mb = double(debug_info) / (1024.0 * 1024.0); +oss << mb << "MB"; + } else { +double gb = double(debug_info) / (1024.0 * 1024.0 * 1024.0); +oss << gb << "GB"; +; + } + oss << ")"; + return oss.str(); +} llvm::json::Value CreateModule(lldb::SBModule ) { llvm::json::Object object; if (!module.IsValid()) @@ -339,9 +385,15 @@ std::string module_path(module_path_arr); object.try_emplace("path", module_path); if (module.GetNumCompileUnits() > 0) { -object.try_emplace("symbolStatus", "Symbols loaded."); +std::string symbol_str = "Symbols loaded."; +uint64_t debug_info = GetDebugInfoSize(module); +if (debug_info > 0) { + symbol_str += ConvertDebugInfoSizeToString(debug_info); +} +object.try_emplace("symbolStatus", symbol_str); char symbol_path_arr[PATH_MAX]; -module.GetSymbolFileSpec().GetPath(symbol_path_arr, sizeof(symbol_path_arr)); +module.GetSymbolFileSpec().GetPath(symbol_path_arr, + sizeof(symbol_path_arr)); std::string symbol_path(symbol_path_arr); object.try_emplace("symbolFilePath", symbol_path); } else { @@ -352,8 +404,9 @@ object.try_emplace("addressRange", loaded_addr); std::string version_str; uint32_t version_nums[3]; - uint32_t num_versions = module.GetVersion(version_nums, sizeof(version_nums)/sizeof(uint32_t)); - for (uint32_t i=0; ihttps://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -#======# - -r""" -clang-format git integration - - -This file provides a clang-format integration for git. Put it somewhere in your -path and ensure that it is executable. Then, "git clang-format" will invoke -clang-format on the changes in current files or a specific commit. - -For further details, run: -git clang-format -h - -Requires Python 2.7 or Python 3 -""" - -from __future__ import absolute_import, division, print_function -import argparse -import collections -import contextlib -import errno -import os -import re -import subprocess -import sys - -usage = 'git clang-format [OPTIONS] [] [] [--] [...]' - -desc = ''' -If zero or one commits are given, run clang-format on all lines that differ -between the working directory and , which defaults to HEAD. Changes are -only applied to the working directory. - -If two commits are given (requires --diff), run clang-format on all lines in the -second that differ from the first . - -The
[PATCH] D83731: Add Debug Info Size to Symbol Status
aelitashen updated this revision to Diff 280261. aelitashen added a comment. Fix run_test to cover every system case and attributes Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 Files: clang/tools/clang-format/git-clang-format lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py lldb/test/API/tools/lldb-vscode/module/Makefile lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py lldb/tools/lldb-vscode/JSONUtils.cpp Index: lldb/tools/lldb-vscode/JSONUtils.cpp === --- lldb/tools/lldb-vscode/JSONUtils.cpp +++ lldb/tools/lldb-vscode/JSONUtils.cpp @@ -7,6 +7,8 @@ //===--===// #include +#include +#include #include "llvm/ADT/Optional.h" #include "llvm/Support/FormatAdapters.h" @@ -327,6 +329,50 @@ return llvm::json::Value(std::move(object)); } +static uint64_t GetDebugInfoSizeInSection(lldb::SBSection section) { + uint64_t debug_info_size = 0; + llvm::StringRef section_name(section.GetName()); + if (section_name.startswith(".debug") || section_name.startswith("__debug") || + section_name.startswith(".apple") || section_name.startswith("__apple")) +debug_info_size += section.GetFileByteSize(); + size_t num_sub_sections = section.GetNumSubSections(); + for (size_t i = 0; i < num_sub_sections; i++) { +debug_info_size += +GetDebugInfoSizeInSection(section.GetSubSectionAtIndex(i)); + } + return debug_info_size; +} + +static uint64_t GetDebugInfoSize(lldb::SBModule module) { + uint64_t debug_info_size = 0; + size_t num_sections = module.GetNumSections(); + for (size_t i = 0; i < num_sections; i++) { +debug_info_size += GetDebugInfoSizeInSection(module.GetSectionAtIndex(i)); + } + return debug_info_size; +} + +static std::string ConvertDebugInfoSizeToString(uint64_t debug_info) { + std::ostringstream oss; + oss << " ("; + oss << std::fixed << std::setprecision(1); + + if (debug_info < 1024) { +oss << debug_info << "B"; + } else if (debug_info < 1024 * 1024) { +double kb = double(debug_info) / 1024.0; +oss << kb << "KB"; + } else if (debug_info < 1024 * 1024 * 1024) { +double mb = double(debug_info) / (1024.0 * 1024.0); +oss << mb << "MB"; + } else { +double gb = double(debug_info) / (1024.0 * 1024.0 * 1024.0); +oss << gb << "GB"; +; + } + oss << ")"; + return oss.str(); +} llvm::json::Value CreateModule(lldb::SBModule ) { llvm::json::Object object; if (!module.IsValid()) @@ -339,9 +385,15 @@ std::string module_path(module_path_arr); object.try_emplace("path", module_path); if (module.GetNumCompileUnits() > 0) { -object.try_emplace("symbolStatus", "Symbols loaded."); +std::string symbol_str = "Symbols loaded."; +uint64_t debug_info = GetDebugInfoSize(module); +if (debug_info > 0) { + symbol_str += ConvertDebugInfoSizeToString(debug_info); +} +object.try_emplace("symbolStatus", symbol_str); char symbol_path_arr[PATH_MAX]; -module.GetSymbolFileSpec().GetPath(symbol_path_arr, sizeof(symbol_path_arr)); +module.GetSymbolFileSpec().GetPath(symbol_path_arr, + sizeof(symbol_path_arr)); std::string symbol_path(symbol_path_arr); object.try_emplace("symbolFilePath", symbol_path); } else { @@ -352,8 +404,9 @@ object.try_emplace("addressRange", loaded_addr); std::string version_str; uint32_t version_nums[3]; - uint32_t num_versions = module.GetVersion(version_nums, sizeof(version_nums)/sizeof(uint32_t)); - for (uint32_t i=0; ihttps://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -#======# - -r""" -clang-format git integration - - -This file provides a clang-format integration for git. Put it somewhere in your -path and ensure that it is executable. Then, "git clang-format" will invoke -clang-format on the changes in current files or a specific commit. - -For further details, run: -git clang-format -h - -Requires Python 2.7 or Python 3 -""" - -from __future__ import absolute_import, division, print_function -import argparse -import collections -import contextlib -import errno -import os -import re -import subprocess -import sys - -usage = 'git clang-format [OPTIONS] [] [] [--] [...]' - -desc = ''' -If zero or one commits are given, run clang-format on all lines that differ -between the working directory and , which defaults to HEAD. Changes are -only applied to the working directory. - -If two commits are given (requires --diff), run clang-format on all lines in the -second that differ from the first . - -The following git-config settings set the default of the corresponding option: -
[PATCH] D83731: Add Debug Info Size to Symbol Status
clayborg added inline comments. Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:55-61 +active_modules = self.vscode.get_active_modules() +program_module = active_modules[program_basename] +self.assertEqual(program_basename, program_module['name']) +self.assertEqual(program, program_module['path']) +self.assertIn('symbolFilePath', program_module) +self.assertEqual(symbols_path, program_module['symbolFilePath']) +self.assertIn('addressRange', program_module) aelitashen wrote: > clayborg wrote: > > Unindent everything after the self.waitUntil()? Otherwise we are not > > testing the program, symbolFilePath and addressRange on symbols with size. > When unindenting these codes, the dsym test for darwin fails as the symbol > paths don't match. One is using dysm path, one is using a.out.path. Then we need to fix this function so that it does work. One thing to note in the dSYM case: dSYM files are bundles which means it is a directory that contains a file within it. So you might specify "/tmp/a.out.dSYM" as the path, but end up with "/tmp/a.out.dSYM/Context/Resources/DWARF/a.out" as the symbol path. So you could switch the symbol file path to use assertIn: ``` self.assertIn(symbols_path, program_module['symbolFilePath']) ``` Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D83731: Add Debug Info Size to Symbol Status
aelitashen marked an inline comment as done. aelitashen added inline comments. Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:55-61 +active_modules = self.vscode.get_active_modules() +program_module = active_modules[program_basename] +self.assertEqual(program_basename, program_module['name']) +self.assertEqual(program, program_module['path']) +self.assertIn('symbolFilePath', program_module) +self.assertEqual(symbols_path, program_module['symbolFilePath']) +self.assertIn('addressRange', program_module) clayborg wrote: > Unindent everything after the self.waitUntil()? Otherwise we are not testing > the program, symbolFilePath and addressRange on symbols with size. When unindenting these codes, the dsym test for darwin fails as the symbol paths don't match. One is using dysm path, one is using a.out.path. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D83731: Add Debug Info Size to Symbol Status
clayborg requested changes to this revision. clayborg added a comment. This revision now requires changes to proceed. Looks like there is an indentation issue in the test. See inline comments. Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:55-61 +active_modules = self.vscode.get_active_modules() +program_module = active_modules[program_basename] +self.assertEqual(program_basename, program_module['name']) +self.assertEqual(program, program_module['path']) +self.assertIn('symbolFilePath', program_module) +self.assertEqual(symbols_path, program_module['symbolFilePath']) +self.assertIn('addressRange', program_module) Unindent everything after the self.waitUntil()? Otherwise we are not testing the program, symbolFilePath and addressRange on symbols with size. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D83731: Add Debug Info Size to Symbol Status
aelitashen updated this revision to Diff 279936. aelitashen added a comment. Fix the accidentally removed test contents Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 Files: clang/tools/clang-format/git-clang-format lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py lldb/tools/lldb-vscode/JSONUtils.cpp Index: lldb/tools/lldb-vscode/JSONUtils.cpp === --- lldb/tools/lldb-vscode/JSONUtils.cpp +++ lldb/tools/lldb-vscode/JSONUtils.cpp @@ -7,6 +7,8 @@ //===--===// #include +#include +#include #include "llvm/ADT/Optional.h" #include "llvm/Support/FormatAdapters.h" @@ -327,6 +329,50 @@ return llvm::json::Value(std::move(object)); } +static uint64_t GetDebugInfoSizeInSection(lldb::SBSection section) { + uint64_t debug_info_size = 0; + llvm::StringRef section_name(section.GetName()); + if (section_name.startswith(".debug") || section_name.startswith("__debug") || + section_name.startswith(".apple") || section_name.startswith("__apple")) +debug_info_size += section.GetFileByteSize(); + size_t num_sub_sections = section.GetNumSubSections(); + for (size_t i = 0; i < num_sub_sections; i++) { +debug_info_size += +GetDebugInfoSizeInSection(section.GetSubSectionAtIndex(i)); + } + return debug_info_size; +} + +static uint64_t GetDebugInfoSize(lldb::SBModule module) { + uint64_t debug_info_size = 0; + size_t num_sections = module.GetNumSections(); + for (size_t i = 0; i < num_sections; i++) { +debug_info_size += GetDebugInfoSizeInSection(module.GetSectionAtIndex(i)); + } + return debug_info_size; +} + +static std::string ConvertDebugInfoSizeToString(uint64_t debug_info) { + std::ostringstream oss; + oss << " ("; + oss << std::fixed << std::setprecision(1); + + if (debug_info < 1024) { +oss << debug_info << "B"; + } else if (debug_info < 1024 * 1024) { +double kb = double(debug_info) / 1024.0; +oss << kb << "KB"; + } else if (debug_info < 1024 * 1024 * 1024) { +double mb = double(debug_info) / (1024.0 * 1024.0); +oss << mb << "MB"; + } else { +double gb = double(debug_info) / (1024.0 * 1024.0 * 1024.0); +oss << gb << "GB"; +; + } + oss << ")"; + return oss.str(); +} llvm::json::Value CreateModule(lldb::SBModule ) { llvm::json::Object object; if (!module.IsValid()) @@ -339,9 +385,15 @@ std::string module_path(module_path_arr); object.try_emplace("path", module_path); if (module.GetNumCompileUnits() > 0) { -object.try_emplace("symbolStatus", "Symbols loaded."); +std::string symbol_str = "Symbols loaded."; +uint64_t debug_info = GetDebugInfoSize(module); +if (debug_info > 0) { + symbol_str += ConvertDebugInfoSizeToString(debug_info); +} +object.try_emplace("symbolStatus", symbol_str); char symbol_path_arr[PATH_MAX]; -module.GetSymbolFileSpec().GetPath(symbol_path_arr, sizeof(symbol_path_arr)); +module.GetSymbolFileSpec().GetPath(symbol_path_arr, + sizeof(symbol_path_arr)); std::string symbol_path(symbol_path_arr); object.try_emplace("symbolFilePath", symbol_path); } else { @@ -352,8 +404,9 @@ object.try_emplace("addressRange", loaded_addr); std::string version_str; uint32_t version_nums[3]; - uint32_t num_versions = module.GetVersion(version_nums, sizeof(version_nums)/sizeof(uint32_t)); - for (uint32_t i=0; ihttps://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -#======# - -r""" -clang-format git integration - - -This file provides a clang-format integration for git. Put it somewhere in your -path and ensure that it is executable. Then, "git clang-format" will invoke -clang-format on the changes in current files or a specific commit. - -For further details, run: -git clang-format -h - -Requires Python 2.7 or Python 3 -""" - -from __future__ import absolute_import, division, print_function -import argparse -import collections -import contextlib -import errno -import os -import re -import subprocess -import sys - -usage = 'git clang-format [OPTIONS] [] [] [--] [...]' - -desc = ''' -If zero or one commits are given, run clang-format on all lines that differ -between the working directory and , which defaults to HEAD. Changes are -only applied to the working directory. - -If two commits are given (requires --diff), run clang-format on all lines in the -second that differ from the first . - -The following git-config settings set the default of the corresponding option: - clangFormat.binary - clangFormat.commit - clangFormat.extensions -
[PATCH] D83731: Add Debug Info Size to Symbol Status
clayborg accepted this revision. clayborg added a comment. This revision is now accepted and ready to land. Looks good! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D83731: Add Debug Info Size to Symbol Status
aelitashen updated this revision to Diff 279351. aelitashen added a comment. Add a white space in Symbols loaded info. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 Files: clang/tools/clang-format/git-clang-format lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py lldb/tools/lldb-vscode/JSONUtils.cpp Index: lldb/tools/lldb-vscode/JSONUtils.cpp === --- lldb/tools/lldb-vscode/JSONUtils.cpp +++ lldb/tools/lldb-vscode/JSONUtils.cpp @@ -7,6 +7,8 @@ //===--===// #include +#include +#include #include "llvm/ADT/Optional.h" #include "llvm/Support/FormatAdapters.h" @@ -327,6 +329,50 @@ return llvm::json::Value(std::move(object)); } +static uint64_t GetDebugInfoSizeInSection(lldb::SBSection section) { + uint64_t debug_info_size = 0; + llvm::StringRef section_name(section.GetName()); + if (section_name.startswith(".debug") || section_name.startswith("__debug") || + section_name.startswith(".apple") || section_name.startswith("__apple")) +debug_info_size += section.GetFileByteSize(); + size_t num_sub_sections = section.GetNumSubSections(); + for (size_t i = 0; i < num_sub_sections; i++) { +debug_info_size += +GetDebugInfoSizeInSection(section.GetSubSectionAtIndex(i)); + } + return debug_info_size; +} + +static uint64_t GetDebugInfoSize(lldb::SBModule module) { + uint64_t debug_info_size = 0; + size_t num_sections = module.GetNumSections(); + for (size_t i = 0; i < num_sections; i++) { +debug_info_size += GetDebugInfoSizeInSection(module.GetSectionAtIndex(i)); + } + return debug_info_size; +} + +static std::string ConvertDebugInfoSizeToString(uint64_t debug_info) { + std::ostringstream oss; + oss << " ("; + oss << std::fixed << std::setprecision(1); + + if (debug_info < 1024) { +oss << debug_info << "B"; + } else if (debug_info < 1024 * 1024) { +double kb = double(debug_info) / 1024.0; +oss << kb << "KB"; + } else if (debug_info < 1024 * 1024 * 1024) { +double mb = double(debug_info) / (1024.0 * 1024.0); +oss << mb << "MB"; + } else { +double gb = double(debug_info) / (1024.0 * 1024.0 * 1024.0); +oss << gb << "GB"; +; + } + oss << ")"; + return oss.str(); +} llvm::json::Value CreateModule(lldb::SBModule ) { llvm::json::Object object; if (!module.IsValid()) @@ -339,9 +385,15 @@ std::string module_path(module_path_arr); object.try_emplace("path", module_path); if (module.GetNumCompileUnits() > 0) { -object.try_emplace("symbolStatus", "Symbols loaded."); +std::string symbol_str = "Symbols loaded."; +uint64_t debug_info = GetDebugInfoSize(module); +if (debug_info > 0) { + symbol_str += ConvertDebugInfoSizeToString(debug_info); +} +object.try_emplace("symbolStatus", symbol_str); char symbol_path_arr[PATH_MAX]; -module.GetSymbolFileSpec().GetPath(symbol_path_arr, sizeof(symbol_path_arr)); +module.GetSymbolFileSpec().GetPath(symbol_path_arr, + sizeof(symbol_path_arr)); std::string symbol_path(symbol_path_arr); object.try_emplace("symbolFilePath", symbol_path); } else { @@ -352,8 +404,9 @@ object.try_emplace("addressRange", loaded_addr); std::string version_str; uint32_t version_nums[3]; - uint32_t num_versions = module.GetVersion(version_nums, sizeof(version_nums)/sizeof(uint32_t)); - for (uint32_t i=0; ihttps://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -#======# - -r""" -clang-format git integration - - -This file provides a clang-format integration for git. Put it somewhere in your -path and ensure that it is executable. Then, "git clang-format" will invoke -clang-format on the changes in current files or a specific commit. - -For further details, run: -git clang-format -h - -Requires Python 2.7 or Python 3 -""" - -from __future__ import absolute_import, division, print_function -import argparse -import collections -import contextlib -import errno -import os -import re -import subprocess -import sys - -usage = 'git clang-format [OPTIONS] [] [] [--] [...]' - -desc = ''' -If zero or one commits are given, run clang-format on all lines that differ -between the working directory and , which defaults to HEAD. Changes are -only applied to the working directory. - -If two commits are given (requires --diff), run clang-format on all lines in the -second that differ from the first . - -The following git-config settings set the default of the corresponding option: - clangFormat.binary - clangFormat.commit - clangFormat.extensions -
[PATCH] D83731: Add Debug Info Size to Symbol Status
clayborg requested changes to this revision. clayborg added a comment. This revision now requires changes to proceed. Just a space before the '(' of the debug info size. Comment at: lldb/tools/lldb-vscode/JSONUtils.cpp:357 + std::ostringstream oss; + oss << "("; + oss << std::fixed << std::setprecision(1); Need as space before the '(' character as we append this string to the "Symbols loaded." string. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D83731: Add Debug Info Size to Symbol Status
aelitashen updated this revision to Diff 279303. aelitashen added a comment. Remove white space for test_module_event Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 Files: clang/tools/clang-format/git-clang-format lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py lldb/tools/lldb-vscode/JSONUtils.cpp Index: lldb/tools/lldb-vscode/JSONUtils.cpp === --- lldb/tools/lldb-vscode/JSONUtils.cpp +++ lldb/tools/lldb-vscode/JSONUtils.cpp @@ -7,6 +7,8 @@ //===--===// #include +#include +#include #include "llvm/ADT/Optional.h" #include "llvm/Support/FormatAdapters.h" @@ -327,6 +329,50 @@ return llvm::json::Value(std::move(object)); } +static uint64_t GetDebugInfoSizeInSection(lldb::SBSection section) { + uint64_t debug_info_size = 0; + llvm::StringRef section_name(section.GetName()); + if (section_name.startswith(".debug") || section_name.startswith("__debug") || + section_name.startswith(".apple") || section_name.startswith("__apple")) +debug_info_size += section.GetFileByteSize(); + size_t num_sub_sections = section.GetNumSubSections(); + for (size_t i = 0; i < num_sub_sections; i++) { +debug_info_size += +GetDebugInfoSizeInSection(section.GetSubSectionAtIndex(i)); + } + return debug_info_size; +} + +static uint64_t GetDebugInfoSize(lldb::SBModule module) { + uint64_t debug_info_size = 0; + size_t num_sections = module.GetNumSections(); + for (size_t i = 0; i < num_sections; i++) { +debug_info_size += GetDebugInfoSizeInSection(module.GetSectionAtIndex(i)); + } + return debug_info_size; +} + +static std::string ConvertDebugInfoSizeToString(uint64_t debug_info) { + std::ostringstream oss; + oss << "("; + oss << std::fixed << std::setprecision(1); + + if (debug_info < 1024) { +oss << debug_info << "B"; + } else if (debug_info < 1024 * 1024) { +double kb = double(debug_info) / 1024.0; +oss << kb << "KB"; + } else if (debug_info < 1024 * 1024 * 1024) { +double mb = double(debug_info) / (1024.0 * 1024.0); +oss << mb << "MB"; + } else { +double gb = double(debug_info) / (1024.0 * 1024.0 * 1024.0); +oss << gb << "GB"; +; + } + oss << ")"; + return oss.str(); +} llvm::json::Value CreateModule(lldb::SBModule ) { llvm::json::Object object; if (!module.IsValid()) @@ -339,9 +385,15 @@ std::string module_path(module_path_arr); object.try_emplace("path", module_path); if (module.GetNumCompileUnits() > 0) { -object.try_emplace("symbolStatus", "Symbols loaded."); +std::string symbol_str = "Symbols loaded."; +uint64_t debug_info = GetDebugInfoSize(module); +if (debug_info > 0) { + symbol_str += ConvertDebugInfoSizeToString(debug_info); +} +object.try_emplace("symbolStatus", symbol_str); char symbol_path_arr[PATH_MAX]; -module.GetSymbolFileSpec().GetPath(symbol_path_arr, sizeof(symbol_path_arr)); +module.GetSymbolFileSpec().GetPath(symbol_path_arr, + sizeof(symbol_path_arr)); std::string symbol_path(symbol_path_arr); object.try_emplace("symbolFilePath", symbol_path); } else { @@ -352,8 +404,9 @@ object.try_emplace("addressRange", loaded_addr); std::string version_str; uint32_t version_nums[3]; - uint32_t num_versions = module.GetVersion(version_nums, sizeof(version_nums)/sizeof(uint32_t)); - for (uint32_t i=0; ihttps://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -#======# - -r""" -clang-format git integration - - -This file provides a clang-format integration for git. Put it somewhere in your -path and ensure that it is executable. Then, "git clang-format" will invoke -clang-format on the changes in current files or a specific commit. - -For further details, run: -git clang-format -h - -Requires Python 2.7 or Python 3 -""" - -from __future__ import absolute_import, division, print_function -import argparse -import collections -import contextlib -import errno -import os -import re -import subprocess -import sys - -usage = 'git clang-format [OPTIONS] [] [] [--] [...]' - -desc = ''' -If zero or one commits are given, run clang-format on all lines that differ -between the working directory and , which defaults to HEAD. Changes are -only applied to the working directory. - -If two commits are given (requires --diff), run clang-format on all lines in the -second that differ from the first . - -The following git-config settings set the default of the corresponding option: - clangFormat.binary - clangFormat.commit - clangFormat.extensions -
[PATCH] D83731: Add Debug Info Size to Symbol Status
wallace accepted this revision. wallace added inline comments. Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:65 +@skipIfWindows +@ skipUnlessDarwin +@skipIfRemote remove this whitespace Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D83731: Add Debug Info Size to Symbol Status
aelitashen updated this revision to Diff 278922. aelitashen added a comment. Add TODO comment for Linux, Use ostringstream for Debug Info Size message. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 Files: clang/tools/clang-format/git-clang-format lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py lldb/tools/lldb-vscode/JSONUtils.cpp Index: lldb/tools/lldb-vscode/JSONUtils.cpp === --- lldb/tools/lldb-vscode/JSONUtils.cpp +++ lldb/tools/lldb-vscode/JSONUtils.cpp @@ -7,6 +7,8 @@ //===--===// #include +#include +#include #include "llvm/ADT/Optional.h" #include "llvm/Support/FormatAdapters.h" @@ -327,6 +329,50 @@ return llvm::json::Value(std::move(object)); } +static uint64_t GetDebugInfoSizeInSection(lldb::SBSection section) { + uint64_t debug_info_size = 0; + llvm::StringRef section_name(section.GetName()); + if (section_name.startswith(".debug") || section_name.startswith("__debug") || + section_name.startswith(".apple") || section_name.startswith("__apple")) +debug_info_size += section.GetFileByteSize(); + size_t num_sub_sections = section.GetNumSubSections(); + for (size_t i = 0; i < num_sub_sections; i++) { +debug_info_size += +GetDebugInfoSizeInSection(section.GetSubSectionAtIndex(i)); + } + return debug_info_size; +} + +static uint64_t GetDebugInfoSize(lldb::SBModule module) { + uint64_t debug_info_size = 0; + size_t num_sections = module.GetNumSections(); + for (size_t i = 0; i < num_sections; i++) { +debug_info_size += GetDebugInfoSizeInSection(module.GetSectionAtIndex(i)); + } + return debug_info_size; +} + +static std::string ConvertDebugInfoSizeToString(uint64_t debug_info) { + std::ostringstream oss; + oss << "("; + oss << std::fixed << std::setprecision(1); + + if (debug_info < 1024) { +oss << debug_info << "B"; + } else if (debug_info < 1024 * 1024) { +double kb = double(debug_info) / 1024.0; +oss << kb << "KB"; + } else if (debug_info < 1024 * 1024 * 1024) { +double mb = double(debug_info) / (1024.0 * 1024.0); +oss << mb << "MB"; + } else { +double gb = double(debug_info) / (1024.0 * 1024.0 * 1024.0); +oss << gb << "GB"; +; + } + oss << ")"; + return oss.str(); +} llvm::json::Value CreateModule(lldb::SBModule ) { llvm::json::Object object; if (!module.IsValid()) @@ -339,9 +385,15 @@ std::string module_path(module_path_arr); object.try_emplace("path", module_path); if (module.GetNumCompileUnits() > 0) { -object.try_emplace("symbolStatus", "Symbols loaded."); +std::string symbol_str = "Symbols loaded."; +uint64_t debug_info = GetDebugInfoSize(module); +if (debug_info > 0) { + symbol_str += ConvertDebugInfoSizeToString(debug_info); +} +object.try_emplace("symbolStatus", symbol_str); char symbol_path_arr[PATH_MAX]; -module.GetSymbolFileSpec().GetPath(symbol_path_arr, sizeof(symbol_path_arr)); +module.GetSymbolFileSpec().GetPath(symbol_path_arr, + sizeof(symbol_path_arr)); std::string symbol_path(symbol_path_arr); object.try_emplace("symbolFilePath", symbol_path); } else { @@ -352,8 +404,9 @@ object.try_emplace("addressRange", loaded_addr); std::string version_str; uint32_t version_nums[3]; - uint32_t num_versions = module.GetVersion(version_nums, sizeof(version_nums)/sizeof(uint32_t)); - for (uint32_t i=0; ihttps://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -#======# - -r""" -clang-format git integration - - -This file provides a clang-format integration for git. Put it somewhere in your -path and ensure that it is executable. Then, "git clang-format" will invoke -clang-format on the changes in current files or a specific commit. - -For further details, run: -git clang-format -h - -Requires Python 2.7 or Python 3 -""" - -from __future__ import absolute_import, division, print_function -import argparse -import collections -import contextlib -import errno -import os -import re -import subprocess -import sys - -usage = 'git clang-format [OPTIONS] [] [] [--] [...]' - -desc = ''' -If zero or one commits are given, run clang-format on all lines that differ -between the working directory and , which defaults to HEAD. Changes are -only applied to the working directory. - -If two commits are given (requires --diff), run clang-format on all lines in the -second that differ from the first . - -The following git-config settings set the default of the corresponding option: - clangFormat.binary - clangFormat.commit -
[PATCH] D83731: Add Debug Info Size to Symbol Status
wallace requested changes to this revision. wallace added a comment. This revision now requires changes to proceed. The logic looks very good, just some final comments and the code will be high quality Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:66 +@skipIfRemote +def test_module_event(self): +# Mac or linux. With you current Makefile, this test will fail on Linux, as the Makefile will expect a .dsym file to be created. Simply put @ skipUnlessDarwin back here, and add this comment #TODO: Update the Makefile so that this test runs on Linux Once this is committed, I'll work on make this test pass on Linux Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:67-73 +# Mac or linux. + +# On mac, if we load a.out as our symbol file, we will use DWARF with .o files and we will +# have debug symbols, but we won't see any debug info size because all of the DWARF +# sections are in .o files. + +# On other platforms, we expect a.out to have debug info, so we will expect a size. The common way to write function comments is with ''', like this ''' Mac or linux. On mac, if we load a.out as our symbol file, we will use DWARF with .o files and we will have debug symbols, but we won't see any debug info size because all of the DWARF sections are in .o files. On other platforms, we expect a.out to have debug info, so we will expect a size. ''' That way you don't need to type that many # Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:81-84 +# Darwin only test with dSYM file. + +# On mac, if we load a.out.dSYM as our symbol file, we will have debug symbols and we +# will have DWARF sections added to the module, so we will expect a size. same here about the comment Comment at: lldb/tools/lldb-vscode/JSONUtils.cpp:333 + llvm::StringRef section_name(section.GetName()); + if (section_name.startswith(".debug") || section_name.startswith("__debug") + || section_name.startswith(".apple") || section_name.startswith("__apple")) apply the format change it suggests, i.e start the second line with || Comment at: lldb/tools/lldb-vscode/JSONUtils.cpp:353 + +static std::string ConvertDebugInfoSize(uint64_t debug_info) { + char debug_info_size[32]; ConvertDebugInfoSizeToString is a better name Comment at: lldb/tools/lldb-vscode/JSONUtils.cpp:354-368 + char debug_info_size[32]; + if (debug_info < 1024) { +snprintf(debug_info_size, sizeof(debug_info_size), " (%" PRIu64 "B)", + debug_info); + } else if (debug_info < 1024 * 1024) { +double kb = double(debug_info) / 1024.0; +snprintf(debug_info_size, sizeof(debug_info_size), " (%.1fKB)", kb); a more modern way to implement this is #include #include ... std::ostringstream oss; oss << "("; oss << std::fixed << std::setprecision(1); if (debug_info < 1024) { oss << debug_info << "B"; } else if (debug_info < 1024 * 1024) { double kb = double(debug_info) / 1024.0; oss << kb << "KB"; } else if (debug_info < 1024 * 1024 * 1024) { double mb = double(debug_info) / (1024.0 * 1024.0); oss << mb << "MB"; } else { double gb = double(debug_info) / (1024.0 * 1024.0 * 1024.0); oss << gb << "GB";; } oss << ")"; return oss.str(); It's actually safer, as you don't need to specify the array size of your debug_info_size_buffer Comment at: lldb/tools/lldb-vscode/JSONUtils.cpp:385-386 +if (debug_info > 0) { + std::string debug_info_size = ConvertDebugInfoSize(debug_info); + symbol_str = symbol_str + debug_info_size; +} symbol_str += ConvertDebugInfoSizeToString(debug_info); is more concise Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D83731: Add Debug Info Size to Symbol Status
aelitashen updated this revision to Diff 278900. aelitashen added a comment. Merge if statements in GetDebugInfoSizeInSection() Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 Files: clang/tools/clang-format/git-clang-format lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py lldb/tools/lldb-vscode/JSONUtils.cpp Index: lldb/tools/lldb-vscode/JSONUtils.cpp === --- lldb/tools/lldb-vscode/JSONUtils.cpp +++ lldb/tools/lldb-vscode/JSONUtils.cpp @@ -327,6 +327,46 @@ return llvm::json::Value(std::move(object)); } +static uint64_t GetDebugInfoSizeInSection(lldb::SBSection section) { + uint64_t debug_info_size = 0; + llvm::StringRef section_name(section.GetName()); + if (section_name.startswith(".debug") || section_name.startswith("__debug") + || section_name.startswith(".apple") || section_name.startswith("__apple")) +debug_info_size += section.GetFileByteSize(); + size_t num_sub_sections = section.GetNumSubSections(); + for (size_t i = 0; i < num_sub_sections; i++) { +debug_info_size += +GetDebugInfoSizeInSection(section.GetSubSectionAtIndex(i)); + } + return debug_info_size; +} + +static uint64_t GetDebugInfoSize(lldb::SBModule module) { + uint64_t debug_info_size = 0; + size_t num_sections = module.GetNumSections(); + for (size_t i = 0; i < num_sections; i++) { +debug_info_size += GetDebugInfoSizeInSection(module.GetSectionAtIndex(i)); + } + return debug_info_size; +} + +static std::string ConvertDebugInfoSize(uint64_t debug_info) { + char debug_info_size[32]; + if (debug_info < 1024) { +snprintf(debug_info_size, sizeof(debug_info_size), " (%" PRIu64 "B)", + debug_info); + } else if (debug_info < 1024 * 1024) { +double kb = double(debug_info) / 1024.0; +snprintf(debug_info_size, sizeof(debug_info_size), " (%.1fKB)", kb); + } else if (debug_info < 1024 * 1024 * 1024) { +double mb = double(debug_info) / (1024.0 * 1024.0); +snprintf(debug_info_size, sizeof(debug_info_size), " (%.1fMB)", mb); + } else { +double gb = double(debug_info) / (1024.0 * 1024.0 * 1024.0); +snprintf(debug_info_size, sizeof(debug_info_size), " (%.1fGB)", gb); + } + return std::string(debug_info_size); +} llvm::json::Value CreateModule(lldb::SBModule ) { llvm::json::Object object; if (!module.IsValid()) @@ -339,9 +379,16 @@ std::string module_path(module_path_arr); object.try_emplace("path", module_path); if (module.GetNumCompileUnits() > 0) { -object.try_emplace("symbolStatus", "Symbols loaded."); +std::string symbol_str = "Symbols loaded."; +uint64_t debug_info = GetDebugInfoSize(module); +if (debug_info > 0) { + std::string debug_info_size = ConvertDebugInfoSize(debug_info); + symbol_str = symbol_str + debug_info_size; +} +object.try_emplace("symbolStatus", symbol_str); char symbol_path_arr[PATH_MAX]; -module.GetSymbolFileSpec().GetPath(symbol_path_arr, sizeof(symbol_path_arr)); +module.GetSymbolFileSpec().GetPath(symbol_path_arr, + sizeof(symbol_path_arr)); std::string symbol_path(symbol_path_arr); object.try_emplace("symbolFilePath", symbol_path); } else { @@ -352,8 +399,9 @@ object.try_emplace("addressRange", loaded_addr); std::string version_str; uint32_t version_nums[3]; - uint32_t num_versions = module.GetVersion(version_nums, sizeof(version_nums)/sizeof(uint32_t)); - for (uint32_t i=0; ihttps://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -#======# - -r""" -clang-format git integration - - -This file provides a clang-format integration for git. Put it somewhere in your -path and ensure that it is executable. Then, "git clang-format" will invoke -clang-format on the changes in current files or a specific commit. - -For further details, run: -git clang-format -h - -Requires Python 2.7 or Python 3 -""" - -from __future__ import absolute_import, division, print_function -import argparse -import collections -import contextlib -import errno -import os -import re -import subprocess -import sys - -usage = 'git clang-format [OPTIONS] [] [] [--] [...]' - -desc = ''' -If zero or one commits are given, run clang-format on all lines that differ -between the working directory and , which defaults to HEAD. Changes are -only applied to the working directory. - -If two commits are given (requires --diff), run clang-format on all lines in the -second that differ from the first . - -The following git-config settings set the default of the corresponding option: - clangFormat.binary - clangFormat.commit - clangFormat.extensions -
[PATCH] D83731: Add Debug Info Size to Symbol Status
aelitashen updated this revision to Diff 278898. aelitashen added a comment. Merge Codes and Improve Readability Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 Files: clang/tools/clang-format/git-clang-format lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py lldb/tools/lldb-vscode/JSONUtils.cpp Index: lldb/tools/lldb-vscode/JSONUtils.cpp === --- lldb/tools/lldb-vscode/JSONUtils.cpp +++ lldb/tools/lldb-vscode/JSONUtils.cpp @@ -327,6 +327,46 @@ return llvm::json::Value(std::move(object)); } +static uint64_t GetDebugInfoSizeInSection(lldb::SBSection section) { + uint64_t debug_info_size = 0; + llvm::StringRef section_name(section.GetName()); + if (section_name.startswith(".debug") || section_name.startswith("__debug") + ||section_name.startswith(".apple") || section_name.startswith("__apple")) +debug_info_size += section.GetFileByteSize(); + size_t num_sub_sections = section.GetNumSubSections(); + for (size_t i = 0; i < num_sub_sections; i++) { +debug_info_size += +GetDebugInfoSizeInSection(section.GetSubSectionAtIndex(i)); + } + return debug_info_size; +} + +static uint64_t GetDebugInfoSize(lldb::SBModule module) { + uint64_t debug_info_size = 0; + size_t num_sections = module.GetNumSections(); + for (size_t i = 0; i < num_sections; i++) { +debug_info_size += GetDebugInfoSizeInSection(module.GetSectionAtIndex(i)); + } + return debug_info_size; +} + +static std::string ConvertDebugInfoSize(uint64_t debug_info) { + char debug_info_size[32]; + if (debug_info < 1024) { +snprintf(debug_info_size, sizeof(debug_info_size), " (%" PRIu64 "B)", + debug_info); + } else if (debug_info < 1024 * 1024) { +double kb = double(debug_info) / 1024.0; +snprintf(debug_info_size, sizeof(debug_info_size), " (%.1fKB)", kb); + } else if (debug_info < 1024 * 1024 * 1024) { +double mb = double(debug_info) / (1024.0 * 1024.0); +snprintf(debug_info_size, sizeof(debug_info_size), " (%.1fMB)", mb); + } else { +double gb = double(debug_info) / (1024.0 * 1024.0 * 1024.0); +snprintf(debug_info_size, sizeof(debug_info_size), " (%.1fGB)", gb); + } + return std::string(debug_info_size); +} llvm::json::Value CreateModule(lldb::SBModule ) { llvm::json::Object object; if (!module.IsValid()) @@ -339,9 +379,16 @@ std::string module_path(module_path_arr); object.try_emplace("path", module_path); if (module.GetNumCompileUnits() > 0) { -object.try_emplace("symbolStatus", "Symbols loaded."); +std::string symbol_str = "Symbols loaded."; +uint64_t debug_info = GetDebugInfoSize(module); +if (debug_info > 0) { + std::string debug_info_size = ConvertDebugInfoSize(debug_info); + symbol_str = symbol_str + debug_info_size; +} +object.try_emplace("symbolStatus", symbol_str); char symbol_path_arr[PATH_MAX]; -module.GetSymbolFileSpec().GetPath(symbol_path_arr, sizeof(symbol_path_arr)); +module.GetSymbolFileSpec().GetPath(symbol_path_arr, + sizeof(symbol_path_arr)); std::string symbol_path(symbol_path_arr); object.try_emplace("symbolFilePath", symbol_path); } else { @@ -352,8 +399,9 @@ object.try_emplace("addressRange", loaded_addr); std::string version_str; uint32_t version_nums[3]; - uint32_t num_versions = module.GetVersion(version_nums, sizeof(version_nums)/sizeof(uint32_t)); - for (uint32_t i=0; ihttps://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -#======# - -r""" -clang-format git integration - - -This file provides a clang-format integration for git. Put it somewhere in your -path and ensure that it is executable. Then, "git clang-format" will invoke -clang-format on the changes in current files or a specific commit. - -For further details, run: -git clang-format -h - -Requires Python 2.7 or Python 3 -""" - -from __future__ import absolute_import, division, print_function -import argparse -import collections -import contextlib -import errno -import os -import re -import subprocess -import sys - -usage = 'git clang-format [OPTIONS] [] [] [--] [...]' - -desc = ''' -If zero or one commits are given, run clang-format on all lines that differ -between the working directory and , which defaults to HEAD. Changes are -only applied to the working directory. - -If two commits are given (requires --diff), run clang-format on all lines in the -second that differ from the first . - -The following git-config settings set the default of the corresponding option: - clangFormat.binary - clangFormat.commit - clangFormat.extensions -
[PATCH] D83731: Add Debug Info Size to Symbol Status
aelitashen updated this revision to Diff 278894. aelitashen added a comment. Create help function in tests for code re-use. Take care of both macOS and Linux system. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 Files: clang/tools/clang-format/git-clang-format lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py lldb/tools/lldb-vscode/JSONUtils.cpp Index: lldb/tools/lldb-vscode/JSONUtils.cpp === --- lldb/tools/lldb-vscode/JSONUtils.cpp +++ lldb/tools/lldb-vscode/JSONUtils.cpp @@ -327,6 +327,47 @@ return llvm::json::Value(std::move(object)); } +static uint64_t GetDebugInfoSizeInSection(lldb::SBSection section) { + uint64_t debug_info_size = 0; + llvm::StringRef section_name(section.GetName()); + if (section_name.startswith(".debug") || section_name.startswith("__debug")) +debug_info_size += section.GetFileByteSize(); + if (section_name.startswith(".apple") || section_name.startswith("__apple")) +debug_info_size += section.GetFileByteSize(); + size_t num_sub_sections = section.GetNumSubSections(); + for (size_t i = 0; i < num_sub_sections; i++) { +debug_info_size += +GetDebugInfoSizeInSection(section.GetSubSectionAtIndex(i)); + } + return debug_info_size; +} + +static uint64_t GetDebugInfoSize(lldb::SBModule module) { + uint64_t debug_info_size = 0; + size_t num_sections = module.GetNumSections(); + for (size_t i = 0; i < num_sections; i++) { +debug_info_size += GetDebugInfoSizeInSection(module.GetSectionAtIndex(i)); + } + return debug_info_size; +} + +static std::string ConvertDebugInfoSize(uint64_t debug_info) { + char debug_info_size[32]; + if (debug_info < 1024) { +snprintf(debug_info_size, sizeof(debug_info_size), " (%" PRIu64 "B)", + debug_info); + } else if (debug_info < 1024 * 1024) { +double kb = double(debug_info) / 1024.0; +snprintf(debug_info_size, sizeof(debug_info_size), " (%.1fKB)", kb); + } else if (debug_info < 1024 * 1024 * 1024) { +double mb = double(debug_info) / (1024.0 * 1024.0); +snprintf(debug_info_size, sizeof(debug_info_size), " (%.1fMB)", mb); + } else { +double gb = double(debug_info) / (1024.0 * 1024.0 * 1024.0); +snprintf(debug_info_size, sizeof(debug_info_size), " (%.1fGB)", gb); + } + return std::string(debug_info_size); +} llvm::json::Value CreateModule(lldb::SBModule ) { llvm::json::Object object; if (!module.IsValid()) @@ -339,9 +380,16 @@ std::string module_path(module_path_arr); object.try_emplace("path", module_path); if (module.GetNumCompileUnits() > 0) { -object.try_emplace("symbolStatus", "Symbols loaded."); +std::string symbol_str = "Symbols loaded."; +uint64_t debug_info = GetDebugInfoSize(module); +if (debug_info > 0) { + std::string debug_info_size = ConvertDebugInfoSize(debug_info); + symbol_str = symbol_str + debug_info_size; +} +object.try_emplace("symbolStatus", symbol_str); char symbol_path_arr[PATH_MAX]; -module.GetSymbolFileSpec().GetPath(symbol_path_arr, sizeof(symbol_path_arr)); +module.GetSymbolFileSpec().GetPath(symbol_path_arr, + sizeof(symbol_path_arr)); std::string symbol_path(symbol_path_arr); object.try_emplace("symbolFilePath", symbol_path); } else { @@ -352,8 +400,9 @@ object.try_emplace("addressRange", loaded_addr); std::string version_str; uint32_t version_nums[3]; - uint32_t num_versions = module.GetVersion(version_nums, sizeof(version_nums)/sizeof(uint32_t)); - for (uint32_t i=0; ihttps://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -#======# - -r""" -clang-format git integration - - -This file provides a clang-format integration for git. Put it somewhere in your -path and ensure that it is executable. Then, "git clang-format" will invoke -clang-format on the changes in current files or a specific commit. - -For further details, run: -git clang-format -h - -Requires Python 2.7 or Python 3 -""" - -from __future__ import absolute_import, division, print_function -import argparse -import collections -import contextlib -import errno -import os -import re -import subprocess -import sys - -usage = 'git clang-format [OPTIONS] [] [] [--] [...]' - -desc = ''' -If zero or one commits are given, run clang-format on all lines that differ -between the working directory and , which defaults to HEAD. Changes are -only applied to the working directory. - -If two commits are given (requires --diff), run clang-format on all lines in the -second that differ from the first . - -The following git-config settings set the default of the
[PATCH] D83731: Add Debug Info Size to Symbol Status
wallace added a comment. @clayborg, the tests will fail on linux because the Makefile is expecting a .dsym file. I think it's okay if she does it just for Darwin and then I update the test to cover also linux, as I have my linux already well set up. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D83731: Add Debug Info Size to Symbol Status
clayborg requested changes to this revision. clayborg added a comment. This revision now requires changes to proceed. So you should revert any clang format changes that are not in modified lines of source, mostly revert a lot of lines in lldb-vscode.cpp. Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:19 - -@skipIfWindows -@skipUnlessDarwin -@skipIfRemote -def test_modules_event(self): -program_basename = "a.out.stripped" +def get_modules(self, program_basename): program= self.getBuildArtifact(program_basename) Name should be more descriptive. Maybe "setup_test_common" is a better name Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:19 - -@skipIfWindows -@skipUnlessDarwin -@skipIfRemote -def test_modules_event(self): -program_basename = "a.out.stripped" +def get_modules(self, program_basename): program= self.getBuildArtifact(program_basename) clayborg wrote: > Name should be more descriptive. Maybe "setup_test_common" is a better name So all of these tests can re-use this function if we switch it up a bit. Here is what I was thinking: ``` def run_test(self, symbol_basename, expect_debug_info_size): program_basename = "a.out.stripped" program = self.getBuildArtifact(program_basename) self.build_and_launch(program) functions = ['foo'] breakpoint_ids = self.set_function_breakpoints(functions) self.assertEquals(len(breakpoint_ids), len(functions), 'expect one breakpoint') self.continue_to_breakpoints(breakpoint_ids) active_modules = self.vscode.get_active_modules() program_module = active_modules[program_basename] self.assertIn(program_basename, active_modules, '%s module is in active modules' % (program_basename)) self.assertIn('name', program_module, 'make sure name is in module') self.assertEqual(program_basename, program_module['name']) self.assertIn('path', program_module, 'make sure path is in module') self.assertEqual(program, program_module['path']) self.assertTrue('symbolFilePath' not in program_module, 'Make sure a.out.stripped has no debug info') self.assertEqual('Symbols not found.', program_module['symbolStatus']) symbols_path = self.getBuildArtifact(symbol_basename) self.vscode.request_evaluate('`%s' % ('target symbols add -s "%s" "%s"' % (program, symbols_path))) def checkSymbolsLoaded(): active_modules = self.vscode.get_active_modules() program_module = active_modules[program_basename] return 'Symbols loaded.' == program_module['symbolStatus'] def checkSymbolsLoadedWithSize(): active_modules = self.vscode.get_active_modules() program_module = active_modules[program_basename] symbolsStatus = program_module['symbolStatus'] symbol_regex = re.compile(r"Symbols loaded. \([0-9]+(\.[0-9]*)?[KMG]?B\)") return symbol_regex.match(program_module['symbolStatus']) if expect_debug_info_size: self.waitUntil(checkSymbolsLoadedWithSize) else: self.waitUntil(checkSymbolsLoaded) ``` Then your tests would be: ``` @skipIfWindows @skipIfRemote def test_module_event(self): # Mac or linux. # On mac, if we load a.out as our symbol file, we will use DWARF with .o files and we will # have debug symbols, but we won't see any debug info size because all of the DWARF # sections are in .o files. # On other platforms, we expect a.out to have debug info, so we will expect a size. expect_debug_info_size = platform.system() != 'Darwin' return run_test("a.out", expect_debug_info_size) @skipIfWindows @skipUnlessDarwin @skipIfRemote def test_module_event_dsym(self): # Darwin only test with dSYM file. # On mac, if we load a.out.dSYM as our symbol file, we will have debug symbols and we # will have DWARF sections added to the module, so we will expect a size. return run_test("a.out.dSYM", True) ``` This should cover both mac and non windows correctly. Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:20 +def get_modules(self, program_basename): program= self.getBuildArtifact(program_basename) self.build_and_launch(program) add a space after program: ``` program = self.getBuildArtifact(program_basename) ``` Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:32 +@skipIfWindows +@skipUnlessDarwin +@skipIfRemote Remove @skipUnlessDarwin here. This should work on linux. Comment at: lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py:59 +# it will end up using the executable and the .o files as the debug info. +# We won't see any debug information size for this case since all of the debug info
[PATCH] D83731: Add Debug Info Size to Symbol Status
wallace added inline comments. Comment at: lldb/tools/lldb-vscode/JSONUtils.cpp:333-335 + if (section_name.startswith(".debug") || section_name.startswith("__debug")) +debug_info_size += section.GetFileByteSize(); + if (section_name.startswith(".apple") || section_name.startswith("__apple")) you can merge these two ifs Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D83731: Add Debug Info Size to Symbol Status
aelitashen updated this revision to Diff 278631. aelitashen added a comment. Herald added a project: clang. Herald added a subscriber: cfe-commits. The tests added are only for macOS, Walter will help me write tests on Linux. This update optimize the code and apply git clang format. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83731/new/ https://reviews.llvm.org/D83731 Files: clang/tools/clang-format/git-clang-format lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py lldb/test/API/tools/lldb-vscode/module/TestVSCode_module.py lldb/tools/lldb-vscode/JSONUtils.cpp lldb/tools/lldb-vscode/JSONUtils.h lldb/tools/lldb-vscode/lldb-vscode.cpp Index: lldb/tools/lldb-vscode/lldb-vscode.cpp === --- lldb/tools/lldb-vscode/lldb-vscode.cpp +++ lldb/tools/lldb-vscode/lldb-vscode.cpp @@ -343,7 +343,7 @@ char buffer[1024]; size_t count; while ((count = process.GetSTDOUT(buffer, sizeof(buffer))) > 0) - g_vsc.SendOutput(OutputType::Stdout, llvm::StringRef(buffer, count)); +g_vsc.SendOutput(OutputType::Stdout, llvm::StringRef(buffer, count)); while ((count = process.GetSTDERR(buffer, sizeof(buffer))) > 0) g_vsc.SendOutput(OutputType::Stderr, llvm::StringRef(buffer, count)); } @@ -448,10 +448,10 @@ if (event_mask & lldb::SBTarget::eBroadcastBitModulesLoaded) { body.try_emplace("reason", "new"); } else if (event_mask & -lldb::SBTarget::eBroadcastBitModulesUnloaded) { + lldb::SBTarget::eBroadcastBitModulesUnloaded) { body.try_emplace("reason", "removed"); } else if (event_mask & -lldb::SBTarget::eBroadcastBitSymbolsLoaded) { + lldb::SBTarget::eBroadcastBitSymbolsLoaded) { body.try_emplace("reason", "changed"); } body.try_emplace("module", module_value); @@ -873,7 +873,9 @@ // "CompletionsRequest": { // "allOf": [ { "$ref": "#/definitions/Request" }, { // "type": "object", -// "description": "Returns a list of possible completions for a given caret position and text.\nThe CompletionsRequest may only be called if the 'supportsCompletionsRequest' capability exists and is true.", +// "description": "Returns a list of possible completions for a given caret +// position and text.\nThe CompletionsRequest may only be called if the +// 'supportsCompletionsRequest' capability exists and is true.", // "properties": { // "command": { // "type": "string", @@ -892,19 +894,23 @@ // "properties": { // "frameId": { // "type": "integer", -// "description": "Returns completions in the scope of this stack frame. If not specified, the completions are returned for the global scope." +// "description": "Returns completions in the scope of this stack frame. +// If not specified, the completions are returned for the global scope." // }, // "text": { // "type": "string", -// "description": "One or more source lines. Typically this is the text a user has typed into the debug console before he asked for completion." +// "description": "One or more source lines. Typically this is the text a +// user has typed into the debug console before he asked for completion." // }, // "column": { // "type": "integer", -// "description": "The character position for which to determine the completion proposals." +// "description": "The character position for which to determine the +// completion proposals." // }, // "line": { // "type": "integer", -// "description": "An optional line for which to determine the completion proposals. If missing the first line of the text is assumed." +// "description": "An optional line for which to determine the completion +// proposals. If missing the first line of the text is assumed." // } // }, // "required": [ "text", "column" ] @@ -933,39 +939,51 @@ // }, // "CompletionItem": { // "type": "object", -// "description": "CompletionItems are the suggestions returned from the CompletionsRequest.", -// "properties": { +// "description": "CompletionItems are the suggestions returned from the +// CompletionsRequest.", "properties": { // "label": { // "type": "string", -// "description": "The label of this completion item. By default this is also the text that is inserted when selecting this completion." +// "description": "The label of this completion item. By default this is +// also the text that is inserted when selecting this completion." // }, // "text": { // "type": "string", -// "description": "If text is not falsy then it is inserted instead of the label." +// "description": "If text is not falsy