understanding of getelementptr with a const string

I'm working through some very basic IR code and got a bit confused by
the string printing example. In particular, if you have a constant
string like:

  @.str = private unnamed_addr constant [4 x i8] c"%d\0A\00"

To pass this as a pointer to a C-function like printf you need to use 2
indexes in getelementptr:

  %sp = getelementptr [4 x i8]* @.str, i32 0, i32 0

I think I understand now, but would be gracious if somebody could
correct/clarify for me:

1. "@.str" represents a pointer to the data when it is used
2. the first 0 index to getelementptr is thus of type [4 x i18], if I
stopped here the type of %sp would b e [4 x i8]*
3. the second 0 index is to the first i8 of that array, by doing this
the resulting type is now i8* (suitable for printf)

Are the following two forms, to get the one-past-end pointer, also
equivalent: they result in the same pointer value and type and are correct:

  %sp = getelementptr [4 x i8]* @.str, i32 1, i32 0
  %sp = getelementptr [4 x i8]* @.str, i32 0, i32 4

Hi edA-qa mort-ora-y,

I'm working through some very basic IR code and got a bit confused by
the string printing example. In particular, if you have a constant
string like:

  @.str = private unnamed_addr constant [4 x i8] c"%d\0A\00"

To pass this as a pointer to a C-function like printf you need to use 2
indexes in getelementptr:

  %sp = getelementptr [4 x i8]* @.str, i32 0, i32 0

you could also bitcast the [4xi8]* @.str to an i8*.

I think I understand now, but would be gracious if somebody could
correct/clarify for me:

1. "@.str" represents a pointer to the data when it is used
2. the first 0 index to getelementptr is thus of type [4 x i18], if I
stopped here the type of %sp would b e [4 x i8]*
3. the second 0 index is to the first i8 of that array, by doing this
the resulting type is now i8* (suitable for printf)

This is correct.

Are the following two forms, to get the one-past-end pointer, also
equivalent: they result in the same pointer value and type and are correct:

  %sp = getelementptr [4 x i8]* @.str, i32 1, i32 0
  %sp = getelementptr [4 x i8]* @.str, i32 0, i32 4

Yes, they give the same result since the array has length 4.

Ciao, Duncan.