diff options
Diffstat (limited to 'docs/GetElementPtr.rst')
-rw-r--r-- | docs/GetElementPtr.rst | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/docs/GetElementPtr.rst b/docs/GetElementPtr.rst index 91025d8..c9cfae6 100644 --- a/docs/GetElementPtr.rst +++ b/docs/GetElementPtr.rst @@ -89,12 +89,12 @@ looks like: void %munge(%struct.munger_struct* %P) { entry: - %tmp = getelementptr %struct.munger_struct* %P, i32 1, i32 0 + %tmp = getelementptr %struct.munger_struct, %struct.munger_struct* %P, i32 1, i32 0 %tmp = load i32* %tmp - %tmp6 = getelementptr %struct.munger_struct* %P, i32 2, i32 1 + %tmp6 = getelementptr %struct.munger_struct, %struct.munger_struct* %P, i32 2, i32 1 %tmp7 = load i32* %tmp6 %tmp8 = add i32 %tmp7, %tmp - %tmp9 = getelementptr %struct.munger_struct* %P, i32 0, i32 0 + %tmp9 = getelementptr %struct.munger_struct, %struct.munger_struct* %P, i32 0, i32 0 store i32 %tmp8, i32* %tmp9 ret void } @@ -109,9 +109,9 @@ To make this clear, let's consider a more obtuse example: %MyVar = uninitialized global i32 ... - %idx1 = getelementptr i32* %MyVar, i64 0 - %idx2 = getelementptr i32* %MyVar, i64 1 - %idx3 = getelementptr i32* %MyVar, i64 2 + %idx1 = getelementptr i32, i32* %MyVar, i64 0 + %idx2 = getelementptr i32, i32* %MyVar, i64 1 + %idx3 = getelementptr i32, i32* %MyVar, i64 2 These GEP instructions are simply making address computations from the base address of ``MyVar``. They compute, as follows (using C syntax): @@ -146,7 +146,7 @@ variable which is always a pointer type. For example, consider this: %MyStruct = uninitialized global { float*, i32 } ... - %idx = getelementptr { float*, i32 }* %MyStruct, i64 0, i32 1 + %idx = getelementptr { float*, i32 }, { float*, i32 }* %MyStruct, i64 0, i32 1 The GEP above yields an ``i32*`` by indexing the ``i32`` typed field of the structure ``%MyStruct``. When people first look at it, they wonder why the ``i64 @@ -182,7 +182,7 @@ only involved in the computation of addresses. For example, consider this: %MyVar = uninitialized global { [40 x i32 ]* } ... - %idx = getelementptr { [40 x i32]* }* %MyVar, i64 0, i32 0, i64 0, i64 17 + %idx = getelementptr { [40 x i32]* }, { [40 x i32]* }* %MyVar, i64 0, i32 0, i64 0, i64 17 In this example, we have a global variable, ``%MyVar`` that is a pointer to a structure containing a pointer to an array of 40 ints. The GEP instruction seems @@ -197,9 +197,9 @@ following: .. code-block:: llvm - %idx = getelementptr { [40 x i32]* }* %, i64 0, i32 0 + %idx = getelementptr { [40 x i32]* }, { [40 x i32]* }* %, i64 0, i32 0 %arr = load [40 x i32]** %idx - %idx = getelementptr [40 x i32]* %arr, i64 0, i64 17 + %idx = getelementptr [40 x i32], [40 x i32]* %arr, i64 0, i64 17 In this case, we have to load the pointer in the structure with a load instruction before we can index into the array. If the example was changed to: @@ -208,7 +208,7 @@ instruction before we can index into the array. If the example was changed to: %MyVar = uninitialized global { [40 x i32 ] } ... - %idx = getelementptr { [40 x i32] }*, i64 0, i32 0, i64 17 + %idx = getelementptr { [40 x i32] }, { [40 x i32] }*, i64 0, i32 0, i64 17 then everything works fine. In this case, the structure does not contain a pointer and the GEP instruction can index through the global variable, into the @@ -225,9 +225,9 @@ index. Consider this example: .. code-block:: llvm - %MyVar = global { [10 x i32 ] } - %idx1 = getelementptr { [10 x i32 ] }* %MyVar, i64 0, i32 0, i64 1 - %idx2 = getelementptr { [10 x i32 ] }* %MyVar, i64 1 + %MyVar = global { [10 x i32] } + %idx1 = getelementptr { [10 x i32] }, { [10 x i32] }* %MyVar, i64 0, i32 0, i64 1 + %idx2 = getelementptr { [10 x i32] }, { [10 x i32] }* %MyVar, i64 1 In this example, ``idx1`` computes the address of the second integer in the array that is in the structure in ``%MyVar``, that is ``MyVar+4``. The type of @@ -248,9 +248,9 @@ type. Consider this example: .. code-block:: llvm - %MyVar = global { [10 x i32 ] } - %idx1 = getelementptr { [10 x i32 ] }* %MyVar, i64 1, i32 0, i64 0 - %idx2 = getelementptr { [10 x i32 ] }* %MyVar, i64 1 + %MyVar = global { [10 x i32] } + %idx1 = getelementptr { [10 x i32] }, { [10 x i32] }* %MyVar, i64 1, i32 0, i64 0 + %idx2 = getelementptr { [10 x i32] }, { [10 x i32] }* %MyVar, i64 1 In this example, the value of ``%idx1`` is ``%MyVar+40`` and its type is ``i32*``. The value of ``%idx2`` is also ``MyVar+40`` but its type is ``{ [10 x |