mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-27 07:12:06 +00:00
Add a mention of TypeBuilder to the programmer's manual, and clean up the class
comment a bit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70515 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3a155f0e34
commit
714257f5de
@ -117,6 +117,7 @@ with another <tt>Value</tt></a> </li>
|
||||
<li><a href="#schanges_deletingGV">Deleting <tt>GlobalVariable</tt>s</a> </li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#create_types">How to Create Types</a></li>
|
||||
<!--
|
||||
<li>Working with the Control Flow Graph
|
||||
<ul>
|
||||
@ -2088,6 +2089,46 @@ GV->eraseFromParent();
|
||||
|
||||
</div>
|
||||
|
||||
<!-- ======================================================================= -->
|
||||
<div class="doc_subsection">
|
||||
<a name="create_types">How to Create Types</a>
|
||||
</div>
|
||||
|
||||
<div class="doc_text">
|
||||
|
||||
<p>In generating IR, you may need some complex types. If you know these types
|
||||
statically, you can use <tt>TypeBuilder<...>::get()</tt>, defined
|
||||
in <tt>llvm/Support/TypeBuilder.h</tt>, to retrieve them. <tt>TypeBuilder</tt>
|
||||
has two forms depending on whether you're building types for cross-compilation
|
||||
or native library use. <tt>TypeBuilder<T, true></tt> requires
|
||||
that <tt>T</tt> be independent of the host environment, meaning that it's built
|
||||
out of types from
|
||||
the <a href="/doxygen/namespacellvm_1_1types.html"><tt>llvm::types</tt></a>
|
||||
namespace and pointers, functions, arrays, etc. built of
|
||||
those. <tt>TypeBuilder<T, false></tt> additionally allows native C types
|
||||
whose size may depend on the host compiler. For example,</p>
|
||||
|
||||
<div class="doc_code">
|
||||
<pre>
|
||||
FunctionType *ft = TypeBuilder<types::i<8>(types::i<32>*), true>::get();
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>is easier to read and write than the equivalent</p>
|
||||
|
||||
<div class="doc_code">
|
||||
<pre>
|
||||
std::vector<const Type*> params;
|
||||
params.push_back(PointerType::getUnqual(Type::Int32Ty));
|
||||
FunctionType *ft = FunctionType::get(Type::Int8Ty, params, false);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>See the <a href="/doxygen/TypeBuilder_8h-source.html#l00001">class
|
||||
comment</a> for more details.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- *********************************************************************** -->
|
||||
<div class="doc_section">
|
||||
<a name="advanced">Advanced Topics</a>
|
||||
|
@ -40,21 +40,21 @@ namespace llvm {
|
||||
/// int8 AFunction(struct MyType *value);
|
||||
///
|
||||
/// You'll want to use
|
||||
/// Function::Create(TypeBuilder<types::i<8>(MyType*)>::get(), ...)
|
||||
/// Function::Create(TypeBuilder<types::i<8>(MyType*), true>::get(), ...)
|
||||
/// to declare the function, but when you first try this, your compiler will
|
||||
/// complain that TypeBuilder<MyType>::get() doesn't exist. To fix this, write:
|
||||
/// complain that TypeBuilder<MyType, true>::get() doesn't exist. To fix this,
|
||||
/// write:
|
||||
///
|
||||
/// namespace llvm {
|
||||
/// using types::i;
|
||||
/// template<bool xcompile> class TypeBuilder<MyType, xcompile> {
|
||||
/// public:
|
||||
/// static const StructType *get() {
|
||||
/// // Using the static result variable ensures that the type is
|
||||
/// // only looked up once.
|
||||
/// static const StructType *const result = StructType::get(
|
||||
/// TypeBuilder<i<32>, xcompile>::get(),
|
||||
/// TypeBuilder<i<32>*, xcompile>::get(),
|
||||
/// TypeBuilder<i<8>*[], xcompile>::get(),
|
||||
/// TypeBuilder<types::i<32>, xcompile>::get(),
|
||||
/// TypeBuilder<types::i<32>*, xcompile>::get(),
|
||||
/// TypeBuilder<types::i<8>*[], xcompile>::get(),
|
||||
/// NULL);
|
||||
/// return result;
|
||||
/// }
|
||||
|
Loading…
x
Reference in New Issue
Block a user