<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/61743>61743</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [AIX] C++ member functions in custom sections generate invalid alignments
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:PowerPC,
            clang:codegen,
            platform:aix
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          daltenty
      </td>
    </tr>
</table>

<pre>
    Here's a C++ test program which generates invalid assembly when compiled for AIX:
```
struct A {
        void __attribute__((section("foo"))) odd();
        void __attribute__((section("foo"))) c();
};

void A::odd() {}

void A::c() {}

int main() {
        A a;
        a.odd(); a.c();
        return 0;
}
```

```
$clang++ -c -fverbose-asm member.cc
Assembler:
/tmp/member-c65289.s: line 39: 1252-081 The instruction is not aligned properly.
        The instruction requires machine specific alignment.
clang-15: error: assembler command failed with exit code 1 (use -v to see invocation)
```
Looking at the assembly:
```
$clang++ -S -fverbose-asm  -o -  member.cc|head -n46
 .csect .text[PR],5
        .file   "member.cc","LLVM version 15.0.2"
        .csect foo[PR],5
        .globl  _ZN1A3oddEv[DS] # -- Begin function _ZN1A3oddEv
        .globl  ._ZN1A3oddEv
 .align  1
        .csect _ZN1A3oddEv[DS],2
        .vbyte  4, ._ZN1A3oddEv                 # @_ZN1A3oddEv
        .vbyte  4, TOC[TC0]
        .vbyte  4, 0
        .csect foo[PR],5
._ZN1A3oddEv:
# %bb.0:
        stw 3, -8(1)
 blr
L.._ZN1A3oddEv0:
        .vbyte  4, 0x00000000                   # Traceback table begin
        .byte   0x00                            # Version = 0
        .byte   0x09                            # Language = CPlusPlus
        .byte   0x20                            # -IsGlobaLinkage, -IsOutOfLineEpilogOrPrologue
 # +HasTraceBackTableOffset, -IsInternalProcedure
 # -HasControlledStorage, -IsTOCless
 # -IsFloatingPointPresent
 # -IsFloatingPointOperationLogOrAbortEnabled
 .byte   0x40                            # -IsInterruptHandler, +IsFunctionNamePresent, -IsAllocaUsed
 # OnConditionDirective = 0, -IsCRSaved, -IsLRSaved
        .byte   0x80 # +IsBackChainStored, -IsFixup, NumOfFPRsSaved = 0
        .byte   0x00                            # -HasExtensionTable, -HasVectorInfo, NumOfGPRsSaved = 0
        .byte   0x01 # NumberOfFixedParms = 1
        .byte   0x01 # NumberOfFPParms = 0, +HasParmsOnStack
        .vbyte  4, 0x00000000                   # Parameter type = i
        .vbyte  4, L.._ZN1A3oddEv0-._ZN1A3oddEv # Function size
        .vbyte  2, 0x000b # Function name len = 11
        .byte   "_ZN1A3oddEv" # Function Name
 # -- End function
        .globl  _ZN1A1cEv[DS]                   # -- Begin function _ZN1A1cEv
        .globl  ._ZN1A1cEv
        .align 1
        .csect _ZN1A1cEv[DS],2
        .vbyte  4, ._ZN1A1cEv # @_ZN1A1cEv
        .vbyte  4, TOC[TC0]
        .vbyte  4, 0
        .csect foo[PR],5
._ZN1A1cEv:
# %bb.0:
        stw 3, -8(1)
```

It seems the odd length of the name in the traceback table following the first function pushes the location counter to a misaligned value and then the alignment value the compiler has inserted at the start of the function is two-bytes (`.align  1`) which is less than what is required by Power ISA (i.e instructions must be 4-byte aligned). 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8V1lv474R_zT0y0CCRFk-HvzgI_7HQLo2Numi6EtASSOJDUW6JGUn_fQFJfmMnQ2wRQXvRuLxm-tHzgwzhhcScULiGYkXPVbbUulJxoRFaT96ico-Jo-okdChAQZzQmeEzsCisbDVqtCsgn3J0xIKlKiZRQNc7pjgGTBjsErEB-xLlJCqassFZpArDdPVP0g0JcGCBFMyCLpf82msrlMLUyDDWTsC3bNTPIPXV2at5klt8fWV0BGhI4Op5Uo2HzRXilBK6Lj9gcqyZmJMov8FXHoFRoaL03vzfwM7ddZF06Pwxpjh4t669O4qLi1UjMuzBRdGTIF9Moz550YD86-VPizUaGstIbiw5lZMbg_SfiqYLDpKeCl4-Q51ogx6zFRQYZWg9tO0XT5t2YD6FHi6tNWW0GW70ksHMR2NfUOiKQguEaKxew1pTL1gFMJLicBlyw-uJHADUllgwlE4c3TcohYf_qWR17s0_rvmGg1ULC2dFLPFlOc8bYEqlLZDaKzzwtgpgVorp_mB1KgdoSsmM8hZQ-s9tyXgO7eQqgwhBEJHtUHwdmAVGHRa7FTKWm6Nb7r0Sak3LgtgFmyJxwN076hcR-D5KgLgKfDgLBDDeYksA0_2B52T_NTRHXyL75bEs81PEi8InceXPvRzLhAACKUnMHcs5oTSp6dff4MdauO8G8Z-4FM3dwnQinGn6b6QQqhEALz-80c4jVSWPexIPFs8k3gBhEbgeTDDgkvIa9mG8nzlTSj_8wq_iTJAeFPBG7IJnV8bs0s-LAL0CZ1fiIDrx6lN-sF9Pc-RXtZzEs9e5oETen9Z8H3PXph_OnUREBoniR8cxw5gxu4hckI8dxGGR5pCInTHUP8c9DPCparvQfd88kzrmxfNUkxY-gaWJQIhcfG9AmzxGqwbKBdwvzoSkmjxyU0nmPHvYJ6YLGpWYIMz34jauH_38Ohv1fJW5i-hEvbE5RsrsPHvyqxru86fuMSHLReqWOuNVkIVNXaC2jjNHplpvDRj6duLc9I6zw3aDmQlLWrJxEarFLNan2_2HpmZK2m1EgKzZ6v0SfjLei7QmPPVK7MUilkui43i0m40GpT2ixXrrcv3XMknp_00Udo-SKdhdjhqRx_1v-OjxhZdb-0jk5nLE3TuHLAyy-68_2AVHtRqzZgKoVL2d3MU6aDWcq5kxt2OBdcume-wo0S7a_7zme0w676euq874R0Fh0isjIvBvGRcOmceAZb8vd669x91tc6Xm5-mAfwNC3_vkUdmHt4tSkfpJvKNvEdmfmFqlV7JXB2l_vVNqWED_aN2d_g6X_J3zDZMV6bZdn0l3t22Oe0Juig9MtMMruWzZenbn1wKG6ZZhRY12I9tGzn-Bd7VjeRdXMgO70AfMPw_eBuIHhVLLrdIViEIbK-U8I6DCKXnFy2llxiOtufHyIMHVzV001_kwDA9y4B3SHI7JzY7v8iIN-bbtPhFVjzX5ls50W24yIA3pP4_8l8j9k-y381ieGVdTVeZplBTWeZYUtgSVN6MNMThsnm3V1kuV0Kovavz3GzOtbGn-G1rU2KLKrpqEVJVy-Y8KGBQcXOoeHdM1AiuBrWuw2pKxkMN2026sa7z0lAy15wZ1BazQ41pLNP2oPVRC27A7pXn3G5cIUsGwalwGgSuFWm7Pm7AJRKwJZOwL5l1I12JnUHyARu1Rw2rZ0f-EfcvanEDVW0sJAj9RtShlCd07EMvm0TZOBqzHk7CwXA8HoRhP-6Vk2Q8YhgOhjQdpDRnedjP8yQb97N-GOcx9nt8QgMaBREd0iimNPaHKctGjCX9KOnHYZ6QfoAV48IXYlf5Shc9bkyNk0E47Ec9wRIUpumIKXVhQ5mRaNoYspkfy9628o6mrtovUB7Ht4LZXOmKRFPG391wvOjpiRPlJXVhSD8Q3FhzEm65FU0H7rrieHFssttS-xgUFztIa2NVBV2Pao5d96npPhDA9GotJqW1W9dQEbokdFlwW9aJn6qK0KWT3_3xtlr9C1NL6LLxhCF02TjjvwEAAP__SVOJYQ">