Support for delayed constants in ARM integrated assembler

I have some assembly code that uses .equ to set a symbol to a computed
constant. It works in GCC but not LLVM. I am not sure about the correct
terminology, but here is an example:

  .syntax unified
  .set size, end - start
  add r0, r0, #size

  .space 0x10

GCC will compile this to `add r0, r0, #16`. Compiling with llvm-mc gives:

  set.s:4:13: error: invalid operand for instruction
  add r0, r0, #size
It works for llvm-mc if the #size is set to a constant (e.g. .set size,

I took a quick shot at implementing this for llvm. I had some success by
allowing an MCExpr to impersonate a constant and then using a MCFixup to
write the actual constant value later. I am not sure if this is the best
approach for implementing this feature.

What do others think? Is this a feature we can support for ARM? Can we
(should we?) do it in a target-independent way?

(filed bug
-- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted
by The Linux Foundation

Hi David,

I agree we should support this. I've added a few more cases in the bug itself.