RFA: Alignment of Strings

One of our developers pointed out that GCC generates something akin to
this on Darwin:

$ cat t.c
__private_extern__ void bar(const char *format, ...)
  __attribute__ ((format (printf, 1, 2)));

void foo(const char *i, const char *b) {
  bar("this is some error message that is kind of longish.");

$ gcc -arch i386 -S -o - t.c -Os
  .align 2
      .ascii "this is some error message that is kind of longish.\0"

LLVM on the other hand generates this on Darwin:

$ /Developer/usr/bin/llvm-gcc -arch i386 -S -o - t.c -Os
        .section __TEXT,__cstring,cstring_literals
        .align 4
        .asciz "this is some error message that is kind of longish."

Note that the alignment in LLVM is greater than it is for GCC. When I
look at the alignment of the string in GDB, the front-end is saying
that it's 8, which would be '.align 3'. I have a patch below that sets
the alignment explicitly for STRING_CST types.

My question is two-fold:

* Is the patch good? I don't *think* that it will break anything else
in the front-end or for different platforms, but one never knows, and,

* What magick is GCC performing to get the '.align 2' instead of
'.align 3', which I would expect? Is this something we can/should
replicate in LLVM?


Index: llvm-gcc.src/gcc/llvm-convert.cpp

Hi Bill,

Index: llvm-gcc.src/gcc/llvm-convert.cpp

--- llvm-gcc.src/gcc/llvm-convert.cpp (revision 72733)
+++ llvm-gcc.src/gcc/llvm-convert.cpp (working copy)
@@ -7418,6 +7418,8 @@
                                            TAI ?
                                             TAI->getStringConstantPrefix() :
                                             ".str", TheModule);
+ GV->setAlignment(TYPE_ALIGN(TREE_TYPE(exp)));

the gcc alignment is in bits, so you need to divide by 8.