509 lines · cpp
1//===-- options.cpp - Command line options for llvm-debuginfo-analyzer----===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This handles the command line options for llvm-debuginfo-analyzer.10//11//===----------------------------------------------------------------------===//12 13#include "Options.h"14#include "llvm/DebugInfo/LogicalView/Core/LVOptions.h"15#include "llvm/DebugInfo/LogicalView/Core/LVSort.h"16#include "llvm/Support/CommandLine.h"17 18using namespace llvm;19using namespace llvm::logicalview;20using namespace llvm::logicalview::cmdline;21 22/// @}23/// Command line options.24/// @{25 26OffsetParser::OffsetParser(cl::Option &O) : parser<unsigned long long>(O) {}27OffsetParser::~OffsetParser() = default;28 29bool OffsetParser::parse(cl::Option &O, StringRef ArgName, StringRef Arg,30 unsigned long long &Val) {31 char *End;32 std::string Argument(Arg);33 Val = strtoull(Argument.c_str(), &End, 0);34 if (*End)35 // Print an error message if unrecognized character.36 return O.error("'" + Arg + "' unrecognized character.");37 return false;38}39 40LVOptions cmdline::ReaderOptions;41 42//===----------------------------------------------------------------------===//43// Specific options44//===----------------------------------------------------------------------===//45cl::list<std::string>46 cmdline::InputFilenames(cl::desc("<input object files or .dSYM bundles>"),47 cl::Positional, cl::ZeroOrMore);48 49//===----------------------------------------------------------------------===//50// '--attribute' options51//===----------------------------------------------------------------------===//52cl::OptionCategory53 cmdline::AttributeCategory("Attribute Options",54 "These control extra attributes that are "55 "added when the element is printed.");56 57// --attribute=<value>[,<value>,...]58cl::list<LVAttributeKind> cmdline::AttributeOptions(59 "attribute", cl::cat(AttributeCategory), cl::desc("Element attributes."),60 cl::Hidden, cl::CommaSeparated,61 values(clEnumValN(LVAttributeKind::All, "all", "Include all attributes."),62 clEnumValN(LVAttributeKind::Argument, "argument",63 "Template parameters replaced by its arguments."),64 clEnumValN(LVAttributeKind::Base, "base",65 "Base types (int, bool, etc.)."),66 clEnumValN(LVAttributeKind::Coverage, "coverage",67 "Symbol location coverage."),68 clEnumValN(LVAttributeKind::Directories, "directories",69 "Directories referenced in the debug information."),70 clEnumValN(LVAttributeKind::Discarded, "discarded",71 "Discarded elements by the linker."),72 clEnumValN(LVAttributeKind::Discriminator, "discriminator",73 "Discriminators for inlined function instances."),74 clEnumValN(LVAttributeKind::Encoded, "encoded",75 "Template arguments encoded in the template name."),76 clEnumValN(LVAttributeKind::Extended, "extended",77 "Advanced attributes alias."),78 clEnumValN(LVAttributeKind::Filename, "filename",79 "Filename where the element is defined."),80 clEnumValN(LVAttributeKind::Files, "files",81 "Files referenced in the debug information."),82 clEnumValN(LVAttributeKind::Format, "format",83 "Object file format name."),84 clEnumValN(LVAttributeKind::Gaps, "gaps",85 "Missing debug location (gaps)."),86 clEnumValN(LVAttributeKind::Generated, "generated",87 "Compiler generated elements."),88 clEnumValN(LVAttributeKind::Global, "global",89 "Element referenced across Compile Units."),90 clEnumValN(LVAttributeKind::Inserted, "inserted",91 "Generated inlined abstract references."),92 clEnumValN(LVAttributeKind::Language, "language",93 "Source language name."),94 clEnumValN(LVAttributeKind::Level, "level",95 "Lexical scope level (File=0, Compile Unit=1)."),96 clEnumValN(LVAttributeKind::Linkage, "linkage", "Linkage name."),97 clEnumValN(LVAttributeKind::Local, "local",98 "Element referenced only in the Compile Unit."),99 clEnumValN(LVAttributeKind::Location, "location",100 "Element debug location."),101 clEnumValN(LVAttributeKind::Offset, "offset",102 "Debug information offset."),103 clEnumValN(LVAttributeKind::Pathname, "pathname",104 "Pathname where the element is defined."),105 clEnumValN(LVAttributeKind::Producer, "producer",106 "Toolchain identification name."),107 clEnumValN(LVAttributeKind::Publics, "publics",108 "Function names that are public."),109 clEnumValN(LVAttributeKind::Qualified, "qualified",110 "The element type include parents in its name."),111 clEnumValN(LVAttributeKind::Qualifier, "qualifier",112 "Line qualifiers (Newstatement, BasicBlock, etc.)."),113 clEnumValN(LVAttributeKind::Range, "range",114 "Debug location ranges."),115 clEnumValN(LVAttributeKind::Reference, "reference",116 "Element declaration and definition references."),117 clEnumValN(LVAttributeKind::Register, "register",118 "Processor register names."),119 clEnumValN(LVAttributeKind::Size, "size", "Type sizes."),120 clEnumValN(LVAttributeKind::Standard, "standard",121 "Basic attributes alias."),122 clEnumValN(LVAttributeKind::Subrange, "subrange",123 "Subrange encoding information for arrays."),124 clEnumValN(LVAttributeKind::System, "system",125 "Display PDB's MS system elements."),126 clEnumValN(LVAttributeKind::Typename, "typename",127 "Include Parameters in templates."),128 clEnumValN(LVAttributeKind::Underlying, "underlying",129 "Underlying type for type definitions."),130 clEnumValN(LVAttributeKind::Zero, "zero", "Zero line numbers.")));131 132//===----------------------------------------------------------------------===//133// '--compare' options134//===----------------------------------------------------------------------===//135cl::OptionCategory136 cmdline::CompareCategory("Compare Options",137 "These control the view comparison.");138 139// --compare-context140static cl::opt<bool, true>141 CompareContext("compare-context", cl::cat(CompareCategory),142 cl::desc("Add the view as compare context."), cl::Hidden,143 cl::ZeroOrMore, cl::location(ReaderOptions.Compare.Context),144 cl::init(false));145 146// --compare=<value>[,<value>,...]147cl::list<LVCompareKind> cmdline::CompareElements(148 "compare", cl::cat(CompareCategory), cl::desc("Elements to compare."),149 cl::Hidden, cl::CommaSeparated,150 values(clEnumValN(LVCompareKind::All, "all", "Compare all elements."),151 clEnumValN(LVCompareKind::Lines, "lines", "Lines."),152 clEnumValN(LVCompareKind::Scopes, "scopes", "Scopes."),153 clEnumValN(LVCompareKind::Symbols, "symbols", "Symbols."),154 clEnumValN(LVCompareKind::Types, "types", "Types.")));155 156//===----------------------------------------------------------------------===//157// '--output' options158//===----------------------------------------------------------------------===//159cl::OptionCategory160 cmdline::OutputCategory("Output Options",161 "These control the output generated.");162 163// --output-file=<filename>164cl::opt<std::string>165 cmdline::OutputFilename("output-file", cl::cat(OutputCategory),166 cl::desc("Redirect output to the specified file."),167 cl::Hidden, cl::value_desc("filename"),168 cl::init("-"));169 170// --output-folder=<path>171static cl::opt<std::string, true>172 OutputFolder("output-folder", cl::cat(OutputCategory),173 cl::desc("Folder name for view splitting."),174 cl::value_desc("pathname"), cl::Hidden, cl::ZeroOrMore,175 cl::location(ReaderOptions.Output.Folder));176 177// --output-level=<level>178static cl::opt<unsigned, true>179 OutputLevel("output-level", cl::cat(OutputCategory),180 cl::desc("Only print to a depth of N elements."),181 cl::value_desc("N"), cl::Hidden, cl::ZeroOrMore,182 cl::location(ReaderOptions.Output.Level), cl::init(-1U));183 184// --ouput=<value>[,<value>,...]185cl::list<LVOutputKind> cmdline::OutputOptions(186 "output", cl::cat(OutputCategory), cl::desc("Outputs for view."),187 cl::Hidden, cl::CommaSeparated,188 values(clEnumValN(LVOutputKind::All, "all", "All outputs."),189 clEnumValN(LVOutputKind::Split, "split",190 "Split the output by Compile Units."),191 clEnumValN(LVOutputKind::Text, "text",192 "Use a free form text output."),193 clEnumValN(LVOutputKind::Json, "json",194 "Use JSON as the output format.")));195 196// --output-sort197static cl::opt<LVSortMode, true> OutputSort(198 "output-sort", cl::cat(OutputCategory),199 cl::desc("Primary key when ordering logical view (default: line)."),200 cl::Hidden, cl::ZeroOrMore,201 values(clEnumValN(LVSortMode::None, "none",202 "Unsorted output (i.e. as read from input)."),203 clEnumValN(LVSortMode::ID, "id", "Sort by unique element ID."),204 clEnumValN(LVSortMode::Kind, "kind", "Sort by element kind."),205 clEnumValN(LVSortMode::Line, "line", "Sort by element line number."),206 clEnumValN(LVSortMode::Name, "name", "Sort by element name."),207 clEnumValN(LVSortMode::Offset, "offset", "Sort by element offset.")),208 cl::location(ReaderOptions.Output.SortMode), cl::init(LVSortMode::Line));209 210//===----------------------------------------------------------------------===//211// '--print' options212//===----------------------------------------------------------------------===//213cl::OptionCategory214 cmdline::PrintCategory("Print Options",215 "These control which elements are printed.");216 217// --print=<value>[,<value>,...]218cl::list<LVPrintKind> cmdline::PrintOptions(219 "print", cl::cat(PrintCategory), cl::desc("Element to print."),220 cl::CommaSeparated,221 values(clEnumValN(LVPrintKind::All, "all", "All elements."),222 clEnumValN(LVPrintKind::Elements, "elements",223 "Instructions, lines, scopes, symbols and types."),224 clEnumValN(LVPrintKind::Instructions, "instructions",225 "Assembler instructions."),226 clEnumValN(LVPrintKind::Lines, "lines",227 "Lines referenced in the debug information."),228 clEnumValN(LVPrintKind::Scopes, "scopes",229 "A lexical block (Function, Class, etc.)."),230 clEnumValN(LVPrintKind::Sizes, "sizes",231 "Scope contributions to the debug information."),232 clEnumValN(LVPrintKind::Summary, "summary",233 "Summary of elements missing/added/matched/printed."),234 clEnumValN(LVPrintKind::Symbols, "symbols",235 "Symbols (Variable, Members, etc.)."),236 clEnumValN(LVPrintKind::Types, "types",237 "Types (Pointer, Reference, etc.)."),238 clEnumValN(LVPrintKind::Warnings, "warnings",239 "Warnings detected.")));240 241//===----------------------------------------------------------------------===//242// '--report' options243//===----------------------------------------------------------------------===//244cl::OptionCategory245 cmdline::ReportCategory("Report Options",246 "These control how the elements are printed.");247 248// --report=<value>[,<value>,...]249cl::list<LVReportKind> cmdline::ReportOptions(250 "report", cl::cat(ReportCategory),251 cl::desc("Reports layout used for print, compare and select."), cl::Hidden,252 cl::CommaSeparated,253 values(clEnumValN(LVReportKind::All, "all", "Generate all reports."),254 clEnumValN(LVReportKind::Children, "children",255 "Selected elements are displayed in a tree view "256 "(Include children)"),257 clEnumValN(LVReportKind::List, "list",258 "Selected elements are displayed in a tabular format."),259 clEnumValN(LVReportKind::Parents, "parents",260 "Selected elements are displayed in a tree view. "261 "(Include parents)"),262 clEnumValN(LVReportKind::View, "view",263 "Selected elements are displayed in a tree view "264 "(Include parents and children.")));265 266//===----------------------------------------------------------------------===//267// '--select' options268//===----------------------------------------------------------------------===//269cl::OptionCategory270 cmdline::SelectCategory("Select Options",271 "These control which elements are selected.");272 273// --select-nocase274static cl::opt<bool, true>275 SelectIgnoreCase("select-nocase", cl::cat(SelectCategory),276 cl::desc("Ignore case distinctions when searching."),277 cl::Hidden, cl::ZeroOrMore,278 cl::location(ReaderOptions.Select.IgnoreCase),279 cl::init(false));280 281// --select-regex282static cl::opt<bool, true> SelectUseRegex(283 "select-regex", cl::cat(SelectCategory),284 cl::desc("Treat any <pattern> strings as regular expressions when "285 "selecting instead of just as an exact string match."),286 cl::Hidden, cl::ZeroOrMore, cl::location(ReaderOptions.Select.UseRegex),287 cl::init(false));288 289// --select=<pattern>290cl::list<std::string> cmdline::SelectPatterns(291 "select", cl::cat(SelectCategory),292 cl::desc("Search elements matching the given pattern."), cl::Hidden,293 cl::value_desc("pattern"), cl::CommaSeparated);294 295// --select-offsets=<value>[,<value>,...]296OffsetOptionList cmdline::SelectOffsets("select-offsets",297 cl::cat(SelectCategory),298 cl::desc("Offset element to print."),299 cl::Hidden, cl::value_desc("offset"),300 cl::CommaSeparated, cl::ZeroOrMore);301 302// --select-elements=<value>[,<value>,...]303cl::list<LVElementKind> cmdline::SelectElements(304 "select-elements", cl::cat(SelectCategory),305 cl::desc("Conditions to use when printing elements."), cl::Hidden,306 cl::CommaSeparated,307 values(clEnumValN(LVElementKind::Discarded, "Discarded",308 "Discarded elements by the linker."),309 clEnumValN(LVElementKind::Global, "Global",310 "Element referenced across Compile Units."),311 clEnumValN(LVElementKind::Optimized, "Optimized",312 "Generated inlined abstract references.")));313 314// --select-lines=<value>[,<value>,...]315cl::list<LVLineKind> cmdline::SelectLines(316 "select-lines", cl::cat(SelectCategory),317 cl::desc("Line kind to use when printing lines."), cl::Hidden,318 cl::CommaSeparated,319 values(320 clEnumValN(LVLineKind::IsAlwaysStepInto, "AlwaysStepInto",321 "Always Step Into."),322 clEnumValN(LVLineKind::IsBasicBlock, "BasicBlock", "Basic block."),323 clEnumValN(LVLineKind::IsDiscriminator, "Discriminator",324 "Discriminator."),325 clEnumValN(LVLineKind::IsEndSequence, "EndSequence", "End sequence."),326 clEnumValN(LVLineKind::IsEpilogueBegin, "EpilogueBegin.",327 "Epilogue begin."),328 clEnumValN(LVLineKind::IsLineDebug, "LineDebug", "Debug line."),329 clEnumValN(LVLineKind::IsLineAssembler, "LineAssembler",330 "Assembler line."),331 clEnumValN(LVLineKind::IsNeverStepInto, "NeverStepInto",332 "Never Step Into."),333 clEnumValN(LVLineKind::IsNewStatement, "NewStatement",334 "New statement."),335 clEnumValN(LVLineKind::IsPrologueEnd, "PrologueEnd", "Prologue end.")));336 337// --select-scopes=<value>[,<value>,...]338cl::list<LVScopeKind> cmdline::SelectScopes(339 "select-scopes", cl::cat(SelectCategory),340 cl::desc("Scope kind to use when printing scopes."), cl::Hidden,341 cl::CommaSeparated,342 values(343 clEnumValN(LVScopeKind::IsAggregate, "Aggregate",344 "Class, Structure or Union."),345 clEnumValN(LVScopeKind::IsArray, "Array", "Array."),346 clEnumValN(LVScopeKind::IsBlock, "Block", "Lexical block."),347 clEnumValN(LVScopeKind::IsCallSite, "CallSite", "Call site block."),348 clEnumValN(LVScopeKind::IsCatchBlock, "CatchBlock",349 "Exception catch block."),350 clEnumValN(LVScopeKind::IsClass, "Class", "Class."),351 clEnumValN(LVScopeKind::IsCompileUnit, "CompileUnit", "Compile unit."),352 clEnumValN(LVScopeKind::IsEntryPoint, "EntryPoint",353 "Function entry point."),354 clEnumValN(LVScopeKind::IsEnumeration, "Enumeration", "Enumeration."),355 clEnumValN(LVScopeKind::IsFunction, "Function", "Function."),356 clEnumValN(LVScopeKind::IsFunctionType, "FunctionType",357 "Function type."),358 clEnumValN(LVScopeKind::IsInlinedFunction, "InlinedFunction",359 "Inlined function."),360 clEnumValN(LVScopeKind::IsLabel, "Label", "Label."),361 clEnumValN(LVScopeKind::IsLexicalBlock, "LexicalBlock",362 "Lexical block."),363 clEnumValN(LVScopeKind::IsModule, "Module", "Module."),364 clEnumValN(LVScopeKind::IsNamespace, "Namespace", "Namespace."),365 clEnumValN(LVScopeKind::IsRoot, "Root", "Root."),366 clEnumValN(LVScopeKind::IsStructure, "Structure", "Structure."),367 clEnumValN(LVScopeKind::IsSubprogram, "Subprogram", "Subprogram."),368 clEnumValN(LVScopeKind::IsTemplate, "Template", "Template."),369 clEnumValN(LVScopeKind::IsTemplateAlias, "TemplateAlias",370 "Template alias."),371 clEnumValN(LVScopeKind::IsTemplatePack, "TemplatePack",372 "Template pack."),373 clEnumValN(LVScopeKind::IsTryBlock, "TryBlock", "Exception try block."),374 clEnumValN(LVScopeKind::IsUnion, "Union", "Union.")));375 376// --select-symbols=<value>[,<value>,...]377cl::list<LVSymbolKind> cmdline::SelectSymbols(378 "select-symbols", cl::cat(SelectCategory),379 cl::desc("Symbol kind to use when printing symbols."), cl::Hidden,380 cl::CommaSeparated,381 values(clEnumValN(LVSymbolKind::IsCallSiteParameter, "CallSiteParameter",382 "Call site parameter."),383 clEnumValN(LVSymbolKind::IsConstant, "Constant", "Constant."),384 clEnumValN(LVSymbolKind::IsInheritance, "Inheritance",385 "Inheritance."),386 clEnumValN(LVSymbolKind::IsMember, "Member", "Member."),387 clEnumValN(LVSymbolKind::IsParameter, "Parameter", "Parameter."),388 clEnumValN(LVSymbolKind::IsUnspecified, "Unspecified",389 "Unspecified parameter."),390 clEnumValN(LVSymbolKind::IsVariable, "Variable", "Variable.")));391 392// --select-types=<value>[,<value>,...]393cl::list<LVTypeKind> cmdline::SelectTypes(394 "select-types", cl::cat(SelectCategory),395 cl::desc("Type kind to use when printing types."), cl::Hidden,396 cl::CommaSeparated,397 values(398 clEnumValN(LVTypeKind::IsBase, "Base", "Base Type (int, bool, etc.)."),399 clEnumValN(LVTypeKind::IsConst, "Const", "Constant specifier."),400 clEnumValN(LVTypeKind::IsEnumerator, "Enumerator", "Enumerator."),401 clEnumValN(LVTypeKind::IsImport, "Import", "Import."),402 clEnumValN(LVTypeKind::IsImportDeclaration, "ImportDeclaration",403 "Import declaration."),404 clEnumValN(LVTypeKind::IsImportModule, "ImportModule",405 "Import module."),406 clEnumValN(LVTypeKind::IsPointer, "Pointer", "Pointer."),407 clEnumValN(LVTypeKind::IsPointerMember, "PointerMember",408 "Pointer to member."),409 clEnumValN(LVTypeKind::IsReference, "Reference", "Reference type."),410 clEnumValN(LVTypeKind::IsRestrict, "Restrict", "Restrict specifier."),411 clEnumValN(LVTypeKind::IsRvalueReference, "RvalueReference",412 "Rvalue reference."),413 clEnumValN(LVTypeKind::IsSubrange, "Subrange", "Array subrange."),414 clEnumValN(LVTypeKind::IsTemplateParam, "TemplateParam",415 "Template Parameter."),416 clEnumValN(LVTypeKind::IsTemplateTemplateParam, "TemplateTemplateParam",417 "Template template parameter."),418 clEnumValN(LVTypeKind::IsTemplateTypeParam, "TemplateTypeParam",419 "Template type parameter."),420 clEnumValN(LVTypeKind::IsTemplateValueParam, "TemplateValueParam",421 "Template value parameter."),422 clEnumValN(LVTypeKind::IsTypedef, "Typedef", "Type definition."),423 clEnumValN(LVTypeKind::IsUnspecified, "Unspecified",424 "Unspecified type."),425 clEnumValN(LVTypeKind::IsVolatile, "Volatile", "Volatile specifier.")));426 427//===----------------------------------------------------------------------===//428// '--warning' options429//===----------------------------------------------------------------------===//430cl::OptionCategory431 cmdline::WarningCategory("Warning Options",432 "These control the generated warnings.");433 434// --warning=<value>[,<value>,...]435cl::list<LVWarningKind> cmdline::WarningOptions(436 "warning", cl::cat(WarningCategory), cl::desc("Warnings to generate."),437 cl::Hidden, cl::CommaSeparated,438 values(439 clEnumValN(LVWarningKind::All, "all", "All warnings."),440 clEnumValN(LVWarningKind::Coverages, "coverages",441 "Invalid symbol coverages values."),442 clEnumValN(LVWarningKind::Lines, "lines", "Debug lines that are zero."),443 clEnumValN(LVWarningKind::Locations, "locations",444 "Invalid symbol locations."),445 clEnumValN(LVWarningKind::Ranges, "ranges", "Invalid code ranges.")));446 447//===----------------------------------------------------------------------===//448// '--internal' options449//===----------------------------------------------------------------------===//450cl::OptionCategory451 cmdline::InternalCategory("Internal Options",452 "Internal traces and extra debugging code.");453 454// --internal=<value>[,<value>,...]455cl::list<LVInternalKind> cmdline::InternalOptions(456 "internal", cl::cat(InternalCategory), cl::desc("Traces to enable."),457 cl::Hidden, cl::CommaSeparated,458 values(459 clEnumValN(LVInternalKind::All, "all", "Enable all traces."),460 clEnumValN(LVInternalKind::Cmdline, "cmdline", "Print command line."),461 clEnumValN(LVInternalKind::ID, "id", "Print unique element ID"),462 clEnumValN(LVInternalKind::Integrity, "integrity",463 "Check elements integrity."),464 clEnumValN(LVInternalKind::None, "none", "Ignore element line number."),465 clEnumValN(LVInternalKind::Tag, "tag", "Debug information tags.")));466 467/// @}468 469// Copy local options into a globally accessible data structure.470void llvm::logicalview::cmdline::propagateOptions() {471 // Traverse list of options and update the given set (Using case and Regex).472 auto UpdatePattern = [&](auto &List, auto &Set, bool IgnoreCase,473 bool UseRegex) {474 if (!List.empty())475 for (std::string &Pattern : List)476 Set.insert((IgnoreCase && !UseRegex) ? StringRef(Pattern).lower()477 : Pattern);478 };479 480 // Handle --select.481 UpdatePattern(SelectPatterns, ReaderOptions.Select.Generic,482 ReaderOptions.Select.IgnoreCase, ReaderOptions.Select.UseRegex);483 484 // Traverse list of options and update the given set.485 auto UpdateSet = [&](auto &List, auto &Set) {486 std::copy(List.begin(), List.end(), std::inserter(Set, Set.begin()));487 };488 489 // Handle options sets.490 UpdateSet(AttributeOptions, ReaderOptions.Attribute.Kinds);491 UpdateSet(PrintOptions, ReaderOptions.Print.Kinds);492 UpdateSet(OutputOptions, ReaderOptions.Output.Kinds);493 UpdateSet(ReportOptions, ReaderOptions.Report.Kinds);494 UpdateSet(WarningOptions, ReaderOptions.Warning.Kinds);495 UpdateSet(InternalOptions, ReaderOptions.Internal.Kinds);496 497 UpdateSet(SelectElements, ReaderOptions.Select.Elements);498 UpdateSet(SelectLines, ReaderOptions.Select.Lines);499 UpdateSet(SelectScopes, ReaderOptions.Select.Scopes);500 UpdateSet(SelectSymbols, ReaderOptions.Select.Symbols);501 UpdateSet(SelectTypes, ReaderOptions.Select.Types);502 UpdateSet(SelectOffsets, ReaderOptions.Select.Offsets);503 UpdateSet(CompareElements, ReaderOptions.Compare.Elements);504 505 // Resolve any options dependencies (ie. --print=all should set other506 // print options, etc.).507 ReaderOptions.resolveDependencies();508}509