[llvm] [Offload] Add Offload API Sphinx documentation (PR #147323)
Kenneth Benzie via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 8 02:27:56 PDT 2025
https://github.com/kbenzie updated https://github.com/llvm/llvm-project/pull/147323
>From 646a5a3ceafcc5cf1972c6d9c59eed7cb7321ed3 Mon Sep 17 00:00:00 2001
From: "Kenneth Benzie (Benie)" <k.benzie83 at gmail.com>
Date: Mon, 7 Jul 2025 16:13:30 +0100
Subject: [PATCH 1/3] [Offload] Add spec generation to offload-tblgen tool
This patch adds generation of Sphinx compatible reStructuedText
utilizing the C domain to document the Offload API directly from the
spec definition `.td` files.
---
offload/tools/offload-tblgen/APIGen.cpp | 2 +-
offload/tools/offload-tblgen/CMakeLists.txt | 1 +
offload/tools/offload-tblgen/GenCommon.hpp | 5 +
offload/tools/offload-tblgen/Generators.hpp | 1 +
offload/tools/offload-tblgen/SpecGen.cpp | 192 ++++++++++++++++++
.../tools/offload-tblgen/offload-tblgen.cpp | 6 +
6 files changed, 206 insertions(+), 1 deletion(-)
create mode 100644 offload/tools/offload-tblgen/SpecGen.cpp
diff --git a/offload/tools/offload-tblgen/APIGen.cpp b/offload/tools/offload-tblgen/APIGen.cpp
index 35b080e3c8011..db92e4019e666 100644
--- a/offload/tools/offload-tblgen/APIGen.cpp
+++ b/offload/tools/offload-tblgen/APIGen.cpp
@@ -48,7 +48,7 @@ static void ProcessHandle(const HandleRec &H, raw_ostream &OS) {
exit(1);
}
- auto ImplName = H.getName().substr(0, H.getName().size() - 9) + "_impl_t";
+ auto ImplName = getHandleImplName(H);
OS << CommentsHeader;
OS << formatv("/// @brief {0}\n", H.getDesc());
OS << formatv("typedef struct {0} *{1};\n", ImplName, H.getName());
diff --git a/offload/tools/offload-tblgen/CMakeLists.txt b/offload/tools/offload-tblgen/CMakeLists.txt
index 613b166d62b4d..01ef87941e733 100644
--- a/offload/tools/offload-tblgen/CMakeLists.txt
+++ b/offload/tools/offload-tblgen/CMakeLists.txt
@@ -12,6 +12,7 @@ set(LLVM_LINK_COMPONENTS Support)
add_tablegen(offload-tblgen OFFLOAD
EXPORT OFFLOAD
APIGen.cpp
+ SpecGen.cpp
EntryPointGen.cpp
MiscGen.cpp
GenCommon.hpp
diff --git a/offload/tools/offload-tblgen/GenCommon.hpp b/offload/tools/offload-tblgen/GenCommon.hpp
index db432e9958b5d..b57f96ad0c456 100644
--- a/offload/tools/offload-tblgen/GenCommon.hpp
+++ b/offload/tools/offload-tblgen/GenCommon.hpp
@@ -65,3 +65,8 @@ MakeParamComment(const llvm::offload::tblgen::ParamRec &Param) {
(Param.isOut() ? "[out]" : ""),
(Param.isOpt() ? "[optional]" : ""), Param.getDesc());
}
+
+inline std::string
+getHandleImplName(const llvm::offload::tblgen::HandleRec &H) {
+ return (H.getName().substr(0, H.getName().size() - 9) + "_impl_t").str();
+}
diff --git a/offload/tools/offload-tblgen/Generators.hpp b/offload/tools/offload-tblgen/Generators.hpp
index f3474dfc52e86..a3db6d1adb242 100644
--- a/offload/tools/offload-tblgen/Generators.hpp
+++ b/offload/tools/offload-tblgen/Generators.hpp
@@ -11,6 +11,7 @@
#include "llvm/TableGen/Record.h"
void EmitOffloadAPI(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS);
+void EmitOffloadSpec(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS);
void EmitOffloadFuncNames(const llvm::RecordKeeper &Records,
llvm::raw_ostream &OS);
void EmitOffloadImplFuncDecls(const llvm::RecordKeeper &Records,
diff --git a/offload/tools/offload-tblgen/SpecGen.cpp b/offload/tools/offload-tblgen/SpecGen.cpp
new file mode 100644
index 0000000000000..fe13cf8abe8e7
--- /dev/null
+++ b/offload/tools/offload-tblgen/SpecGen.cpp
@@ -0,0 +1,192 @@
+//===- offload-tblgen/APIGen.cpp - Tablegen backend for Offload header ----===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This is a Tablegen backend that produces the contents of the Offload API
+// specification. The generated reStructureText is Sphinx compatible, see
+// https://www.sphinx-doc.org/en/master/usage/domains/c.html for further
+// details on the C language domain.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/Support/FormatVariadic.h"
+#include "llvm/TableGen/Record.h"
+#include "llvm/TableGen/TableGenBackend.h"
+
+#include "GenCommon.hpp"
+#include "RecordTypes.hpp"
+
+using namespace llvm;
+using namespace offload::tblgen;
+
+namespace {
+std::string makeFunctionSignature(StringRef RetTy, StringRef Name,
+ ArrayRef<ParamRec> Params) {
+ std::string S;
+ raw_string_ostream OS{S};
+ OS << RetTy << " " << Name << "(";
+ for (const auto &Param : Params) {
+ OS << Param.getType() << " " << Param.getName();
+ if (Param != Params.back()) {
+ OS << ", ";
+ }
+ }
+ OS << ")";
+ return S;
+}
+
+std::string makeDoubleBackticks(StringRef R) {
+ std::string S;
+ for (char C : R) {
+ if (C == '`') {
+ S.push_back('`');
+ }
+ S.push_back(C);
+ }
+ return S;
+}
+
+void processMacro(const MacroRec &M, raw_ostream &OS) {
+ OS << formatv(".. c:macro:: {0}\n\n", M.getNameWithArgs());
+ OS << " " << M.getDesc() << "\n\n";
+}
+
+void processTypedef(const TypedefRec &T, raw_ostream &OS) {
+ OS << formatv(".. c:type:: {0} {1}\n\n", T.getValue(), T.getName());
+ OS << " " << T.getDesc() << "\n\n";
+}
+
+void processHandle(const HandleRec &H, raw_ostream &OS) {
+
+ OS << formatv(".. c:type:: struct {0} *{1}\n\n", getHandleImplName(H),
+ H.getName());
+ OS << " " << H.getDesc() << "\n\n";
+}
+
+void processFptrTypedef(const FptrTypedefRec &F, raw_ostream &OS) {
+ OS << ".. c:type:: "
+ << makeFunctionSignature(F.getReturn(),
+ StringRef{formatv("(*{0})", F.getName())},
+ F.getParams())
+ << "\n\n";
+ for (auto &P : F.getParams()) {
+ OS << formatv(" :param {0}: {1}\n", P.getName(), P.getDesc());
+ }
+ OS << "\n";
+}
+
+void processEnum(const EnumRec &E, raw_ostream &OS) {
+ OS << formatv(".. c:enum:: {0}\n\n", E.getName());
+ OS << " " << E.getDesc() << "\n\n";
+ for (auto Etor : E.getValues()) {
+ OS << formatv(" .. c:enumerator:: {0}_{1}\n\n", E.getEnumValNamePrefix(),
+ Etor.getName());
+ OS << " " << Etor.getDesc() << "\n\n";
+ }
+}
+
+void processStruct(const StructRec &S, raw_ostream &OS) {
+ OS << formatv(".. c:struct:: {0}\n\n", S.getName());
+ OS << " " << S.getDesc() << "\n\n";
+ for (auto &M : S.getMembers()) {
+ OS << formatv(" .. c:member:: {0} {1}\n\n", M.getType(), M.getName());
+ OS << " " << M.getDesc() << "\n\n";
+ }
+}
+
+void processFunction(const FunctionRec &F, raw_ostream &OS) {
+ OS << ".. c:function:: "
+ << makeFunctionSignature({formatv("{0}_result_t", PrefixLower)},
+ F.getName(), F.getParams())
+ << "\n\n";
+
+ OS << " " << F.getDesc() << "\n\n";
+ for (auto D : F.getDetails()) {
+ OS << " " << D << "\n";
+ }
+ if (!F.getDetails().empty()) {
+ OS << "\n";
+ }
+
+ for (auto &P : F.getParams()) {
+ OS << formatv(" :param {0}: {1}\n", P.getName(), P.getDesc());
+ }
+
+ for (auto &R : F.getReturns()) {
+ OS << formatv(" :retval {0}:\n", R.getValue());
+ for (auto &C : R.getConditions()) {
+ OS << " * ";
+ if (C.starts_with("`") && C.ends_with("`")) {
+ OS << ":c:expr:" << C;
+ } else {
+ OS << makeDoubleBackticks(C);
+ }
+ OS << "\n";
+ }
+ }
+ OS << "\n";
+}
+} // namespace
+
+void EmitOffloadSpec(const RecordKeeper &Records, raw_ostream &OS) {
+ OS << "Offload API\n";
+ OS << "===========\n\n";
+
+ auto Macros = Records.getAllDerivedDefinitions("Macro");
+ if (!Macros.empty()) {
+ OS << "Macros\n";
+ OS << "------\n\n";
+ for (auto *M : Macros) {
+ processMacro(MacroRec{M}, OS);
+ }
+ }
+
+ auto Handles = Records.getAllDerivedDefinitions("Handle");
+ auto Typedefs = Records.getAllDerivedDefinitions("Typedef");
+ auto FptrTypedefs = Records.getAllDerivedDefinitions("FptrTypedef");
+ if (!Handles.empty() || !Typedefs.empty() || !FptrTypedefs.empty()) {
+ OS << "Type Definitions\n";
+ OS << "----------------\n\n";
+ for (auto *H : Handles) {
+ processHandle(HandleRec{H}, OS);
+ }
+ for (auto *T : Typedefs) {
+ processTypedef(TypedefRec{T}, OS);
+ }
+ for (auto *F : FptrTypedefs) {
+ processFptrTypedef(FptrTypedefRec{F}, OS);
+ }
+ }
+
+ auto Enums = Records.getAllDerivedDefinitions("Enum");
+ OS << "Enums\n";
+ OS << "-----\n\n";
+ if (!Enums.empty()) {
+ for (auto *E : Enums) {
+ processEnum(EnumRec{E}, OS);
+ }
+ }
+
+ auto Structs = Records.getAllDerivedDefinitions("Struct");
+ if (!Structs.empty()) {
+ OS << "Structs\n";
+ OS << "-------\n\n";
+ for (auto *S : Structs) {
+ processStruct(StructRec{S}, OS);
+ }
+ }
+
+ auto Functions = Records.getAllDerivedDefinitions("Function");
+ if (!Functions.empty()) {
+ OS << "Functions\n";
+ OS << "---------\n\n";
+ for (auto *F : Functions) {
+ processFunction(FunctionRec{F}, OS);
+ }
+ }
+}
diff --git a/offload/tools/offload-tblgen/offload-tblgen.cpp b/offload/tools/offload-tblgen/offload-tblgen.cpp
index 83a4af04b8b22..594766d71a6aa 100644
--- a/offload/tools/offload-tblgen/offload-tblgen.cpp
+++ b/offload/tools/offload-tblgen/offload-tblgen.cpp
@@ -26,6 +26,7 @@ enum ActionType {
PrintRecords,
DumpJSON,
GenAPI,
+ GenSpec,
GenFuncNames,
GenImplFuncDecls,
GenEntryPoints,
@@ -43,6 +44,8 @@ cl::opt<ActionType> Action(
clEnumValN(DumpJSON, "dump-json",
"Dump all records as machine-readable JSON"),
clEnumValN(GenAPI, "gen-api", "Generate Offload API header contents"),
+ clEnumValN(GenSpec, "gen-spec",
+ "Generate Offload API specification contents"),
clEnumValN(GenFuncNames, "gen-func-names",
"Generate a list of all Offload API function names"),
clEnumValN(
@@ -69,6 +72,9 @@ static bool OffloadTableGenMain(raw_ostream &OS, const RecordKeeper &Records) {
case GenAPI:
EmitOffloadAPI(Records, OS);
break;
+ case GenSpec:
+ EmitOffloadSpec(Records, OS);
+ break;
case GenFuncNames:
EmitOffloadFuncNames(Records, OS);
break;
>From ef4e5ec60f3a6486f606ebcb5d87338dd35ad99c Mon Sep 17 00:00:00 2001
From: "Kenneth Benzie (Benie)" <k.benzie83 at gmail.com>
Date: Mon, 7 Jul 2025 11:47:32 +0100
Subject: [PATCH 2/3] [Offload] Copy Sphinx llvm-theme from llvm/docs
---
offload/docs/_static/favicon.ico | Bin 0 -> 1150 bytes
offload/docs/_static/llvm.css | 112 ++++++
offload/docs/_themes/llvm-theme/layout.html | 23 ++
.../_themes/llvm-theme/static/contents.png | Bin 0 -> 202 bytes
.../_themes/llvm-theme/static/llvm-theme.css | 374 ++++++++++++++++++
.../docs/_themes/llvm-theme/static/logo.png | Bin 0 -> 9864 bytes
.../_themes/llvm-theme/static/navigation.png | Bin 0 -> 218 bytes
offload/docs/_themes/llvm-theme/theme.conf | 4 +
offload/liboffload/API/Common.td | 15 -
9 files changed, 513 insertions(+), 15 deletions(-)
create mode 100644 offload/docs/_static/favicon.ico
create mode 100644 offload/docs/_static/llvm.css
create mode 100644 offload/docs/_themes/llvm-theme/layout.html
create mode 100644 offload/docs/_themes/llvm-theme/static/contents.png
create mode 100644 offload/docs/_themes/llvm-theme/static/llvm-theme.css
create mode 100644 offload/docs/_themes/llvm-theme/static/logo.png
create mode 100644 offload/docs/_themes/llvm-theme/static/navigation.png
create mode 100644 offload/docs/_themes/llvm-theme/theme.conf
diff --git a/offload/docs/_static/favicon.ico b/offload/docs/_static/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..724ad6e12dd406cd595568426b88aedfd46365f9
GIT binary patch
literal 1150
zcmZQzU<5(|0R|wcz>vYhz#zuJz at P!dKp~(AL>x#lFaYJy!T<mN8EA?B{{71U!-VX4
z`SQ8`nN!E=E?+uV^ZeOUy)U0XnST5FMf>NEAIg9K{NV?ggU<}0-qQQ`@9I5#a5w7W
zg)`m94(*%s?CBHjj~_pXzI*f9osj;&fB!Il`t(u%&!0c+pFe++KX!Qk^7*qS|J}Z6
z&8rvBo at C?G|L*NuS&-X){P at 8-d-~MMGpA1aZ(g^0a%OVOx8;lG{NK54!|`w5zHxr}
z@|g!{K8ioSfBVKZxvyu=^QTWF!~8r>>Z>XI4fpl<Tb!AE_u#%=v(BGAxoYdCHGiuL
zvLA#7_}n|Vcee*}IPBlE%R9)+^=+7s`xR3S#s8+7O8<9mT7Uk>kMELCAKvr-^ZPf?
z*^@`N-Mo6aC??eZueYQ1&0jx%GQ<4S(O5gdR8#qXfUCoQM`PXpQT`r3zJL2FcjfZA
z!kZUQy#TtG|LNlgHE-X%vgm7XK5M3_^mopTDfMq&zZL at dB_%rafR(P=|Cj);|6!g^
z|L0DfxCvzTl}i_9e0cvZ1;oC8>-s{VnWEb^tZfI`;c9LA?aayJHXyh8yV~Ef)>HrQ
zZe{#GKPB$l`O_!bK>mC4`jzLcYgc9iao>xlkJCZs?BBJ$GQ<t&PBVl5JGN{J1?uNq
zyJAUeU0K2T#j~gHynXX}BrpzmVBz!Q`*)$=zkYGS!u;65eO>8MA%AW3HU4kgxIPM|
z4rKQC at 83j!{rbfT6T?P-2Bwc`y&Wfl+#G*hzIfgRrUs-RgkgMKG)N6FP0M}z_EnM?
z^|;KTo;U;0%@F(tNdL13VtEFJ3+xOG2QM=)G#4{4G+hMJmJAI2AA#zABGiNQ0RZmu
B;|2f#
literal 0
HcmV?d00001
diff --git a/offload/docs/_static/llvm.css b/offload/docs/_static/llvm.css
new file mode 100644
index 0000000000000..53eeed95c6c0a
--- /dev/null
+++ b/offload/docs/_static/llvm.css
@@ -0,0 +1,112 @@
+/*
+ * LLVM documentation style sheet
+ */
+
+/* Common styles */
+.body { color: black; background: white; margin: 0 0 0 0 }
+
+/* No borders on image links */
+a:link img, a:visited img { border-style: none }
+
+address img { float: right; width: 88px; height: 31px; }
+address { clear: right; }
+
+table { text-align: center; border: 2px solid black;
+ border-collapse: collapse; margin-top: 1em; margin-left: 1em;
+ margin-right: 1em; margin-bottom: 1em; }
+tr, td { border: 2px solid gray; padding: 4pt 4pt 2pt 2pt; }
+th { border: 2px solid gray; font-weight: bold; font-size: 105%;
+ background: url("lines.gif");
+ font-family: "Georgia,Palatino,Times,Roman,SanSerif";
+ text-align: center; vertical-align: middle; }
+/*
+ * Documentation
+ */
+/* Common for title and header */
+.doc_title, .doc_section, .doc_subsection, h1, h2, h3 {
+ color: black; background: url("lines.gif");
+ font-family: "Georgia,Palatino,Times,Roman,SanSerif"; font-weight: bold;
+ border-width: 1px;
+ border-style: solid none solid none;
+ text-align: center;
+ vertical-align: middle;
+ padding-left: 8pt;
+ padding-top: 1px;
+ padding-bottom: 2px
+}
+
+h1, .doc_title, .title { text-align: left; font-size: 25pt }
+
+h2, .doc_section { text-align: center; font-size: 22pt;
+ margin: 20pt 0pt 5pt 0pt; }
+
+h3, .doc_subsection { width: 75%;
+ text-align: left; font-size: 12pt;
+ padding: 4pt 4pt 4pt 4pt;
+ margin: 1.5em 0.5em 0.5em 0.5em }
+
+h4, .doc_subsubsection { margin: 2.0em 0.5em 0.5em 0.5em;
+ font-weight: bold; font-style: oblique;
+ border-bottom: 1px solid #999999; font-size: 12pt;
+ width: 75%; }
+
+.doc_author { text-align: left; font-weight: bold; padding-left: 20pt }
+.doc_text { text-align: left; padding-left: 20pt; padding-right: 10pt }
+
+.doc_footer { text-align: left; padding: 0 0 0 0 }
+
+.doc_hilite { color: blue; font-weight: bold; }
+
+.doc_table { text-align: center; width: 90%;
+ padding: 1px 1px 1px 1px; border: 1px; }
+
+.doc_warning { color: red; font-weight: bold }
+
+/* <div class="doc_code"> would use this class, and <div> adds more padding */
+.doc_code, .literal-block
+ { border: solid 1px gray; background: #eeeeee;
+ margin: 0 1em 0 1em;
+ padding: 0 1em 0 1em;
+ display: table;
+ }
+
+blockquote pre {
+ padding: 1em 2em 1em 1em;
+ border: solid 1px gray;
+ background: #eeeeee;
+ margin: 0 1em 0 1em;
+ display: table;
+}
+
+h2+div, h2+p {text-align: left; padding-left: 20pt; padding-right: 10pt;}
+h3+div, h3+p {text-align: left; padding-left: 20pt; padding-right: 10pt;}
+h4+div, h4+p {text-align: left; padding-left: 20pt; padding-right: 10pt;}
+
+/* It is preferable to use <pre class="doc_code"> everywhere instead of the
+ * <div class="doc_code"><pre>...</ptr></div> construct.
+ *
+ * Once all docs use <pre> for code regions, this style can be merged with the
+ * one above, and we can drop the [pre] qualifier.
+ */
+pre.doc_code, .literal-block { padding: 1em 2em 1em 1em }
+
+.doc_notes { background: #fafafa; border: 1px solid #cecece;
+ display: table; padding: 0 1em 0 .1em }
+
+table.layout { text-align: left; border: none; border-collapse: collapse;
+ padding: 4px 4px 4px 4px; }
+tr.layout, td.layout, td.left, td.right
+ { border: none; padding: 4pt 4pt 2pt 2pt; vertical-align: top; }
+td.left { text-align: left }
+td.right { text-align: right }
+th.layout { border: none; font-weight: bold; font-size: 105%;
+ text-align: center; vertical-align: middle; }
+
+/* Left align table cell */
+.td_left { border: 2px solid gray; text-align: left; }
+
+/* ReST-specific */
+.title { margin-top: 0 }
+.topic-title{ display: none }
+div.contents ul { list-style-type: decimal }
+.toc-backref { color: black; text-decoration: none; }
diff --git a/offload/docs/_themes/llvm-theme/layout.html b/offload/docs/_themes/llvm-theme/layout.html
new file mode 100644
index 0000000000000..746c2f56c82ae
--- /dev/null
+++ b/offload/docs/_themes/llvm-theme/layout.html
@@ -0,0 +1,23 @@
+{#
+ sphinxdoc/layout.html
+ ~~~~~~~~~~~~~~~~~~~~~
+
+ Sphinx layout template for the sphinxdoc theme.
+
+ :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{% extends "basic/layout.html" %}
+
+{% block relbar1 %}
+<div class="logo">
+ <a href="{{ pathto('index') }}">
+ <img src="{{pathto("_static/logo.png", 1) }}"
+ alt="LLVM Logo" width="250" height="88"/></a>
+</div>
+{{ super() }}
+{% endblock %}
+
+{# put the sidebar before the body #}
+{% block sidebar1 %}{{ sidebar() }}{% endblock %}
+{% block sidebar2 %}{% endblock %}
diff --git a/offload/docs/_themes/llvm-theme/static/contents.png b/offload/docs/_themes/llvm-theme/static/contents.png
new file mode 100644
index 0000000000000000000000000000000000000000..7fb82154a1748d507925865d3fbf7508d62483e5
GIT binary patch
literal 202
zcmeAS at N?(olHy`uVBq!ia0vp^j6kfx!3HGlw at oMq2^0spJ29*~C-V}>;VkfoEM{Qf
z76xHPhFNnYfP(BLp1!W^HyC+E#mt?nx10eANtU=qlsM<-=BDPAFgO>bCYGe8D3oWG
zWGJ|M`UZqI@`(c#nR~i8hHzY8+H1+jpulh_>fir3VfEN66+L<?4$M=cq8XZmq*xT0
q7F)Q=oS3J(I{(|@x%uL6VqQL2#_By`CBGoh2nJ7AKbLh*2~7Zv?Ki9d
literal 0
HcmV?d00001
diff --git a/offload/docs/_themes/llvm-theme/static/llvm-theme.css b/offload/docs/_themes/llvm-theme/static/llvm-theme.css
new file mode 100644
index 0000000000000..0fc5b261dbd05
--- /dev/null
+++ b/offload/docs/_themes/llvm-theme/static/llvm-theme.css
@@ -0,0 +1,374 @@
+/*
+ * sphinxdoc.css_t
+ * ~~~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- sphinxdoc theme. Originally created by
+ * Armin Ronacher for Werkzeug.
+ *
+ * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+ at import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
+ 'Verdana', sans-serif;
+ font-size: 14px;
+ line-height: 150%;
+ text-align: center;
+ background-color: #BFD1D4;
+ color: black;
+ padding: 0;
+ border: 1px solid #aaa;
+ margin: 0px 80px 0px 80px;
+ min-width: 740px;
+ position: relative;
+}
+
+div.logo {
+ background-color: white;
+ text-align: left;
+ padding: 10px 10px 15px 15px;
+}
+
+div.document {
+ background-color: white;
+ text-align: left;
+ background-image: url(contents.png);
+ background-repeat: repeat-x;
+}
+
+div.bodywrapper {
+ margin: 0 240px 0 0;
+ border-right: 1px solid #ccc;
+}
+
+div.body {
+ margin: 0;
+ padding: 0.5em 20px 20px 20px;
+ max-width: 1000px;
+}
+
+div.related {
+ font-size: 1em;
+}
+
+div.related ul {
+ background-image: url(navigation.png);
+ height: 2em;
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+}
+
+div.related ul li {
+ margin: 0;
+ padding: 0;
+ height: 2em;
+ float: left;
+}
+
+div.related ul li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+div.related ul li a {
+ margin: 0;
+ padding: 0 5px 0 5px;
+ line-height: 1.75em;
+ color: #EE9816;
+}
+
+div.related ul li a:hover {
+ color: #3CA8E7;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 0;
+}
+
+div.sphinxsidebar {
+ margin: 0;
+ padding: 0.5em 15px 15px 0;
+ width: 210px;
+ font-size: 1em;
+ text-align: left;
+ float: none;
+ position: absolute;
+ right: 0;
+}
+
+div.sphinxsidebar h3, div.sphinxsidebar h4 {
+ margin: 1em 0 0.5em 0;
+ font-size: 1em;
+ padding: 0.1em 0 0.1em 0.5em;
+ color: white;
+ border: 1px solid #86989B;
+ background-color: #AFC1C4;
+}
+
+div.sphinxsidebar h3 a {
+ color: white;
+}
+
+div.sphinxsidebar ul {
+ padding-left: 1.5em;
+ margin-top: 7px;
+ padding: 0;
+ line-height: 130%;
+}
+
+div.sphinxsidebar ul ul {
+ margin-left: 20px;
+}
+
+div.footer {
+ background-color: #E3EFF1;
+ color: #86989B;
+ padding: 3px 8px 3px 0;
+ clear: both;
+ font-size: 0.8em;
+ text-align: right;
+}
+
+div.footer a {
+ color: #86989B;
+ text-decoration: underline;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+p {
+ margin: 0.8em 0 0.5em 0;
+}
+
+a {
+ color: #CA7900;
+ text-decoration: none;
+}
+
+a:hover {
+ color: #2491CF;
+}
+
+div.body p a{
+ text-decoration: underline;
+}
+
+h1 {
+ margin: 0;
+ padding: 0.7em 0 0.3em 0;
+ font-size: 1.5em;
+ color: #11557C;
+}
+
+h2 {
+ margin: 1.3em 0 0.2em 0;
+ font-size: 1.35em;
+ padding: 0;
+}
+
+h3 {
+ margin: 1em 0 -0.3em 0;
+ font-size: 1.2em;
+}
+
+h3 a:hover {
+ text-decoration: underline;
+}
+
+div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
+ color: black!important;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+ background-color: #f2f2f2;
+ font-weight: normal;
+ color: #20435c;
+ border-bottom: 1px solid #ccc;
+ margin: 20px -20px 10px -20px;
+ padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {
+ display: none;
+ margin: 0 0 0 0.3em;
+ padding: 0 0.2em 0 0.2em;
+ color: #aaa!important;
+}
+
+h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
+h5:hover a.anchor, h6:hover a.anchor {
+ display: inline;
+}
+
+h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
+h5 a.anchor:hover, h6 a.anchor:hover {
+ color: #777;
+ background-color: #eee;
+}
+
+a.headerlink {
+ color: #c60f0f!important;
+ font-size: 1em;
+ margin-left: 6px;
+ padding: 0 4px 0 4px;
+ text-decoration: none!important;
+}
+
+a.headerlink:hover {
+ background-color: #ccc;
+ color: white!important;
+}
+
+cite, code, tt {
+ font-family: 'Consolas', 'Deja Vu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.95em;
+}
+
+:not(a.reference) > tt {
+ background-color: #f2f2f2;
+ border-bottom: 1px solid #ddd;
+ color: #333;
+}
+
+tt.descname, tt.descclassname, tt.xref {
+ border: 0;
+}
+
+hr {
+ border: 1px solid #abc;
+ margin: 2em;
+}
+
+p a tt {
+ border: 0;
+ color: #CA7900;
+}
+
+p a tt:hover {
+ color: #2491CF;
+}
+
+a tt {
+ border: none;
+}
+
+pre {
+ font-family: 'Consolas', 'Deja Vu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.95em;
+ line-height: 120%;
+ padding: 0.5em;
+ border: 1px solid #ccc;
+ background-color: #f8f8f8;
+}
+
+pre a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+td.linenos pre {
+ padding: 0.5em 0;
+}
+
+div.quotebar {
+ background-color: #f8f8f8;
+ max-width: 250px;
+ float: right;
+ padding: 2px 7px;
+ border: 1px solid #ccc;
+}
+
+div.topic {
+ background-color: #f8f8f8;
+}
+
+table {
+ border-collapse: collapse;
+ margin: 0 -0.5em 0 -0.5em;
+}
+
+table td, table th {
+ padding: 0.2em 0.5em 0.2em 0.5em;
+}
+
+div.admonition, div.warning {
+ font-size: 0.9em;
+ margin: 1em 0 1em 0;
+ border: 1px solid #86989B;
+ background-color: #f7f7f7;
+ padding: 0;
+}
+
+div.admonition p, div.warning p {
+ margin: 0.5em 1em 0.5em 1em;
+ padding: 0;
+}
+
+div.admonition pre, div.warning pre {
+ margin: 0.4em 1em 0.4em 1em;
+}
+
+div.admonition p.admonition-title,
+div.warning p.admonition-title {
+ margin: 0;
+ padding: 0.1em 0 0.1em 0.5em;
+ color: white;
+ border-bottom: 1px solid #86989B;
+ font-weight: bold;
+ background-color: #AFC1C4;
+}
+
+div.warning {
+ border: 1px solid #940000;
+}
+
+div.warning p.admonition-title {
+ background-color: #CF0000;
+ border-bottom-color: #940000;
+}
+
+div.admonition ul, div.admonition ol,
+div.warning ul, div.warning ol {
+ margin: 0.1em 0.5em 0.5em 3em;
+ padding: 0;
+}
+
+div.versioninfo {
+ margin: 1em 0 0 0;
+ border: 1px solid #ccc;
+ background-color: #DDEAF0;
+ padding: 8px;
+ line-height: 1.3em;
+ font-size: 0.9em;
+}
+
+.viewcode-back {
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
+ 'Verdana', sans-serif;
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+}
diff --git a/offload/docs/_themes/llvm-theme/static/logo.png b/offload/docs/_themes/llvm-theme/static/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..18d424c53c09a76f87bf92ff6276155f9b4a1771
GIT binary patch
literal 9864
zcmd^F1ydePvt5E)AZTz69$a4B-QC?GxVr_n;O_1g9-QFr?(Q1g;Xe8P#ywTDUAtR#
zX1b at Rx2I>r739Q`5pWRz06><M5K#ilXK>Sig9Kks4{%Sw0^VLi(+L0&(f>6FAU*Rd
z03gU)3JWVJSlBt+Ia%1*6H5vU6Wcr5nOXiY1pxPzEM;>Q<zp<~hmBhy=`jC9X*(rM
zIASHCNPmnt3K|l4RH-nMyk$(q?k}REP<TVRVURH~{!y5UbVv~hOR#$+`7uESVG$!Q
z+g=6M3+)dF<L`}&e20}cSq+o0U2sUr5-f^r{zzp)gkQFT2KxrK_vi%z5XkKTRJaBc
z5~nvZ2;k9|hliH53$_!0aGynl1G;20x)||8KTuAD(sUsFe?oLQ$NeV_=Z^shc*Y17
z0|H_Y{#mIM%0Mm at U@&TIv<oPF2Mj3v4rT%Wtj9Dj2tYfL1QQ}R4j at K14HE$@xPi(^
zwFpr_gAu?mlkVdLmc9dwlIms>Ky4GyHGzs)55OS-jEZ5w)BuzhU@$~R<_`Q!12Dv{
z)p at RHt5FYWz?Mp@=V>A56b;aZ`|bd%u1-%#H6e*ji@|RA$uM1jzQ-dChdF>1W$R`P
z0CM9n!P?%uxleqqo|s^d0e#m0e)0$AgVe}q_kDk|!d?IXww-;a-{}|{aQ(Sq{B7Rz
zzg<9C=pp91JVct+qX;wtxyLK&H}?N*BbxWCWqEmjZ*NJePe|KvMBV4zyhp!F{q4t-
zFVE}4-B#xgc>uF+fH>6SR?pb2OcDNMJp50iwS!pk*Cxb|SAtp6K1rh%4H}GHMKp&P
zk at Tn=<|5K?p?K>4Z!;ezJDYSbkbIkLK&=%Ygjd}6Qe9)ndud8k4d<?%2LQNkv+JIt
zf`jz82-==>`?%zP6VLqy_?t<_I{<*52sypVNCW>M8~}*q2GG<B;@x(CrR##h?}lFM
zMtn73|0zV?*CT`~gka*2?`S|>87M>*GG0qSW56&cK)~9iXc3ZN|Czo=wfQrzJ<78o
zTy{5AdjLF?;1C?TA<0S at gi(YBSqvO at TJR%Dw*(YgBsuYL7=|LLbR3%mlTw5Vv8n{Y
zHLv3*&QKk();R7VfI09rq+OgTF`!<NcMhphxTTZ>_orAs;*^OqQ+g~`ZpM`3Z(QCe
z_PoQX3Ja8#SU%xF#;&8Uuq=H)80iOkh3fvJgHJFXts|{Osu;knRjY(-3%@g-taF1x
z3lQysXNPhVA~qxxl+cjTkXw={CB`Rb{jvhj0T208v4 at g0p;Y=eMeCQRzOP2iOraVQ
zbYu%?vFHq_USYz09OP)>!pxK{zdlLU6{^gj&4|s|Dv=%2m1VF>;F2W_ub5cZ!*V9l
z5z`I@?`7 at v?y>CQ?U7t-BV-u~I21lA?@%d?SV`gRqwcfr!<eQr3#t~RE3KF2seECJ
z)e@@811Z%ghL)nUx}<ZC2VqG{7ggma&Ei^MTRd3S967gsSx+LAOPNxi89f$1N;!hO
zbwff9!3-J<GpEAI_zL^g9LMczO{z>W&TJ&kpb8 at g(`o8q8cLd-ss;^+#v3zk1R+T(
zi6RM)hC!vQytsU$98vW~byOv`Oi$UTT1=HidAAIHF1bRrJWJtJ8Bf`~jJq_n+`QCI
zg}=~O^DP`kvsb29Ubs*(w@!bzeSjFz7^lIVj>H<dBE%(tt&gH^eA(NTrY-f2pe>TO
zyeyAXm_>?3y+P?F(TpE<H`U=W(^(Gwkg6o*#y4UE<C1!Z8n2jDriIB=$GSW at C0V0F
zqC&Ak{Ir9;`n)8oxI?r}^CjT3;Gh(x4yCwx>;!byq4KiwdI>@amMkyVT{V5VbrD`(
zn~2*V+mega>`p!ZY#F<f4Udk)XM7)qH<dS==aM^dBn_AbByyNlq=~OQ{cH|)JOm7b
zt5=G`y1fFzMTSX+Dce8eTBdml=Eb7LP@*gcbau&iZ3b)x3MgPGNGPObPh>CBm1J9r
zsf)Q~xMc>%$Hw!=7t+`=c$pTN4>Jxk7Be=R47A*}=s=~QW>d-fJ*{HR3sAdluokCg
zk%p?4Zi84=R at JwKwyL(0FC{H<333(L3+BDGSD;}~Srbm}{u0b;HOL0!V`y%KZQj&h
z-FuPHk>Jzn6aB^uiyXTAxq?88z}M-wBL<fm*GBq8<^{h`|84RygSo~e>f{p3E(m>;
zy3aC8Ib&Ab9NWCbDd;9FGF&=vls<)zJ_B!HeW+tk%K6SgciVI3E-RxUqvyPIwdR8T
z!tx??EoY21hdNu6#c8T{NO((ef0`dLCyCK|v(i^ySU$kK at sNzcm?2KRYO%Jd$gTXr
z at DiKvp3gC7mv5JcV}p4^Q-6%3t7)idRKC|PTR(VH*pKYP<iqo08YuDq24M~v9v~Q?
z{psb=)0^Z^3_sVZ>3#k3xnNXoiy)?8Y+zO3es>j##n9QWDw2o8)QPwW%g at 0IzDEmF
zu!aYQk-ff1l)<6F>LL6w_F)>h(@ZIBZqsYRPMadnBFQ2f8Rks#oHgI2*l765>8*HH
zI9gd-`3LCDG{@#OvNR-rNaJ(T(^RwD{^;C%J--Rv$=X5O^}<eN7}B-($eZZ74KBed
zqer9TN*0g_llw36uOKQ-DOS|CYjn47F$f+#1U=@Y4Abn>VN1d~G=y^35;U@&@n>=E
zY#!wOEJbwtEk7yCeznUW%dBT`Wn-ng65BBIa&<5T#mD_}5Gp5;O#qpnm>-zAj#iom
z*T47MMm8}JCczF{H~gxE*8GkD5-L7Y(V|+Ufvq<;RX6)H9zMdET#-#Xem>SPvigf7
z^D^h-9IXd!J04UNBCY<NK;xjJ(u%X5$H8M2VHXpcHbf1klBYQWL}N2AUvaLUQtjJ8
z;VEk!pw~ST*xd+WeTt}xupjJmy0&<(E3d(zx!Gv=9Fm2{hZ!DGjj at WIg6X$JwdTH$
z7iu^1Cv7e9cUeVWi^-(fjM?$Q#`kRP&&lN}2PvOzk(XC~BX6qxKEJycU1dlar&?_b
z0tvSi{NZVCH!T^S80Y3!DO9;tc~)V+m|1T$Tzs^hzQFTpzh^z0U)64Zc;g%HTvdfo
zm7O=6H+_+OX?WnT4lh4`On$M^t&+2GI3I+Zfqa7{`wUuanVTn=;Z;$JU7$S`|2#<4
z`JQ#@_8plWSv5LyV28|J#AEOH0e<s=5SeSmHOi}U8+Mk+mB5^U!AdCoI$bP7IsHZ3
zNV`>jjBk43WW)1Se3b|#la)u)L+VCl*mC7Ka5lmGdNL|2Da*%~{%Or%H6P at 4XgslL
zg<^Nvit4;QBl;0}$lcC8p>y5rd|kh~kFMUVo?gSHZ*$^&!t<UmD?iwl*_K}2qGR21
z;n~sXW%h84m(4M;e%s-3h4ry8pUug;-f`n;_t5`vw~4jx>qz-FG1|85MtM=yF5j+y
zD{wBjEW92%&#(Qywsg7XXVvAFdo#Tz{s0pkH2EHP7mFec9h(+A8iE{hn*ARiC+7~o
z<J<9TiSVS!Bt<s%d;a at qH8vK5@8kUG;>2|7bY9AJO2Qu- at 1nPpu2Y<v)q$P?!p>oL
z7AC!0wU_g5w>39{%Ysc5`8{u9KdKLlr at A}ksgjojoP>lAD9F^CS7Vm%tKfW-*jPeI
z763fI0f2uH06cww<uL%bFap4d0RV8N0syvMyneqJ06+o?GAg1vy83r_cj1vS?VVjY
zd4;sh8dk1(PfySO;nkJZwZ_J#-o63fC at 7P%+Pb>Cb4z-rrlu{eZ1(r}&(F_Y{EM%y
zu9Z|&kB^VF%;VYEIo8)VctuQp*w_V^FDx&w%+D`qY3URem5PXpB_^l+1~ogmdW?-v
zWM=1y+m at Es4!gK}MMeKAE-mjL7{dPgHRe}BcTZnSTgT6k at QH~jDQTIZ;gPz!`h|tX
zzW#y0prEa-t?JtP+q*|cXBT%*pO24^{e#2gl=Rov*V6LJ)by<3k+F at 9&D#3kzgwq#
z{ep7yi at ZyhZS5WX1A}Gd6zYbKI@&u!!Xke+HaU5v+B-V;^bO?Y=bM;X at To-U8yFe<
zNH43buKx`JHMhwrDn}&zwsOvDZfRRtS&fTN{PioYv#ZD2)O2QMHt=U?@UIe^oVlHy
zT at Pm$Pj6opHI4Yhl-Bl6V?8}{3oGxSEPE at f@SnlurDZF7cZo?UJG*-$V-rLD18GUg
z{$Aesg(WHx{aPxj>Ka;ESvj~QwCNey-adW<gTs at P(`HsbC&woimzHZPEA1Ve+&#S7
zT3QAdFXv|G?A;=&$}8sP7Npe!H#WDxmWYjtk`NL7`}aywMkcvwYjtfsGd+E6b<Nem
zq3ciA#@2pZVtz_mW^+ at shpVTkxI}4j at zUZ_QBiR~cv?|j{?7K!+{_F;E$z_Y(ALh5
zkGuQU=2l;KPf~n*O;ydz-1g7V(2#(@+^p>4g2JVRh26dVx|&)sN$Hu%sgsjaCQjd@
zqoaoUdJ+n5UT)se;gQ{)-T2sFaVeGCTiZ>IjjJmwgQKfsqho(M|7>n-rl+K05>Q6Q
zX0*4p2glUNh)YC;h7sc7lM|B&2nfzC?LouBU0(h at IlcPRx3IZ=Ix?}ox4U<CdUkkt
z^z!nOkz3c>+xPeK at 9pjF<HO_G+1csIX-Z<^+uK`CM&{wcp{#FfVb at -epC2;=<Lk?d
zqJrYh&Hc^o!_Cc2 at 4#F^PHswOg|n at ls!;;ie?0AQ!KpF?;H)I448HyU3_$q-792OQ
zGbBX>Roqw3GW>Lu#X((?0+K>uDf-h>Jn=fj)a0nX&=NudNWbEt7jnDe0W4B}5PP`N
zs_2T6C8SESvt^lvcBHLC)w+wRwO`Y_0LFQF<b72Iyd)~7Y5zj2_NZ59=Z1&h+G{gB
zyhYvR?8*dDoY&--NvG39CZ`j{vwzNyt0$Z{^V^(hKd~HrN&a_qQKFyGqTJ^wW(}N>
z?%t`YJhto^1eb&32TbM!;%`V!FpL at FU-K53ZC#)8FA=lq9(2~*;>kdieO0Ntv|i{8
z&R#@Eb%JBfqY0tieFl3dKAT6DO$$Da?~z$6aJLR$AfyE~_KHdDc0{4D2c{73VV0ir
zum?Xe-N6xxHH=Ur<G*B2yP at E9KH9&iU*0C$*e at OR;LKha-RSjUC*CWzO{fn92g3yt
zk07!`vWKpmnvNZLjZrA-y}mDc9{wGn<nwx+K9`?ScO9?gVz6lsAK&;zPYRch?=}%U
zb2_)u*7^6XttD(4)WG25 at qXSK$BfL2$F0Hu!&&j))J<2wvW?+twC{ElA(rPo<0d2*
zlpmwxb4M(Qr{i70!^~_qtm3&n&kJ*P+$CxCMHDW7?5{tcaST22hyGEy;d_}Z_h;{$
zWA#l}78Vv`#GZrD3k9zMB;8hbCs at x?>>|I-qo9y-0%4zw4bJNlH~zKGRZ12X<@_AV
z*5zGNLbseK1(D+~(@{&%4 at f?=WQv*V401VL?Y&o}vJ0z`y(k?{*SjTzo6M+*X=!Pa
zHEBd#aCe2{qNz3;pv4-5+c{VW#ep^HTeu`rtr=@Z3)Xa*H?!My75MBqKhD#U^KO>V
z8Trnq<tI1w!2vMDD96#)J2eK^$K2PDc?Zt&cK!?OTjRd1QjE|D%BvFWJ~THMXD at 3R
zrA4Qme at Z{2WY|qM)opQo8q3L9d+IyY?zD&!T|PYwwcTv`q+1c%8v2vz-jv{IhdL4G
z0l_Dhb>UZ;h3CShW`|x*Lc;834nfOa{|wo2hU;ZZO#bC5q5F0bLz8n--rn at uQ{E~;
z*38{J^g|=jZfz{n**hxS1 at d$DnFX at mN1t?ilh*5h_ at 6^>D)nk6H3Lj?eCx?Ri4N-W
zcmJ2XB4$-2_aZVVCJsjE7>bYg04OQXISuaj8#K!OmoQ at E2Phv}>mo6?+((HMFB<CD
zZz-d1;IG(!ndTocl}k*3DE^-q?c_VQi|1_l4La`sv<i!`RHqC60sSD<mc!(e>k~uz
z^v2n5l(x%BfnTaygt_vf(3Yg~+2GBGLojl7zm=tB-00hefLbQ6n%_tWVLiz_>_!sv
z$ebKD!5o%|xODT4h~LoqFL;dtkbKB8&PU&W#u_)g0yP{WhjclGnR>n;PjiQ>IF)=U
znj|R?9;}LeWRw0q37^fP(`Hl6QF}E(1*xQDt^HZ4EV*UqCM*fk!|?2FF;;e#W?_=^
zfN0rs9I2ncLA0-|xE+_z4`Lr?!@=Wy^NNas2--do(zsG3$)a|SUzo>a>pm$$_M`R5
zva);DjeKKjW}M2>-=zY?L$}X7@>h{P@)B<H&2J;=ujG+Vhz>$GbpCeBQKk9Fpr-Jp
z32=6Jdl<Qx*2z#{MTU#ypD^t$LS}gO1POx~ZDq=WQcVjTl{8!AD_ptuw~iQXOgfKT
z^CRyY|4jAn8LWSzQP2Mva33>T!+B<FEG){HM*h|y4h89OoB*FlP~wALK^qxKOJl;!
zq!?ZbH5~PK3w3Q#lcNt8ElaKhmMwlHt!geG!~GU3m7z7uBFTr;jNBNG-T4guE>QO6
zMnFD+YNtp3+{{^+AVW;-AMO8mJFP2dX=w}cX{t#_hIK65^z7j-PAhkMK81Hrt%{=1
zkUcRr&QiCD<*YK=-HK|6H;o7j^~7WcaJJF^u6nwRq1PRb{Li77!HA=vjZn(0LEI5K
z at V@zW_@~xpqcu8s%-E!U(Z-8z+3=sceRQK2p)g=9jJ`oTx2;r+?i at t(g=qE~Uu<(*
zt%kiky$5F9x8>`<Y(b7F{JrwoW_K+$M$h1l_mY_+OyQF(tGc`Eh at dOO{BaVq)Wiyv
zG9<4=g?qh<)IobJXiA==c77{`ip6f{+;*yWbZfz)lu>;(DO5Yv3F#|-`}YW6Y-p>m
zi1(%Eh19j=&UtZBSV3HzIb%JO)<T{kO-4c|P{)So_=wYG=fFsnJZG|>67zt2u9|?4
zi&h(^nXHaXjLpm05%|y8(<?b<i!tUhM6ZJ60;NHZ5P{EkN5)-W<nV%3Oy14S$A=fn
zg}fod3Hsatg^YFw>POgg6J?d?CQ;e$E+%rY&5;$u1GVP`Kdrej;_u)Rr!Xd_6H)mm
zj)sO~Xmd|jZ^9!xA5<4SH!tg<EvOMa^e=VX- at iw98!&pdo}T9I9q4?jCs*vcDBUE8
z>xy@}UFIrT3Br|JD-W8)9P42>J4_Wm)9E#alGjv6;!<d(EVem{ynxB-Wq4ZgJJCwL
zyH at yH#74;;YIn-5iv9(R>E-1X?&xXdO+kTQ6)oe#3i8!5{l-rYjtY&3O*o!yN72W*
z#jnIRSRjEH&&+ at 16+E1r_7JnqabC&v1IC*TdAoCO3JdkL%IuB$T24m#dhU-PKCiNH
zgT$YtLp1E%I7Tm6qhU1JnFW)!J5E=U!4PR3w8k6&pu)g+m}N8eC2yR>wIvegA$63Z
z`4R at P+f8(^@p#78WW9MOwvE87qy5qB-=IY at CilQ8|Nef~a(j!N+ZaD8l%^_*ORco`
zqMBM*xKh*#TOB?=c&p*96|2r3*o$<CYCOTnavj4ii at xR-6xvD4HPLn1^?kIpZVYUT
zCH@*eK4+H4nJZpOxiD}bu#nf29lb$mk0O>ZFh`lAlaT)_8&!^4V6}MF5>ePg9#U2C
z_S-e;fuwn`1Y0*VfrCjbjquVA&Q at IOZ1~Q0+F{x~;4a-Sd3}e0AzK5t-LE&D&HBD_
zSy}mI5SEC?`w;>P{`|~j&W#mO%F3rA(o}?cG<J5g?{FufP&uX=ccnw8#)K-XEQPag
zsiFaCGJwAOTW7Z?)FcP@#*{-m3Yu-mTK33Dt3&_4nPl6$$qO&)?tbCWLAbPhy7Ozl
zk2Lpnafir%&1tvEihAB#yO-STqry=fiFa}&b<z3r$KV;^#xar^D*|T=-zdtk@*3;R
zv^k{1n1%Ui*X?IEnG6rQH|Gz8M)$SzDv}h~PzqZZB6GO+&b>Ilj|;aN-s`Px=%Mm{
zYj(TSvw)?*+m*&7*T at IsF&+nQHJW_#C4>WV&d{a(Ip1kv7+Q=Dr+%~FnPLW at OV_*u
zZUOyutUJlaqJC`$b%n at 3SZ2sA?d}%xEc=%z`0tAhzE2sOuP<@1C=43c?^`o$9&DC(
z!z~W*o%8)hq&5BW8=S_6B+Z+NWEv at Kp-bm;)tTFCOylqYyRI)yX_LZG-*y~>cwwL8
zjvzz7mfRx+uicA(C;YdD?mAaWD`;cr|9jmct9iRl`JWcB?*WK72v{~?HN^0-P at X0|
z8!y%9C%(HjJPM#pa~JE>YPQe3 at mUQ-SBc+dMH8X?IN at u&Jh-bZ!()#`Ih7;V(+wj=
zj3IoVXNi3sWFUN6+=iAOC;@$zs~oN{6!;-1X=9WarQtO`E9LxA7rLy+d?653_m~O>
zPR4U{!^Rke!P*a3(AVB~p?-8vea-tAN{%;=hqSFp8>~zI`2wS1bz-={cJJGxK>fGV
zG;>0oS|D8WfC!8Ex1p1)7O%E~QX5Dq8OE2VAM)8|<|L~m2cPp+a`UQx!TMcOlcPFJ
z1%JZWHPU12Xu3c=mfjslbKkG`!*yuN7lXIM)n*^}@2(h!_uXp3=q9J at QG&7;g^;cM
z`p|P^dD%zZx1rv=iciAR=-Z<VWMPiebM>^%wWsKK*H$wMLD&IA9M9U(M1S0_&$tKK
zU2;~i!A?U%9x?h+z<g_UXX44tZFjtI^`{>S4K9+N?(X3MJlh01&nbW5VCLwk%49R|
zGPtDEWDXFIHp_$z%P`3riV^0kZ`8_Rz(*u%#v9>3g$!vxXhj$|#LgM+c?wj0ods~g
zLKbSbawp1m at ApH9+}UflhwIxZFdu0{s#Iz`19798O8Im&({A<V{PeV^1DJk(ersyr
z2-^2PzRGpVoxX~W=E&i-pY87I`IzL?Br^a30KrIz!74~xA|b)#h{=#sbfkd)kWqKf
zuV5i&<d;taJQ`Hh`j#Xu`MtFYX!7aE>xZu?M1P$7KuZs`S5L^agtN!>cfQ|w at ++HH
zI7sBCCN|jJdH1e&`h$Xmr5_ at D$i9L-_!xe?xw(q4<whweLc-4Pj>>0Uj|>w~^e(Gd
z!>xe<1n7;MrpN(+ZG1<}s-HcZVEr5i>l2_!e0fx{_~+$0C;LBp$EUqI;i!vZ4cV?p
z1RnjAs>2}<8V6BRqaqnPtjPZG at ol_&SlCN_GK3n*iqLfEZ;c}lB`elzbv5$$v!m~S
z`^EM5_+yDpYjC3nA;S06#AU&T7RWb(t)_qkhKeqZ0IUf}g0a92r;FE;9G{y$FUrYI
zmfB;9%Mm?UUtzTDipa6;A+Uifg>)1%KJT+rihNN8_nJTMv1&ErNem*U-=@ibeXDP8
z94FP5U`gVrSFU2B%I3Ad?!u!@20Jnx2~KoP(4z{6b2*d?pdo`877B>KU{$m&C|_de
z%H}EPOjnUFwRPKhKVN;9_qjc=i*2tp7FQzcsNi79WrUyH=eTov)lec;Jiwzg5YF=P
zuzq$dD5Tjun3(wO8J4xmr}^?VkeKNs2{WE<_o`@FGWevp>GRo=vqj-f4HZWqvGmD3
zZqww~0^K+aq}HKNrD())%_>;&>uRTGN3355MhqkSg&I6XH|sBsQJTE3_6He?F1#b<
ztO~IukZgh_5vs>`it11LL^gjq3yN!Pq`$pbOZAC3m<oA$=?I;#SbYm51}_wMEZp~C
zP5wV=c<5gvqH|N`)|r(8UX)-}FiH}m90suzq+m>j2-fGtH><iMcY-&jIArYnUV3jX
zJKswvKl4o7lCZ&GN*J*{A%o|cV0rS&_={<M#0a?8+j|{X`HhgRj2CXSaHBLCHAO|8
zGae7<fxf=J*Py?DqrzUFxDu`~w~Sl>Kmped8URxF0&N=;<8>i^ULaq3R#jMTOnoRc
zy`9%g_&qOkY$hsd`;3eR9?^QSK;l~+mKBO5c96^cTGi2aqJBIWw{gHUs?(roix|_*
z);DLx4WQE72 at xREgishX<}myUSheE<S|=SMp|#bJk$m>HZ%wg$Z;#0gAce?MEi+E5
ztI`#hxHo(~M0wFfOm&Lq1&YE!c&HXK%lxe(^zL<d=DJ6}OW<u)J$j%65U}S#G8U||
z=aHchwpA#@nx^~gL&1d{vaNJES&Ir_V at HbWt2e!`p4<5~o4!=*QqO9Y^dBDXws`A;
zh{Pv^mMa#YmC&SSW_NdH637Bm<d9?wlhy(jayI4Iam&E<$b5xLdQ{Q~YdVTR0KfnM
zaz`)Dg5+KWDhvb=_Jg^^-U0!Pk3p;L+cUTe(fsHhYSGeu4j54<&YcJ=oEmDSnx;B+
z5mn0SyQ-=pa&iSLYxJf34D?9;O`@+{*v~}lxX}aA{C!_LZFP0mpY4cv-6GkMi0IN6
znA7&_G7<D$4 at 0)bx7jj0;@&*@IU`F*BTV}hljg&%eSCZtt7R*zqpr_Uk$rsEpI<`F
z`u(oXJH!ecMp00Gw&q<5TklTAhrKL&3)+;5BaaYNtKrNOo<sk-u)9(#(j};3h^wmo
zgBYgzP at hOr<<BqmckH%Sr!OebXgmQ7!+x)r1=AL5Pmm%t#?{*D>TaVV8(!ey#U>vX
z8aI?1Fs0N)o-I1<edj5QkiZx<!35(dmL`mbx}raptXdZD_KzbOE$!)_%@6G{(ofyC
zkRzc)v%D_8U{+RKKmX8$04Kb~Ds8t>6Xx>{(E_$>P)pI0*kA8P`g;AztAqx3rGLbc
zHh&7^q&(<ah{XTp!cLl)i4*Nxrs~D^h6~+WJ|(Rj$n7^hr-zaS6bWGBcwhgcRSsJd
z=7)3{3iLFYq|f7}rAk{*-nu5B>|QXd22Ytvxl);mQd#1l(eT at U_&%<MF`KpVDi^!E
zy+3U3ENRCk?N}rb0!w>;YkLh-V7z_H(8p2)fG#NrK)_WUiIcZ}s18y9BW_(+nMw_y
z0*!Z{oB at DAk%9=IVKaZ0jgOYs25)jYJios>&CpTrushH}kuYo`vyJQ_HAYGOSEsX@
znp=Ew`*B!XgAOZpaJNpQ603zMwBT~mcE%w{t5M5JRaH?@QA%p0TbB{3myw4{rY-pX
z2kS-S<$zG+3L&W1#2K<!!{9$cu{cSP1vcsImOC8qHRL<%*ARb3!jSK1;(f8cT9OvI
zKsV#~r`}p#d;t_|R_!r^4??%wn;JR0c2nlGsNPJH*n>Fz)WR;OCo5eO*O=_y?Z>C#
zea9A^i^IWf`&-WCI4-uFjq-V=ic%XML8#9FFw?qeosTm6Ly7|@dO)7wXwSWZK=%kv
zFCZzTI?Ns3Gw at plM6FQ)3kec{p??x+`z at g|6>iCcRA`zS_%&oZs7v?UqF!Q2kziS4
zKQuaG(NK5eA{)2-#_7pBsCN6D`F<vm6*DPoHE&hM$MfLKS`;nDo_Ex1_}MvC>dxO5
zaY|_z^lLW$1S^$m;_R#Q4~0XV^?k3ksZFo_d2Nb>xIMNs{Osjq{Zx~nMK)10^M}K|
zf4KcucR6<U=EG)~Rw_$JMTzcJyJSm~p_u&+W1k<nqs(jBG3Odcneqwn at 5AvhYNU4*
zq)eFzmLv5L_q$!I9cDc_y__eojbyX9M#PK9aOX*xR6li=m5uucSy`?ux$#4%EB9cO
zMw%6A6hoq-R2df}e?izDciITsIt_*SE=JGt-&(}Pf~wR}lqIdXgT40N<)>PMgep9_
zvj)ub5l at 8bx3$xT=$!mNlCuml3Kw(XYkQrZy!rI27LMnv_;Mx>9j_2XmFOBr4p#_%
z(6~AakhNH52?bb!1Gm)|1WBw67PZyuBz9-qZ%Jnd2aFXx=&k9b;n*JY&vAyzQrDHc
z=d{0WahX at I5&x-xz(Y9cg26*rqd?Avk*uy-*S(&rOxJ at 0W0wa2rL_uFQB8+=HqUOj
z-sR9slR0H3=H-x)F$e7yMIcw!JoQ`g;hwVPL2Y3M4eD?<3x&r*@?fEW!QCtOcA-28
zDJd(eu at n_dwtzMvSTy&LjG$mZ<2yK_!jH3s2RS%lMT|ccFe8Yav)?M!V**2@^{Ux%
zQ_lIZ7pYENg3g{Pg&YgHmWV?PbU!R491}xAdU{>~<c3nfE#*k9UK~Xq7X{$5r`06=
zxl1BXNLZ*PA at o%ilr*3mEL0Acu~iTkjK<1t at 9C~Vg)y<T=ygD7uW5|hkt;oeXFW9c
z8+z{$n at h^qS0IBTAv?dL*NalBY<C9=?GqqHeLsr1Do(@2M*;=xwHFK4pfg5`S`F$(
zHO~1mkkwZ#IOLFFEb~bPXHQ+`QjOpS9o+`fOWM_R|0<jQ-3Sf!55FzJbwc6F!jmn>
zzq>SUQPm8T%UkMFo?gbtFhL~XLguUiW8c8N6#1BLMfY2T+!Zxt9GL0HEt({Q7Wl7@
z!iwA<>Zli;;N2{<;^ROrF;|wJg2L4NKd34w2$XPKl;c7 at eCHanvoU>6Oi36S!Nm&-
z3_Q9=!@!txN3Di^V0v~e#|mZu^N!#$1v}e2Q#R*JLs+Jl&x4rL_^3Jy5{dBpgI at 4_
zavLqurRG8Zo`SIt>RDrZhG?Fg?ndP(D*gA$N?Thy4aCg*O!n>1=*NWD`Ps=re*Uo~
zxTZF5)u?4NUp=h|{Yae)33N?$X;&Z@<{uyDCk8RfC<$y)2KjC#{;Pz4;JlS6zS{xq
YG?i=yuH1&;qdq`VR8FK?$RP0l0Cb!GPXGV_
literal 0
HcmV?d00001
diff --git a/offload/docs/_themes/llvm-theme/static/navigation.png b/offload/docs/_themes/llvm-theme/static/navigation.png
new file mode 100644
index 0000000000000000000000000000000000000000..1081dc1439fb984dfa7ef627afe3c7dc476fdbce
GIT binary patch
literal 218
zcmeAS at N?(olHy`uVBq!ia0vp^j6iI|!3HFkf4uMuBv2gW?!>U}oXkrghqJ&VvY3H^
zTNs2H8D`Cq01C2~c>21s-(chw<zuM4+c^s;Bw6AbQR1ARo12<f!r)w#npl#WqEMb$
zlA+-4=^GH<$R`d|<nHO>7$R|bZ|_0D0|q>YSbqDzW^|HYIk%*-&O)*<eU%p5hFqPM
zoCZSI1cj<~W;wMTU^!DV{f1fo9KD%^zhWZgXV;bV*7viUUsLj7{xJDI&`1VPS3j3^
HP6<r_1g=6L
literal 0
HcmV?d00001
diff --git a/offload/docs/_themes/llvm-theme/theme.conf b/offload/docs/_themes/llvm-theme/theme.conf
new file mode 100644
index 0000000000000..573fd78aba990
--- /dev/null
+++ b/offload/docs/_themes/llvm-theme/theme.conf
@@ -0,0 +1,4 @@
+[theme]
+inherit = basic
+stylesheet = llvm-theme.css
+pygments_style = friendly
diff --git a/offload/liboffload/API/Common.td b/offload/liboffload/API/Common.td
index 850a01d06759e..a621de081a0c6 100644
--- a/offload/liboffload/API/Common.td
+++ b/offload/liboffload/API/Common.td
@@ -44,21 +44,6 @@ def : Macro {
let alt_value = "";
}
-def : Macro {
- let name = "OL_DLLEXPORT";
- let desc = "Microsoft-specific dllexport storage-class attribute";
- let condition = "defined(_WIN32)";
- let value = "__declspec(dllexport)";
-}
-
-def : Macro {
- let name = "OL_DLLEXPORT";
- let desc = "GCC-specific dllexport storage-class attribute";
- let condition = "__GNUC__ >= 4";
- let value = "__attribute__ ((visibility (\"default\")))";
- let alt_value = "";
-}
-
def : Handle {
let name = "ol_platform_handle_t";
let desc = "Handle of a platform instance";
>From b1663dcdc9248d2d384fb9884daaed08642a0628 Mon Sep 17 00:00:00 2001
From: "Kenneth Benzie (Benie)" <k.benzie83 at gmail.com>
Date: Mon, 7 Jul 2025 16:16:37 +0100
Subject: [PATCH 3/3] [Offload] Add Sphinx HTML documentation target
Introduces the `docs-offload-html` target when CMake is configured with
`LLVM_ENABLE_SPHINX=ON` and `SPHINX_OUTPUT_HTML=ON`. Utilized
`offload-tblgen -gen-spen` to generate Offload API specification docs.
---
offload/CMakeLists.txt | 3 +++
offload/docs/.gitignore | 1 +
offload/docs/CMakeLists.txt | 25 +++++++++++++++++++++++++
offload/docs/conf.py | 32 ++++++++++++++++++++++++++++++++
offload/docs/index.rst | 21 +++++++++++++++++++++
5 files changed, 82 insertions(+)
create mode 100644 offload/docs/.gitignore
create mode 100644 offload/docs/CMakeLists.txt
create mode 100644 offload/docs/conf.py
create mode 100644 offload/docs/index.rst
diff --git a/offload/CMakeLists.txt b/offload/CMakeLists.txt
index 0a441c3bc5782..8e44f5e0034f7 100644
--- a/offload/CMakeLists.txt
+++ b/offload/CMakeLists.txt
@@ -23,6 +23,8 @@ elseif(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
return()
endif()
+set(OFFLOAD_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+
if(OPENMP_STANDALONE_BUILD)
set(OFFLOAD_LIBDIR_SUFFIX "" CACHE STRING
"Suffix of lib installation directory, e.g. 64 => lib64")
@@ -371,6 +373,7 @@ add_subdirectory(tools/offload-tblgen)
add_subdirectory(plugins-nextgen)
add_subdirectory(DeviceRTL)
add_subdirectory(tools)
+add_subdirectory(docs)
# Build target agnostic offloading library.
add_subdirectory(libomptarget)
diff --git a/offload/docs/.gitignore b/offload/docs/.gitignore
new file mode 100644
index 0000000000000..a17658c751ec0
--- /dev/null
+++ b/offload/docs/.gitignore
@@ -0,0 +1 @@
+offload-api.rst
diff --git a/offload/docs/CMakeLists.txt b/offload/docs/CMakeLists.txt
new file mode 100644
index 0000000000000..0fdef0bdc22cc
--- /dev/null
+++ b/offload/docs/CMakeLists.txt
@@ -0,0 +1,25 @@
+if(LLVM_ENABLE_SPHINX)
+ include(AddSphinxTarget)
+ if(SPHINX_FOUND AND SPHINX_OUTPUT_HTML)
+ # Generate offload-api.rst from OffloadAPI.td
+ set(LLVM_TARGET_DEFINITIONS
+ ${OFFLOAD_SOURCE_DIR}/liboffload/API/OffloadAPI.td)
+ tablegen(OFFLOAD source/offload-api.rst -gen-spec
+ EXTRA_INCLUDES ${OFFLOAD_SOURCE_DIR}/liboffload/API)
+ add_public_tablegen_target(OffloadDocsGenerate)
+
+ # Due to Sphinx only allowing a single source direcotry and the fact we
+ # only generate a single file, copy offload-api.rst to the source directory
+ # to be included in the generated documentation. A .gitignore file ensures
+ # offload-api.rst will not be added to the repository.
+ add_custom_target(OffloadDocsCopy
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_BINARY_DIR}/source/offload-api.rst
+ ${CMAKE_CURRENT_SOURCE_DIR}/offload-api.rst)
+
+ # Generate the HTML documentation, invoked wt the docs-offload-html target.
+ add_sphinx_target(html offload
+ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+ add_dependencies(docs-offload-html OffloadDocsGenerate OffloadDocsCopy)
+ endif()
+endif()
diff --git a/offload/docs/conf.py b/offload/docs/conf.py
new file mode 100644
index 0000000000000..08a991a7d5ad5
--- /dev/null
+++ b/offload/docs/conf.py
@@ -0,0 +1,32 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = "Offload"
+copyright = "2025, LLVM project"
+author = "LLVM project"
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+extensions = []
+
+templates_path = ["_templates"]
+exclude_patterns = []
+
+# -- C domain configuration --------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#c-config
+
+c_maximum_signature_line_length = 60
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+html_theme = "llvm-theme"
+html_theme_path = ["_themes"]
+html_static_path = ["_static"]
+html_favicon = "_static/favicon.ico"
diff --git a/offload/docs/index.rst b/offload/docs/index.rst
new file mode 100644
index 0000000000000..481d1f7ddd8b8
--- /dev/null
+++ b/offload/docs/index.rst
@@ -0,0 +1,21 @@
+.. Offload documentation master file, created by
+ sphinx-quickstart on Fri Jul 4 14:59:13 2025.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Welcome to Offload's documentation!
+===================================
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Contents:
+
+ offload-api
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
More information about the llvm-commits
mailing list