<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>Hey folks,</p>
We are building DPDK with clang14 for a 32bit armv8-a based CPU and ran into a compile error with the following from lib/eal/arm/include/rte_vect.h:<br>
<p><span id="codeline-70"><span class="cp"><br>
</span></span></p>
<blockquote>
<pre><font face="monospace"><span id="codeline-70"><span class="cp">#if (defined(RTE_ARCH_ARM) && defined(RTE_ARCH_32)) || \</span>
</span><span id="codeline-71"><span class="cp">(defined(RTE_ARCH_ARM64) && <a class="ident" href="https://elixir.bootlin.com/dpdk/v24.11/C/ident/RTE_CC_IS_GNU">RTE_CC_IS_GNU</a> && (<a class="ident" href="https://elixir.bootlin.com/dpdk/v24.11/C/ident/GCC_VERSION">GCC_VERSION</a> < 70000))</span>
</span><span id="codeline-72"><span class="cm">/* NEON intrinsic vcopyq_laneq_u32() is not supported in ARMv7-A(AArch32)</span>
</span><span id="codeline-73"><span class="cm"> * On AArch64, this intrinsic is supported since GCC version 7.</span>
</span><span id="codeline-74"><span class="cm"> */</span>
</span><span id="codeline-75"><span class="k">static</span><span class="w"> </span><span class="kr">inline</span><span class="w"> </span><span class="n">uint32x4_t</span>
</span><span id="codeline-76"><span class="nf"><a class="ident" href="https://elixir.bootlin.com/dpdk/v24.11/C/ident/vcopyq_laneq_u32">vcopyq_laneq_u32</a></span><span class="p">(</span><span class="n">uint32x4_t</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">lane_a</span><span class="p">,</span>
</span><span id="codeline-77"><span class="w">             </span><span class="n">uint32x4_t</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">lane_b</span><span class="p">)</span>
</span><span id="codeline-78"><span class="p">{</span>
</span><span id="codeline-79"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="n">vsetq_lane_u32</span><span class="p">(</span><span class="n">vgetq_lane_u32</span><span class="p">(</span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">lane_b</span><span class="p">),</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">lane_a</span><span class="p">);</span>
</span><span id="codeline-80"><span class="p">}</span>
</span><span id="codeline-81"><span class="cp">#endif</span></span></font></pre>
</blockquote>
<span id="codeline-81"><span class="cp"></span></span><span id="codeline-81"><span class="cp"></span></span><br>
<span id="codeline-81"><span class="cp">clang14 compile fails as follows:</span></span><br>
<span id="codeline-81"><span class="cp"></span></span><br>
<blockquote><span id="codeline-81"><span class="cp"></span></span><font face="monospace"><span id="codeline-81"><span class="cp">In file included from ../../../../../../cisco-dpdk-upstream-arm-clang-fixes.git/lib/eal/common/eal_common_options.c:36:</span></span><br>
<span id="codeline-81"><span class="cp">../../../../../../cisco-dpdk-upstream-arm-clang-fixes.git/lib/eal/arm/include/rte_vect.h:80:24: error: argument to '__builtin_neon_vgetq_lane_i32' must be a constant integer</span></span><br>
<span id="codeline-81"><span class="cp">return vsetq_lane_u32(vgetq_lane_u32(b, lane_b), a, lane_a);</span></span><br>
<span id="codeline-81"><span class="cp">^ ~~~~~~</span></span><br>
<span id="codeline-81"><span class="cp">/auto/binos-tools/llvm14/llvm-14.0-p24/lib/clang/14.0.5/include/arm_neon.h:7697:22: note: expanded from macro 'vgetq_lane_u32'</span></span><br>
<span id="codeline-81"><span class="cp">__ret = (uint32_t) __builtin_neon_vgetq_lane_i32((int32x4_t)__s0, __p1); \</span></span><br>
<span id="codeline-81"><span class="cp">^ ~~~~</span></span><br>
<span id="codeline-81"><span class="cp">/auto/binos-tools/llvm14/llvm-14.0-p24/lib/clang/14.0.5/include/arm_neon.h:24148:19: note: expanded from macro 'vsetq_lane_u32'</span></span><br>
<span id="codeline-81"><span class="cp">uint32_t __s0 = __p0; \</span></span><br>
<span id="codeline-81"><span class="cp">^~~~</span></span><br>
<span id="codeline-81"><span class="cp">In file included from ../../../../../../cisco-dpdk-upstream-arm-clang-fixes.git/lib/eal/common/eal_common_options.c:36:</span></span><br>
<span id="codeline-81"><span class="cp">../../../../../../cisco-dpdk-upstream-arm-clang-fixes.git/lib/eal/arm/include/rte_vect.h:80:9: error: argument to '__builtin_neon_vsetq_lane_i32' must be a constant integer</span></span><br>
<span id="codeline-81"><span class="cp">return vsetq_lane_u32(vgetq_lane_u32(b, lane_b), a, lane_a);</span></span><br>
<span id="codeline-81"><span class="cp">^ ~~~~~~</span></span><br>
<span id="codeline-81"><span class="cp">/auto/binos-tools/llvm14/llvm-14.0-p24/lib/clang/14.0.5/include/arm_neon.h:24150:24: note: expanded from macro 'vsetq_lane_u32'</span></span><br>
<span id="codeline-81"><span class="cp">__ret = (uint32x4_t) __builtin_neon_vsetq_lane_i32(__s0, (int32x4_t)__s1, __p2); \</span></span><br>
<span id="codeline-81"><span class="cp">^ ~~~~</span></span><br>
<span id="codeline-81"><span class="cp">2 errors generated.</span></span></font><br>
</blockquote>
<p><br>
</p>
<p>clang14 does appear to support the vcopyq_laneq_u32() intrinsic, s0 we want to skip the conditional implementation.</p>
<p>Two approaches I have tested to resolve the error are:</p>
<p>1) skip if building with clang:<br>
</p>
<blockquote><br>
<font face="monospace"><span id="codeline-81"><span class="cp">#if !defined(__clang__) && ((defined(RTE_ARCH_ARM) && defined(RTE_ARCH_32)) || \</span></span></font><br>
<font face="monospace"><span id="codeline-81"><span class="cp">72 (defined(RTE_ARCH_ARM64) && RTE_CC_IS_GNU && (GCC_VERSION < 70000)))<br>
<br>
</span></span></font></blockquote>
<span id="codeline-81"><span class="cp">2) skip if not building for ARMv7:<br>
</span></span>
<blockquote><font face="monospace"><span id="codeline-81"><span class="cp"><br>
#if (defined(RTE_ARCH_ARMv7) && defined(RTE_ARCH_32)) || \<br>
(defined(RTE_ARCH_ARM64) && RTE_CC_IS_GNU && (GCC_VERSION < 70000))<br>
</span></span></font></blockquote>
<p><span id="codeline-81"><span class="cp">Both address our immediate problem, but may not be a appropriate for all cases.</span></span></p>
<p></p>
<p>Can anyone suggest the proper way to address this?  I'll be submitting an patch once I have a solution that is acceptable to the community.<br>
</p>
<span id="codeline-81"><span class="cp">Regards,</span></span><br>
<span id="codeline-81"><span class="cp">Roger<br>
</span></span>
<p><span id="codeline-81"><span class="cp"><br>
</span></span></p>
<p><br>
</p>
<p><br>
</p>
<span id="codeline-81"><span class="cp"><br>
<br>
</span></span>
<p></p>
</body>
</html>