[llvm-branch-commits] [clang] 4376cfa - Revert "[clang][docs] Generate command line reference as Markdown (#220385)"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Sep 8 02:28:56 PDT 2026
Author: Tom Eccles
Date: 2026-09-08T10:28:51+01:00
New Revision: 4376cfa11801744b17dc94580a372e1ea38e68f4
URL: https://github.com/llvm/llvm-project/commit/4376cfa11801744b17dc94580a372e1ea38e68f4
DIFF: https://github.com/llvm/llvm-project/commit/4376cfa11801744b17dc94580a372e1ea38e68f4.diff
LOG: Revert "[clang][docs] Generate command line reference as Markdown (#220385)"
This reverts commit 2cbdbc9ad7ff40457023c8f353161069df8eb57f.
Added:
Modified:
clang/docs/CMakeLists.txt
clang/include/clang/Options/ClangOptionDocs.td
clang/include/clang/Options/Options.td
clang/utils/TableGen/ClangOptionDocEmitter.cpp
Removed:
################################################################################
diff --git a/clang/docs/CMakeLists.txt b/clang/docs/CMakeLists.txt
index 40e65114557aa..09dd4e5a60fa7 100644
--- a/clang/docs/CMakeLists.txt
+++ b/clang/docs/CMakeLists.txt
@@ -80,7 +80,7 @@ if (LLVM_ENABLE_DOXYGEN)
endif()
endif()
-function (gen_sphinx_file_from_td output_file td_option source docs_targets)
+function (gen_rst_file_from_td output_file td_option source docs_targets)
if (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${source}")
message(FATAL_ERROR "Cannot find source file: ${source} in ${CMAKE_CURRENT_SOURCE_DIR}")
endif()
@@ -106,7 +106,7 @@ if (LLVM_ENABLE_SPHINX)
AttributeReference.md
DiagnosticsReference.rst
AMDGPUBuiltinReference.rst
- ClangCommandLineReference.md
+ ClangCommandLineReference.rst
analyzer/user-docs/Options.rst)
add_sphinx_source_sync_target(copy-clang-rst-docs
"${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}"
@@ -145,10 +145,10 @@ if (LLVM_ENABLE_SPHINX)
endif()
# Generated files
- gen_sphinx_file_from_td(AttributeReference.md -gen-attr-docs ../include/clang/Basic/Attr.td "${docs_targets}")
- gen_sphinx_file_from_td(DiagnosticsReference.rst -gen-diag-docs ../include/clang/Basic/Diagnostic.td "${docs_targets}")
- gen_sphinx_file_from_td(AMDGPUBuiltinReference.rst -gen-builtin-docs ../include/clang/Basic/BuiltinsAMDGPU.td "${docs_targets}")
- gen_sphinx_file_from_td(ClangCommandLineReference.md -gen-opt-docs ../include/clang/Options/ClangOptionDocs.td "${docs_targets}")
+ gen_rst_file_from_td(AttributeReference.md -gen-attr-docs ../include/clang/Basic/Attr.td "${docs_targets}")
+ gen_rst_file_from_td(DiagnosticsReference.rst -gen-diag-docs ../include/clang/Basic/Diagnostic.td "${docs_targets}")
+ gen_rst_file_from_td(AMDGPUBuiltinReference.rst -gen-builtin-docs ../include/clang/Basic/BuiltinsAMDGPU.td "${docs_targets}")
+ gen_rst_file_from_td(ClangCommandLineReference.rst -gen-opt-docs ../include/clang/Options/ClangOptionDocs.td "${docs_targets}")
# Another generated file from a
diff erent source
set(docs_tools_dir ${CMAKE_CURRENT_SOURCE_DIR}/tools)
diff --git a/clang/include/clang/Options/ClangOptionDocs.td b/clang/include/clang/Options/ClangOptionDocs.td
index ea79668527e8a..dea6a7ccb12c9 100644
--- a/clang/include/clang/Options/ClangOptionDocs.td
+++ b/clang/include/clang/Options/ClangOptionDocs.td
@@ -7,22 +7,23 @@
//===----------------------------------------------------------------------===//
def GlobalDocumentation {
- code Intro =[{%
-% -------------------------------------------------------------------
-% NOTE: This file is automatically generated by running clang-tblgen
-% -gen-opt-docs. Do not edit this file by hand!!
-% -------------------------------------------------------------------
+ code Intro =[{..
+ -------------------------------------------------------------------
+ NOTE: This file is automatically generated by running clang-tblgen
+ -gen-opt-docs. Do not edit this file by hand!!
+ -------------------------------------------------------------------
-# Clang command line argument reference
+=====================================
+Clang command line argument reference
+=====================================
+.. contents::
+ :local:
-```{contents}
-:local:
-```
-
-## Introduction
+Introduction
+============
This page lists the command line arguments currently supported by the
-GCC-compatible `clang` and `clang++` drivers.
+GCC-compatible ``clang`` and ``clang++`` drivers.
}];
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index 37e5c3199a003..e991dba448033 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -100,11 +100,10 @@ def DXCOption : OptionVisibility;
/////////
// Docs
-// A short name to show in documentation. The name will be interpreted as
-// Markdown.
+// A short name to show in documentation. The name will be interpreted as rST.
class DocName<string name> { string DocName = name; }
-// A brief description to show in documentation, interpreted as Markdown.
+// A brief description to show in documentation, interpreted as rST.
class DocBrief<code descr> { code DocBrief = descr; }
// Indicates that this group should be flattened into its parent when generating
@@ -134,7 +133,7 @@ Flags controlling the behavior of the %Program preprocessor.}]>.str>;
def IncludePath_Group : OptionGroup<"<I/i group>">, Group<Preprocessor_Group>,
DocName<"Include path management">,
DocBrief<[{
-Flags controlling how `#include`s are resolved to files.}]>;
+Flags controlling how ``#include``\s are resolved to files.}]>;
def I_Group : OptionGroup<"<I group>">, Group<IncludePath_Group>, DocFlatten;
def i_Group : OptionGroup<"<i group>">, Group<IncludePath_Group>, DocFlatten;
@@ -142,7 +141,7 @@ def clang_i_Group : OptionGroup<"<clang i group>">, Group<i_Group>, DocFlatten;
def M_Group : OptionGroup<"<M group>">, Group<Preprocessor_Group>,
DocName<"Dependency file generation">, DocBrief<[{
-Flags controlling generation of a dependency file for `make`-like build
+Flags controlling generation of a dependency file for ``make``-like build
systems.}]>;
def d_Group : OptionGroup<"<d group>">, Group<Preprocessor_Group>,
@@ -155,7 +154,7 @@ def Diag_Group : OptionGroup<"<W/R group>">, Group<CompileOnly_Group>,
"Flags controlling which warnings, errors, and remarks %Program will generate. ">.str,
// When in clang link directly to the page.
!cond(!eq(GlobalDocumentation.Program, "Clang"):
-"See the {doc}`full list of warning and remark flags <DiagnosticsReference>`.",
+"See the :doc:`full list of warning and remark flags <DiagnosticsReference>`.",
// When elsewhere the link will not work.
true:
"See Clang's Diagnostic Reference for a full list of warning and remark flags."))>;
@@ -283,7 +282,7 @@ Flags controlling the behavior of the Scalable Static Analysis Framework (SSAF).
// invoking GCC to compile Fortran code.
def gfortran_Group : OptionGroup<"<gfortran group>">,
DocName<"Fortran compilation options">, DocBrief<[{
-Flags that will be passed onto the `gfortran` compiler when Clang is given
+Flags that will be passed onto the ``gfortran`` compiler when Clang is given
a Fortran input.}]>;
def Link_Group : OptionGroup<"<T/e/s/t/u group>">, DocName<"Linker options">,
@@ -784,8 +783,8 @@ def H : Flag<["-"], "H">, Visibility<[ClangOption, CC1Option]>,
def fshow_skipped_includes : Flag<["-"], "fshow-skipped-includes">,
Visibility<[ClangOption, CC1Option]>,
HelpText<"Show skipped includes in -H output.">,
- DocBrief<[{`#include` files may be "skipped" due to include guard optimization
-or `#pragma once`. This flag makes `-H` show also such includes.}]>,
+ DocBrief<[{#include files may be "skipped" due to include guard optimization
+ or #pragma once. This flag makes -H show also such includes.}]>,
MarshallingInfoFlag<DependencyOutputOpts<"ShowSkippedHeaderIncludes">>;
def I_ : Flag<["-"], "I-">, Group<I_Group>, IgnoredGCCCompat,
@@ -1056,13 +1055,13 @@ def Xarch__
HelpText<"Pass <arg> to the compilation if the target matches <arch>">,
DocBrief<
[{Specifies that the argument should only be used if the compilation
-target matches the specified architecture. This can be used with the target
-CPU, triple architecture, or offloading host and device. It is most useful
-for separating behavior undesirable on one of the targets when combining many
-compilation jobs, as is common with offloading. For example, `-Xarch_x86_64`,
-`-Xarch_gfx90a`, and `-Xarch_device` are all valid selectors. `-Xarch_device` will
-forward the argument to the offloading device while `-Xarch_host` will target
-the host system, which can be used to suppress incompatible GPU arguments.}]>,
+ target matches the specified architecture. This can be used with the target
+ CPU, triple architecture, or offloading host and device. It is most useful
+ for separating behavior undesirable on one of the targets when combining many
+ compilation jobs, as is common with offloading. For example, -Xarch_x86_64,
+ -Xarch_gfx90a, and -Xarch_device are all valid selectors. -Xarch_device will
+ forward the argument to the offloading device while -Xarch_host will target
+ the host system, which can be used to suppress incompatible GPU arguments.}]>,
MetaVarName<"<arch> <arg>">;
def Xarch_host : Separate<["-"], "Xarch_host">, Flags<[NoXarchOption]>,
HelpText<"Pass <arg> to host compilation in the offloading toolchain">, MetaVarName<"<arg>">;
@@ -1736,10 +1735,10 @@ def fstrict_flex_arrays_EQ : Joined<["-"], "fstrict-flex-arrays=">, Group<f_Grou
NormalizedValuesScope<"LangOptions::StrictFlexArraysLevelKind">,
NormalizedValues<["Default", "OneZeroOrIncomplete", "ZeroOrIncomplete", "IncompleteOnly"]>,
HelpText<"Enable optimizations based on the strict definition of flexible arrays.">,
- DocBrief<[{If `<n>` is equal to 0, any trailing array member is considered a flexible array.
-If `<n>` is equal to 1, trailing array members of size 0, 1 or undefined are considered flexible arrays.
-If `<n>` is equal to 2, trailing array members of size 0 or undefined are considered flexible arrays.
-If `<n>` is equal to 3, only trailing array members of undefined size are considered flexible arrays.}]>,
+ DocBrief<[{If ``<n>`` is equal to 0, any trailing array member is considered a flexible array.
+ If ``<n>`` is equal to 1, trailing array members of size 0, 1 or undefined are considered flexible arrays.
+ If ``<n>`` is equal to 2, trailing array members of size 0 or undefined are considered flexible arrays.
+ If ``<n>`` is equal to 3, only trailing array members of undefined size are considered flexible arrays.}]>,
MarshallingInfoEnum<LangOpts<"StrictFlexArraysLevel">, "Default">;
defm apple_pragma_pack : BoolFOption<"apple-pragma-pack",
LangOpts<"ApplePragmaPack">, DefaultFalse,
@@ -1888,18 +1887,18 @@ def fprofile_sample_accurate : Flag<["-"], "fprofile-sample-accurate">,
Visibility<[ClangOption, CC1Option]>,
HelpText<"Specifies that the sample profile is accurate">,
DocBrief<[{Specifies that the sample profile is accurate. If the sample
-profile is accurate, callsites without profile samples are marked
-as cold. Otherwise, treat callsites without profile samples as if
-we have no profile}]>,
+ profile is accurate, callsites without profile samples are marked
+ as cold. Otherwise, treat callsites without profile samples as if
+ we have no profile}]>,
MarshallingInfoFlag<CodeGenOpts<"ProfileSampleAccurate">>;
def fsample_profile_use_profi : Flag<["-"], "fsample-profile-use-profi">,
Visibility<[ClangOption, CC1Option]>,
Group<f_Group>,
HelpText<"Use profi to infer block and edge counts">,
DocBrief<[{Infer block and edge counts. If the profiles have errors or missing
-blocks caused by sampling, profile inference (profi) can convert
-basic block counts to branch probabilities to fix them by extended
-and re-engineered classic MCMF (min-cost max-flow) approach.}]>;
+ blocks caused by sampling, profile inference (profi) can convert
+ basic block counts to branch probabilities to fix them by extended
+ and re-engineered classic MCMF (min-cost max-flow) approach.}]>;
def fno_profile_sample_accurate : Flag<["-"], "fno-profile-sample-accurate">, Group<f_Group>;
def fno_sample_profile_use_profi : Flag<["-"], "fno-sample-profile-use-profi">,
Group<f_Group>;
@@ -2794,14 +2793,14 @@ defm sanitize_address_poison_custom_array_cookie : BoolOption<"f", "sanitize-add
NegFlag<SetFalse, [], [ClangOption], "Disable">,
BothFlags<[], [ClangOption], " poisoning array cookies when using custom operator new[] in AddressSanitizer">>,
DocBrief<[{Enable "poisoning" array cookies when allocating arrays with a
-custom operator new[] in Address Sanitizer, preventing accesses to the
+custom operator new\[\] in Address Sanitizer, preventing accesses to the
cookies from user code. An array cookie is a small implementation-defined
header added to certain array allocations to record metadata such as the
length of the array. Accesses to array cookies from user code are technically
allowed by the standard but are more likely to be the result of an
out-of-bounds array access.
-An operator new[] is "custom" if it is not one of the allocation functions
+An operator new\[\] is "custom" if it is not one of the allocation functions
provided by the C++ standard library. Array cookies from non-custom allocation
functions are always poisoned.}]>,
Group<f_clang_Group>;
@@ -4789,8 +4788,8 @@ def ftime_trace : Flag<["-"], "ftime-trace">, Group<f_Group>,
HelpText<"Turn on time profiler. Generates JSON file based on output filename.">,
DocBrief<[{
Turn on time profiler. Generates JSON file based on output filename. Results
-can be analyzed with chrome://tracing or [Speedscope App](https://www.speedscope.app)
-for flamegraph visualization.}]>,
+can be analyzed with chrome://tracing or `Speedscope App
+<https://www.speedscope.app>`_ for flamegraph visualization.}]>,
Visibility<[ClangOption, CLOption, DXCOption]>;
def ftime_trace_granularity_EQ : Joined<["-"], "ftime-trace-granularity=">, Group<f_Group>,
HelpText<"Minimum time granularity (in microseconds) traced by time profiler">,
@@ -5007,7 +5006,7 @@ def fdefined_pointer_subtraction :
"When subtracting two pointers, do not assume that the byte
diff erence is an "
"exact multiple of the pointee type size, thereby preventing such subtraction "
"from resulting in undefined behavior. Users should prefer casting pointers "
- "to `char *` before subtracting them rather than relying on this flag."
+ "to ``char *`` before subtracting them rather than relying on this flag."
>,
MarshallingInfoFlag<LangOpts<"StablePointerSubtraction">>;
def fno_wrapv_pointer : Flag<["-"], "fno-wrapv-pointer">, Group<f_Group>,
@@ -5389,9 +5388,9 @@ defm structor_decl_linkage_names
"declarations in DWARF.">,
BothFlags<[], [ClangOption, CLOption, CC1Option]>>,
Group<g_flags_Group>,
- DocBrief<[{On some ABIs (e.g., Itanium), constructors and destructors may have multiple variants. Historically, when generating DWARF, Clang did not attach `DW_AT_linkage_name` to structor DIEs because there were multiple possible manglings (depending on the structor variant) that could be used. With `-gstructor-decl-linkage-names`, for ABIs with structor variants, we attach a "unified" mangled name to structor declarations DIEs which debuggers can use to look up all the definitions for a structor declaration. E.g., a "unified" mangled name `_ZN3FooC4Ev` may have multiple definitions associated with it such as `_ZN3FooC1Ev` and `_ZN3FooC2Ev`.
+ DocBrief<[{On some ABIs (e.g., Itanium), constructors and destructors may have multiple variants. Historically, when generating DWARF, Clang did not attach ``DW_AT_linkage_name`` to structor DIEs because there were multiple possible manglings (depending on the structor variant) that could be used. With ``-gstructor-decl-linkage-names``, for ABIs with structor variants, we attach a "unified" mangled name to structor declarations DIEs which debuggers can use to look up all the definitions for a structor declaration. E.g., a "unified" mangled name ``_ZN3FooC4Ev`` may have multiple definitions associated with it such as ``_ZN3FooC1Ev`` and ``_ZN3FooC2Ev``.
-Enabling this flag results in a better interactive debugging experience (both GDB and LLDB have support for understanding these "unified" linkage names). However, it comes with a significant increase in debug-info size (particularly the `.debug_str` section). As an escape hatch, users can disable this feature using `-gno-structor-decl-linkage-names`.}]>;
+Enabling this flag results in a better interactive debugging experience (both GDB and LLDB have support for understanding these "unified" linkage names). However, it comes with a significant increase in debug-info size (particularly the `.debug_str` section). As an escape hatch, users can disable this feature using ``-gno-structor-decl-linkage-names``.}]>;
defm key_instructions : BoolGOption<"key-instructions",
CodeGenOpts<"DebugKeyInstructions">, DefaultFalse,
NegFlag<SetFalse>, PosFlag<SetTrue, [], [],
diff --git a/clang/utils/TableGen/ClangOptionDocEmitter.cpp b/clang/utils/TableGen/ClangOptionDocEmitter.cpp
index 74ddb6b276671..f790a496ead6a 100644
--- a/clang/utils/TableGen/ClangOptionDocEmitter.cpp
+++ b/clang/utils/TableGen/ClangOptionDocEmitter.cpp
@@ -195,12 +195,12 @@ unsigned getNumArgsForKind(const Record *OptionKind, const Record *Option) {
.Default(0);
}
-std::string escapePlainTextForMarkdown(StringRef Str) {
+std::string escapeRST(StringRef Str) {
std::string Out;
- for (char C : Str) {
- if (StringRef("*[]\\<>").count(C))
+ for (auto K : Str) {
+ if (StringRef("`*|[]\\").count(K))
Out.push_back('\\');
- Out.push_back(C);
+ Out.push_back(K);
}
return Out;
}
@@ -219,42 +219,37 @@ bool canSphinxCopeWithOption(const Record *Option) {
}
void emitHeading(int Depth, const std::string &Heading, raw_ostream &OS) {
- assert(Depth < 5 && "groups nested too deeply");
- OS << std::string(Depth + 2, '#') << ' ' << Heading << "\n\n";
+ assert(Depth < 8 && "groups nested too deeply");
+ OS << Heading << '\n'
+ << std::string(Heading.size(), "=~-_'+<>"[Depth]) << "\n";
}
/// Get the value of field \p Primary, if possible. If \p Primary does not
-/// exist, get the value of \p Fallback and escape it for Markdown emission.
-std::string getMarkdownStringWithTextFallback(const Record *R,
- StringRef Primary,
- StringRef Fallback) {
+/// exist, get the value of \p Fallback and escape it for rST emission.
+std::string getRSTStringWithTextFallback(const Record *R, StringRef Primary,
+ StringRef Fallback) {
for (auto Field : {Primary, Fallback}) {
if (auto *V = R->getValue(Field)) {
StringRef Value;
if (auto *SV = dyn_cast_or_null<StringInit>(V->getValue()))
Value = SV->getValue();
if (!Value.empty())
- return Field == Primary ? Value.str()
- : escapePlainTextForMarkdown(Value);
+ return Field == Primary ? Value.str() : escapeRST(Value);
}
}
return std::string(StringRef());
}
-// The Sphinx option directive contents do not need to be escaped. They use
-// standard usage conventions, where angle brackets are values, and square
-// brackets are optional arguments. See
-// https://www.sphinx-doc.org/en/master/usage/domains/standard.html#directive-option
void emitOptionWithArgs(StringRef Prefix, const Record *Option,
ArrayRef<StringRef> Args, raw_ostream &OS) {
- OS << Prefix << Option->getValueAsString("Name");
+ OS << Prefix << escapeRST(Option->getValueAsString("Name"));
std::pair<StringRef, StringRef> Separators =
getSeparatorsForKind(Option->getValueAsDef("Kind"));
StringRef Separator = Separators.first;
for (auto Arg : Args) {
- OS << Separator << Arg;
+ OS << Separator << escapeRST(Arg);
Separator = Separators.second;
}
}
@@ -351,15 +346,17 @@ void emitOption(const DocumentedOption &Option, const Record *DocInfo,
std::string Program = DocInfo->getValueAsString("Program").lower();
if (SphinxWorkaroundSuffix)
- OS << "```{program} " << Program << SphinxWorkaroundSuffix << "\n```\n\n";
+ OS << ".. program:: " << Program << SphinxWorkaroundSuffix << "\n";
// Emit the names of the option.
- OS << ":::{option} ";
+ OS << ".. option:: ";
bool EmittedAny = false;
forEachOptionName(Option, DocInfo, [&](const Record *Option) {
EmittedAny = emitOptionNames(Option, OS, EmittedAny);
});
- OS << "\n:::\n\n";
+ if (SphinxWorkaroundSuffix)
+ OS << "\n.. program:: " << Program;
+ OS << "\n\n";
// Emit the description, if we have one.
const Record *R = Option.Option;
@@ -379,8 +376,7 @@ void emitOption(const DocumentedOption &Option, const Record *DocInfo,
for (const Init *Visibility : Visibilities) {
if (Visibility->getAsUnquotedString() == DocInfoMask) {
// Use the first one we find.
- Description = escapePlainTextForMarkdown(
- VisibilityHelp->getValueAsString("Text"));
+ Description = escapeRST(VisibilityHelp->getValueAsString("Text"));
break;
}
}
@@ -394,7 +390,7 @@ void emitOption(const DocumentedOption &Option, const Record *DocInfo,
// If there's not a program specific string, use the default one.
if (Description.empty())
- Description = getMarkdownStringWithTextFallback(R, "DocBrief", "HelpText");
+ Description = getRSTStringWithTextFallback(R, "DocBrief", "HelpText");
if (!isa<UnsetInit>(R->getValueInit("Values"))) {
if (!Description.empty() && Description.back() != '.')
@@ -408,23 +404,16 @@ void emitOption(const DocumentedOption &Option, const Record *DocInfo,
SmallVector<StringRef> Values;
SplitString(R->getValueAsString("Values"), Values, ",");
- Description += " " + escapePlainTextForMarkdown(MetaVarName) + " must be '";
+ Description += (" " + MetaVarName + " must be '").str();
if (Values.size() > 1) {
- for (auto [I, Value] : enumerate(drop_end(Values))) {
- if (I)
- Description += "', '";
- Description += escapePlainTextForMarkdown(Value);
- }
+ Description += join(Values.begin(), Values.end() - 1, "', '");
Description += "' or '";
}
- Description += escapePlainTextForMarkdown(Values.back()) + "'.";
+ Description += (Values.back() + "'.").str();
}
if (!Description.empty())
OS << Description << "\n\n";
-
- if (SphinxWorkaroundSuffix)
- OS << "```{program} " << Program << "\n```\n\n";
}
void emitDocumentation(int Depth, const Documentation &Doc,
@@ -433,12 +422,11 @@ void emitDocumentation(int Depth, const Documentation &Doc,
void emitGroup(int Depth, const DocumentedGroup &Group, const Record *DocInfo,
raw_ostream &OS) {
emitHeading(Depth,
- getMarkdownStringWithTextFallback(Group.Group, "DocName", "Name"),
- OS);
+ getRSTStringWithTextFallback(Group.Group, "DocName", "Name"), OS);
// Emit the description, if we have one.
std::string Description =
- getMarkdownStringWithTextFallback(Group.Group, "DocBrief", "HelpText");
+ getRSTStringWithTextFallback(Group.Group, "DocBrief", "HelpText");
if (!Description.empty())
OS << Description << "\n\n";
@@ -464,8 +452,7 @@ void clang::EmitClangOptDocs(const RecordKeeper &Records, raw_ostream &OS) {
return;
}
OS << DocInfo->getValueAsString("Intro") << "\n";
- OS << "```{program} " << DocInfo->getValueAsString("Program").lower()
- << "\n```\n\n";
+ OS << ".. program:: " << DocInfo->getValueAsString("Program").lower() << "\n";
emitDocumentation(0, extractDocumentation(Records, DocInfo), DocInfo, OS);
}
More information about the llvm-branch-commits
mailing list