<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">