Apple clang 4.2 based on llvm 3.2 produces a wrong "instruction requires:arm-mode"

Hi,

I’ve got an assembly file which used to compile with previous clang versions. However with 4.2 I get the following error:

admin$ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7 ./src/asm.s -o asm.o

./src/asm.s:30:5: error: instruction requires a CPU feature not currently enabled

add r2, pc, r2

According to ARM specification:

Show/hideUse of PC and SP in Thumb instructions

In most of these instructions, you cannot use PC (R15) for *Rd*, or any operand.

The exceptions are:

  • you can use PC for *Rn* in 32-bit Thumb ADD and SUB instructions, with a constant *Operand2* value in the range 0-4095, and no S suffix. These instructions are useful for generating PC-relative addresses. Bit[1] of the PC value reads as 0 in this case, so that the base address for the calculation is always word-aligned.

  • you can use PC in 16-bit Thumb ADD{*cond*} Rd, Rd, Rm instructions, where both registers cannot be PC.

    I indeed specified that this line belongs to the Thumb function. But the clang still produces this error.

    When I compile this file directly with “as” it compiles correctly.

    Please help!

Moshe,

You’re more than likely going to get a better response from

https://devforums.apple.com/community/tools/xcode

llvmdev is a mailing list for the LLVM project which is separate from Xcode development.

Cheers,

Joe

There is also this forum:

https://devforums.apple.com/community/tools/llvm

Cheers,

Joe

Hi Moshe,

The others are right that you'll likely get better Apple-specific help
at the forums, but this problem happens to be the same in generic
LLVM.

./src/asm.s:30:5: error: instruction requires a CPU feature not currently enabled

    add r2, pc, r2

According to ARM specification:

The specifications you're referring to are a little vague, and the
actual instruction definitions give the real situation (page/section
A3-308).

I think it boils down to:
"add r2, r2, pc" should be allowed (but LLVM doesn't, this is a bug).
"add r2, pc" should be allowed (and is)
"add r2, pc, r2" should be allowed *if* it's in an IT block (but LLVM
doesn't, this is a bug).

That last one might be rather tricky to implement. I'll take a bit of
a look, but may not have time to do it properly. Reporting it at
llvm.org/bugs (and/or bugreporter.apple.com since that seems to be
your platform) would make sure it doesn't get lost.

Cheers.

Tim.

So probably it is a LLVM issue - can anyone from the team look at it and let me know if there is anything to do.

Moshe

Hi Moshe,

Tim just did tell you what to do :slight_smile:

"Reporting it at llvm.org/bugs (and/or bugreporter.apple.com since
that seems to be your platform) would make sure it doesn't get lost."

So filing a bug report would be best.

-eric

Hi Eric,

Following Tim’s and your advice I filled the bug:
http://llvm.org/bugs/show_bug.cgi?id=16315

Haven’t seen any reaction to it from LLVM developers so far. This is the first time I submit a bug to LLVM, maybe I need to set some fields differently to trigger their attention?

Moshe

Hi Moshe,

Haven't seen any reaction to it from LLVM developers so far. This is the
first time I submit a bug to LLVM, maybe I need to set some fields
differently to trigger their attention?

Realistically this is a fairly minor edge case and might not get much
attention. There are certainly people working specifically on such
edge-cases (quite a lot of activity within ARM itself) but they
obviously have their own priorities. Filing the bug makes sure it
won't be forgotten, it doesn't make sure someone will start working on
it at any particular time.

I'd suggest modifying your source assembly as a workaround for now --
particularly since unless you've reduced the example too far it's
actually invalid anyway. You can use "add r2, pc" to achieve the same
effect.

Cheers.

Tim.