Home > Software engineering >  Correct LDR Rd,=constant_expression usage in GCC / GAS?
Correct LDR Rd,=constant_expression usage in GCC / GAS?

Time:10-07

I'm migrating from Ride7 to Eclipse CDT with GNU arm-none-eabi toolchain.

In my project, I have a hardware register description library using .equ directive in a way like:

.equ BIT_31, 1 << 31
.equ BIT_30, 1 << 30
and so on up to
.equ BIT_0,  1 << 0

I want to prepare a mask to clear e.g. bits 30, 27, 25 and 5.
In Ride7 there was no problem to use pseudo-instruction

ldr r0, =~(BIT_30 | BIT_27 | BIT_25 | BIT_5)

This generated a constant somewhere in a pool and produced LDR r0, [pc, #IMM], or MOV/MVN instruction if nice constant.

But GNU toolchain refuses to evaluate the constant expression producing Syntax error. (I can use only ldr r0, =BIT_30 for example).

Can anyone advise me how to solve this?

Added later:

There are several file sin the project, included in the main one. Here are minimized listings:

main.S:

.syntax unified
.text

.include "defs_swintf.inc"             @ software interface
.include "defs_md.inc"                 @ hardware interface

/***
* Startup
***/
_start:
    .include "startup.S"

/***
* Core
***/

/***
* removed to minimalize
***/
    
/***
* CPU Init
***/
.align 4
Init_CPU: 
    ldr r0, =Init_stack
    mov sp, r0
    bl Set_RESULT_WAIT
    bl Configure_clocks
    ldr r1, =RESULT_OK
    bkpt                                @ halt
    
    .include "procedures.S"
    
.end

startup.S:

.syntax unified
.text

    .word Init_stack                        @ stack pointer
    .word Reset_handler 1                   @ Reset
    .word Default_handler 1                 @ NMI
    .word Default_handler 1                 @ Hardfault
    
Reset_handler:
    b Init_CPU

Default_handler:
    bl Set_RESULT_ERROR
    bkpt                                    @ halt

procedures.S

.syntax unified
.text

/*******************************************************************************
* Configure_clocks
*******************************************************************************/
Configure_clocks:
    push {LR}

        ldr r0, =RCC_CR
        ldr r1, [r0]
        ldr r2, =RCC_CR_HSION_mask
        orr r1, r1, r2
        str r1, [r0]
        ldr r3, =RCC_CFGR
        ldr r4, [r3]
        ldr r2, = ~(RCC_CFGR_HPRE_mask | RCC_CFGR_PPRE1_mask | RCC_CFGR_PPRE2_mask | RCC_CFGR_ADCPRE_mask | RCC_CFGR_MCO_mask)
        and r4, r4, r2
        str r4, [r3]
        ldr r2, = ~RCC_CR_CSSON_mask
        and r1, r1, r2
        str r1, [r0]
        ldr r5, =RCC_CIR
        ldr r2, =RCC_CIR_clearAll
        str r2, [r5]
        ldr r2, =RCC_CR_HSIRDY_mask

    pop {pc}

defs_swintf.inc

/***
* operation results
***/

.equ    RESULT_OK,     0x89abcdef
.equ    RESULT_BAD,    0x4321fedc
.equ    RESULT_WAIT,   0x12345678
.equ    RESULT_ERROR,  0x9876dcba

defs_md.inc

    .equ Init_stack, 0x20005000         /* initial stack */

/***
* device registers
***/

/******************************************************************************/
/* Reequ and Clock Control Registers                                          */
/******************************************************************************/
    .equ RCC_base, 0x40021000
    .equ RCC_CR, RCC_base   0x00        /* Clock control register             */
    .equ RCC_CR_reequ, 0x00000083
        .equ RCC_CR_HSION_mask,         0x01 << 0
        .equ RCC_CR_HSIRDY_mask,        0x01 << 1
        .equ RCC_CR_HSITRIM_mask,       0x1f << 3
        .equ RCC_CR_HSICAL_mask,        0xff << 8
        .equ RCC_CR_HSEON_mask,         0x01 << 16
        .equ RCC_CR_HSERDY_mask,        0x01 << 17
        .equ RCC_CR_HSEBYP_mask,        0x01 << 18
        .equ RCC_CR_CSSON_mask,         0x01 << 19
        .equ RCC_CR_PLLON_mask,         0x01 << 24
        .equ RCC_CR_PLLRDY_mask,        0x01 << 25
    
    .equ RCC_CFGR, RCC_base   0x04      /* Clock configuration register       */
    .equ RCC_CFGR_reequ, 0x00000000
        .equ RCC_CFGR_SW_mask,          0x03 << 0
        .equ RCC_CFGR_SW_hsi,           0x00 << 0
        .equ RCC_CFGR_SW_hse,           0x01 << 0
        .equ RCC_CFGR_SW_pll,           0x02 << 0
        
        .equ RCC_CFGR_SWS_mask,         0x03 << 2
        .equ RCC_CFGR_SWS_hsi,          0x00 << 2
        .equ RCC_CFGR_SWS_hse,          0x01 << 2
        .equ RCC_CFGR_SWS_pll,          0x02 << 2
        
        .equ RCC_CFGR_HPRE_mask,        0x0f << 4
        .equ RCC_CFGR_HPRE_div1,        0x00 << 4
        .equ RCC_CFGR_HPRE_div2,        0x08 << 4
        .equ RCC_CFGR_HPRE_div4,        0x09 << 4
        .equ RCC_CFGR_HPRE_div8,        0x0a << 4
        .equ RCC_CFGR_HPRE_div16,       0x0b << 4
        .equ RCC_CFGR_HPRE_div64,       0x0c << 4
        .equ RCC_CFGR_HPRE_div128,      0x0d << 4
        .equ RCC_CFGR_HPRE_div256,      0x0e << 4
        .equ RCC_CFGR_HPRE_div512,      0x0f << 4
        
        .equ RCC_CFGR_PPRE1_mask,       0x07 << 8
        .equ RCC_CFGR_PPRE1_div1,       0x00 << 8
        .equ RCC_CFGR_PPRE1_div2,       0x04 << 8
        .equ RCC_CFGR_PPRE1_div4,       0x05 << 8
        .equ RCC_CFGR_PPRE1_div8,       0x06 << 8
        .equ RCC_CFGR_PPRE1_div16,      0x07 << 8
        
        .equ RCC_CFGR_PPRE2_mask,       0x07 << 11
        .equ RCC_CFGR_PPRE2_div1,       0x00 << 11
        .equ RCC_CFGR_PPRE2_div2,       0x04 << 11
        .equ RCC_CFGR_PPRE2_div4,       0x05 << 11
        .equ RCC_CFGR_PPRE2_div8,       0x06 << 11
        .equ RCC_CFGR_PPRE2_div16,      0x07 << 11
        
        .equ RCC_CFGR_ADCPRE_mask,      0x03 << 14
        .equ RCC_CFGR_ADCPRE_div2,      0x00 << 14
        .equ RCC_CFGR_ADCPRE_div4,      0x01 << 14
        .equ RCC_CFGR_ADCPRE_div6,      0x02 << 14
        .equ RCC_CFGR_ADCPRE_div8,      0x03 << 14
        
        .equ RCC_CFGR_PLLSRC_mask,      0x01 << 16
        .equ RCC_CFGR_PLLSRC_hsiDiv2,   0x00 << 16
        .equ RCC_CFGR_PLLSRC_hse,       0x01 << 16
        
        .equ RCC_CFGR_PLLXTPRE_mask,    0x01 << 17
        .equ RCC_CFGR_PLLXTPRE_hse,     0x00 << 17
        .equ RCC_CFGR_PLLXTPRE_hseDiv2, 0x01 << 17
        
        .equ RCC_CFGR_PLLMUL_mask,      0x0f << 18
        .equ RCC_CFGR_PLLMUL_x2,        0x00 << 18
        .equ RCC_CFGR_PLLMUL_x3,        0x01 << 18
        .equ RCC_CFGR_PLLMUL_x4,        0x02 << 18
        .equ RCC_CFGR_PLLMUL_x5,        0x03 << 18
        .equ RCC_CFGR_PLLMUL_x6,        0x04 << 18
        .equ RCC_CFGR_PLLMUL_x7,        0x05 << 18
        .equ RCC_CFGR_PLLMUL_x8,        0x06 << 18
        .equ RCC_CFGR_PLLMUL_x9,        0x07 << 18
        .equ RCC_CFGR_PLLMUL_x10,       0x08 << 18
        .equ RCC_CFGR_PLLMUL_x11,       0x09 << 18
        .equ RCC_CFGR_PLLMUL_x12,       0x0a << 18
        .equ RCC_CFGR_PLLMUL_x13,       0x0b << 18
        .equ RCC_CFGR_PLLMUL_x14,       0x0c << 18
        .equ RCC_CFGR_PLLMUL_x15,       0x0d << 18
        .equ RCC_CFGR_PLLMUL_x16,       0x0e << 18
        
        .equ RCC_CFGR_USBPRE_mask,      0x01 << 22
        .equ RCC_CFGR_USBPRE_div1_5,    0x00 << 22
        .equ RCC_CFGR_USBPRE_div1,      0x01 << 22
        
        .equ RCC_CFGR_MCO_mask,         0x07 << 24
        .equ RCC_CFGR_MCO_off,          0x00 << 24
        .equ RCC_CFGR_MCO_sysclk,       0x04 << 24
        .equ RCC_CFGR_MCO_hsi,          0x05 << 24
        .equ RCC_CFGR_MCO_hse,          0x06 << 24
        .equ RCC_CFGR_MCO_pllDiv2,      0x07 << 24
    
    .equ RCC_CIR, RCC_base   0x08       /* Clock interrupt register           */
    .equ RCC_CIR_reequ, 0x00000000
    .equ RCC_CIR_clearAll, 0x009f0000
        .equ RCC_CIR_LSIRDYF_mask,      0x01 << 0
        .equ RCC_CIR_LSERDYF_mask,      0x01 << 1
        .equ RCC_CIR_HSIRDYF_mask,      0x01 << 2
        .equ RCC_CIR_HSERDYF_mask,      0x01 << 3
        .equ RCC_CIR_PLLRDYF_mask,      0x01 << 4
        .equ RCC_CIR_CSSF_mask,         0x01 << 7
        .equ RCC_CIR_LSIRDYIE_mask,     0x01 << 8
        .equ RCC_CIR_LSERDYIE_mask,     0x01 << 9
        .equ RCC_CIR_HSIRDYIE_mask,     0x01 << 10
        .equ RCC_CIR_HSERDYIE_mask,     0x01 << 11
        .equ RCC_CIR_PLLRDYIE_mask,     0x01 << 12
        .equ RCC_CIR_LSIRDYC_mask,      0x01 << 16
        .equ RCC_CIR_LSERDYC_mask,      0x01 << 17
        .equ RCC_CIR_HSIRDYC_mask,      0x01 << 18
        .equ RCC_CIR_HSERDYC_mask,      0x01 << 19
        .equ RCC_CIR_PLLRDYC_mask,      0x01 << 20
        .equ RCC_CIR_CSSC_mask,         0x01 << 23
    
    .equ RCC_APB2RSTR, RCC_base   0x0c  /* APB2 peripheral reequ register     */
    .equ RCC_APB2RSTR_reequ, 0x00000000
        .equ RCC_APB2RSTR_AFIORST_mask,     0x01 << 0
        .equ RCC_APB2RSTR_IOPARST_mask,     0x01 << 2
        .equ RCC_APB2RSTR_IOPBRST_mask,     0x01 << 3
        .equ RCC_APB2RSTR_IOPCRST_mask,     0x01 << 4
        .equ RCC_APB2RSTR_IOPDRST_mask,     0x01 << 5
        .equ RCC_APB2RSTR_IOPERST_mask,     0x01 << 6
        .equ RCC_APB2RSTR_IOPFRST_mask,     0x01 << 7
        .equ RCC_APB2RSTR_IOPGRST_mask,     0x01 << 8
        .equ RCC_APB2RSTR_ADC1RST_mask,     0x01 << 9
        .equ RCC_APB2RSTR_ADC2RST_mask,     0x01 << 10
        .equ RCC_APB2RSTR_TIM1RST_mask,     0x01 << 11
        .equ RCC_APB2RSTR_SPI1RST_mask,     0x01 << 12
        .equ RCC_APB2RSTR_TIM8RST_mask,     0x01 << 13
        .equ RCC_APB2RSTR_USART1RST_mask,   0x01 << 14
        .equ RCC_APB2RSTR_ADC3RST_mask,     0x01 << 15
        .equ RCC_APB2RSTR_TIM9RST_mask,     0x01 << 19
        .equ RCC_APB2RSTR_TIM10RST_mask,    0x01 << 20
        .equ RCC_APB2RSTR_TIM11RST_mask,    0x01 << 21
    
    .equ RCC_APB1RSTR, RCC_base   0x10  /* APB1 peripheral reequ register     */
    .equ RCC_APB1RSTR_reequ, 0x00000000
      .equ RCC_APB1RSTR_TIM2RST_mask,       0x01 << 0
      .equ RCC_APB1RSTR_TIM3RST_mask,       0x01 << 1
      .equ RCC_APB1RSTR_TIM4RST_mask,       0x01 << 2
      .equ RCC_APB1RSTR_TIM5RST_mask,       0x01 << 3
      .equ RCC_APB1RSTR_TIM6RST_mask,       0x01 << 4
      .equ RCC_APB1RSTR_TIM7RST_mask,       0x01 << 5
      .equ RCC_APB1RSTR_TIM12RST_mask,      0x01 << 6
      .equ RCC_APB1RSTR_TIM13RST_mask,      0x01 << 7
      .equ RCC_APB1RSTR_TIM14RST_mask,      0x01 << 8
      .equ RCC_APB1RSTR_WWDGRST_mask,       0x01 << 11
      .equ RCC_APB1RSTR_SPI2RST_mask,       0x01 << 14
      .equ RCC_APB1RSTR_SPI3RST_mask,       0x01 << 15
      .equ RCC_APB1RSTR_USART2RST_mask,     0x01 << 17
      .equ RCC_APB1RSTR_USART3RST_mask,     0x01 << 18
      .equ RCC_APB1RSTR_USART4RST_mask,     0x01 << 19
      .equ RCC_APB1RSTR_USART5RST_mask,     0x01 << 20
      .equ RCC_APB1RSTR_I2C1RST_mask,       0x01 << 21
      .equ RCC_APB1RSTR_I2C2RST_mask,       0x01 << 22
      .equ RCC_APB1RSTR_USBRST_mask,        0x01 << 23
      .equ RCC_APB1RSTR_CANRST_mask,        0x01 << 25
      .equ RCC_APB1RSTR_BKPRST_mask,        0x01 << 27
      .equ RCC_APB1RSTR_PWRRST_mask,        0x01 << 28
      .equ RCC_APB1RSTR_DACRST_mask,        0x01 << 29
    
    .equ RCC_AHBENR, RCC_base   0x14    /* AHB peripheral clock enable rgr.   */
    .equ RCC_AHBENR_reequ, 0x00000014
        .equ RCC_AHBENR_DMA1EN_mask,        0x01 << 0
        .equ RCC_AHBENR_DMA2EN_mask,        0x01 << 1
        .equ RCC_AHBENR_SRAMEN_mask,        0x01 << 2
        .equ RCC_AHBENR_FLITFEN_mask,       0x01 << 4
        .equ RCC_AHBENR_CRCEN_mask,         0x01 << 6
        .equ RCC_AHBENR_FSMCEN_mask,        0x01 << 8
        .equ RCC_AHBENR_SDIOEN_mask,        0x01 << 10
    
    .equ RCC_APB2ENR, RCC_base   0x18   /* APB2 peripheral clock enable rgr.  */
    .equ RCC_APB2ENR_reequ, 0x00000000
        .equ RCC_APB2ENR_AFIOEN_mask,       0x01 << 0
        .equ RCC_APB2ENR_IOPAEN_mask,       0x01 << 2
        .equ RCC_APB2ENR_IOPBEN_mask,       0x01 << 3
        .equ RCC_APB2ENR_IOPCEN_mask,       0x01 << 4
        .equ RCC_APB2ENR_IOPDEN_mask,       0x01 << 5
        .equ RCC_APB2ENR_IOPEEN_mask,       0x01 << 6
        .equ RCC_APB2ENR_IOPFEN_mask,       0x01 << 7
        .equ RCC_APB2ENR_IOPGEN_mask,       0x01 << 8
        .equ RCC_APB2ENR_ADC1EN_mask,       0x01 << 9
        .equ RCC_APB2ENR_ADC2EN_mask,       0x01 << 10
        .equ RCC_APB2ENR_TIM1EN_mask,       0x01 << 11
        .equ RCC_APB2ENR_SPI1EN_mask,       0x01 << 12
        .equ RCC_APB2ENR_TIM8EN_mask,       0x01 << 13
        .equ RCC_APB2ENR_USART1EN_mask,     0x01 << 14
        .equ RCC_APB2ENR_ADC3EN_mask,       0x01 << 15
        .equ RCC_APB2ENR_TIM9EN_mask,       0x01 << 19
        .equ RCC_APB2ENR_TIM10EN_mask,      0x01 << 20
        .equ RCC_APB2ENR_TIM11EN_mask,      0x01 << 21
    
    .equ RCC_APB1ENR, RCC_base   0x1c   /* APB1 peripheral clock enable rgr.  */
    .equ RCC_APB1ENR_reequ, 0x00000000
        .equ RCC_APB1ENR_TIM2EN_mask,       0x01 << 0
        .equ RCC_APB1ENR_TIM3EN_mask,       0x01 << 1
        .equ RCC_APB1ENR_TIM4EN_mask,       0x01 << 2
        .equ RCC_APB1ENR_TIM5EN_mask,       0x01 << 3
        .equ RCC_APB1ENR_TIM6EN_mask,       0x01 << 4
        .equ RCC_APB1ENR_TIM7EN_mask,       0x01 << 5
        .equ RCC_APB1ENR_TIM12EN_mask,      0x01 << 6
        .equ RCC_APB1ENR_TIM13EN_mask,      0x01 << 7
        .equ RCC_APB1ENR_TIM14EN_mask,      0x01 << 8
        .equ RCC_APB1ENR_WWDGEN_mask,       0x01 << 11
        .equ RCC_APB1ENR_SPI2EN_mask,       0x01 << 14
        .equ RCC_APB1ENR_SPI3EN_mask,       0x01 << 15
        .equ RCC_APB1ENR_USART2EN_mask,     0x01 << 17
        .equ RCC_APB1ENR_USART3EN_mask,     0x01 << 18
        .equ RCC_APB1ENR_USART4EN_mask,     0x01 << 19
        .equ RCC_APB1ENR_USART5EN_mask,     0x01 << 20
        .equ RCC_APB1ENR_I2C1EN_mask,       0x01 << 21
        .equ RCC_APB1ENR_I2C2EN_mask,       0x01 << 22
        .equ RCC_APB1ENR_USBEN_mask,        0x01 << 23
        .equ RCC_APB1ENR_CANEN_mask,        0x01 << 25
        .equ RCC_APB1ENR_BKPEN_mask,        0x01 << 27
        .equ RCC_APB1ENR_PWREN_mask,        0x01 << 28
        .equ RCC_APB1ENR_DACEN_mask,        0x01 << 29
    
    .equ RCC_BDCR, RCC_base   0x20      /* Backup domain control register     */
    .equ RCC_BDCR_reequ, 0x00000000
      .equ RCC_BDCR_LSEON_mask,             0x01 << 0
      .equ RCC_BDCR_LSERDY_mask,            0x01 << 1
      .equ RCC_BDCR_LSEBYP_mask,            0x01 << 2
      
      .equ RCC_BDCR_RTCSEL_mask,            0x03 << 8
      .equ RCC_BDCR_RTCSEL_noClock,         0x00
      .equ RCC_BDCR_RTCSEL_lse,             0x01 << 8
      .equ RCC_BDCR_RTCSEL_lsi,             0x02 << 8
      .equ RCC_BDCR_RTCSEL_hse,             0x03 << 8
      
      .equ RCC_BDCR_RTCEN_mask,             0x01 << 15
      .equ RCC_BDCR_BDRST_mask,             0x01 << 16
    
    .equ RCC_CSR, RCC_base   0x24       /* Control/status register            */
    .equ RCC_CSR_reequ, 0x0C000000
        .equ RCC_CSR_LSION_mask,            0x01 << 0
        .equ RCC_CSR_LSIRDY_mask,           0x01 << 1
        .equ RCC_CSR_RMVF_mask,             0x01 << 24
        .equ RCC_CSR_PINRSTF_mask,          0x01 << 26
        .equ RCC_CSR_PORRSTF_mask,          0x01 << 27
        .equ RCC_CSR_SFTRSTF_mask,          0x01 << 28
        .equ RCC_CSR_IWDGRSTF_mask,         0x01 << 29
        .equ RCC_CSR_WWDGRSTF_mask,         0x01 << 30
        .equ RCC_CSR_LPWRRSTF_mask,         0x01 << 31

Finally, the console output:

11:43:02 **** Incremental Build of configuration Debug for project minimal ****
make all 
Building file: ../src/main.S
Invoking: GNU Arm Cross Assembler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections  -g3 -x assembler-with-cpp -I"E:\_ARM_workspace2\minimal\src" -I"E:\_ARM_workspace2\minimal\inc" -Wa,-adhlns="src/main.o.lst" --save-temps -v -MMD -MP -MF"src/main.d" -MT"src/main.o" -c -o "src/main.o" "../src/main.S"
Using built-in specs.
COLLECT_AS_OPTIONS='-adhlns=src/main.o.lst'
COLLECT_GCC=arm-none-eabi-gcc
Target: arm-none-eabi
Configured with: /Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/sources/gcc/configure --prefix=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc --prefix=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc --infodir=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/share/doc/info --mandir=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/share/doc/man --htmldir=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/share/doc/html --pdfdir=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/share/doc/pdf --build=x86_64-pc-linux-gnu --host=x86_64-w64-mingw32 --target=arm-none-eabi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libsanitizer --disable-libssp --disable-nls --disable-shared --disable-threads --disable-tls --enable-checking=release --enable-languages=c,c  ,fortran --enable-mingw-wildcard --with-gmp=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/libs --with-newlib --with-pkgversion='xPack GNU Arm Embedded GCC x86_64' --with-gnu-as --with-gnu-ld --with-system-zlib --with-sysroot=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/arm-none-eabi --with-native-system-header-dir=/include --disable-libatomic --enable-multilib --with-multilib-list=aprofile,rmprofile
Thread model: single
Supported LTO compression algorithms: zlib
gcc version 11.3.1 20220712 (xPack GNU Arm Embedded GCC x86_64) 
COLLECT_GCC_OPTIONS='-mcpu=cortex-m3' '-mthumb' '-O0' '-fmessage-length=0' '-fsigned-char' '-ffunction-sections' '-fdata-sections' '-g3' '-I' 'E:\_ARM_workspace2\minimal\src' '-I' 'E:\_ARM_workspace2\minimal\inc' '-save-temps' '-v' '-MMD' '-MP' '-MF' 'src/main.d' '-MT' 'src/main.o' '-c' '-o' 'src/main.o' '-mfloat-abi=soft' '-mlibarch=armv7-m' '-march=armv7-m' '-dumpdir' 'src/'
 c:/program files/eclipse/toolchains/arm-none-eabi/bin/../libexec/gcc/arm-none-eabi/11.3.1/cc1.exe -E -lang-asm -quiet -v -I E:\_ARM_workspace2\minimal\src -I E:\_ARM_workspace2\minimal\inc -imultilib thumb/v7-m/nofp -iprefix c:\program files\eclipse\toolchains\arm-none-eabi\bin\../lib/gcc/arm-none-eabi/11.3.1/ -isysroot c:\program files\eclipse\toolchains\arm-none-eabi\bin\../arm-none-eabi -MMD src/main.d -MF src/main.d -MP -MT src/main.o -dD -D__USES_INITFINI__ ../src/main.S -mcpu=cortex-m3 -mthumb -mfloat-abi=soft -mlibarch=armv7-m -march=armv7-m -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -g3 -fworking-directory -O0 -fpch-preprocess -fno-directives-only -o src/main.s
ignoring duplicate directory "c:/program files/eclipse/toolchains/arm-none-eabi/lib/gcc/../../lib/gcc/arm-none-eabi/11.3.1/include"
ignoring nonexistent directory "c:\program files\eclipse\toolchains\arm-none-eabi\bin\../arm-none-eabi/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/lib/gcc/arm-none-eabi/11.3.1/../../../../include"
ignoring duplicate directory "c:/program files/eclipse/toolchains/arm-none-eabi/lib/gcc/../../lib/gcc/arm-none-eabi/11.3.1/include-fixed"
ignoring duplicate directory "c:/program files/eclipse/toolchains/arm-none-eabi/lib/gcc/../../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/include"
ignoring duplicate directory "c:\program files\eclipse\toolchains\arm-none-eabi\bin\../arm-none-eabi/include"
#include "..." search starts here:
#include <...> search starts here:
 E:\_ARM_workspace2\minimal\src
 E:\_ARM_workspace2\minimal\inc
 c:\program files\eclipse\toolchains\arm-none-eabi\bin\../lib/gcc/arm-none-eabi/11.3.1/include
 c:\program files\eclipse\toolchains\arm-none-eabi\bin\../lib/gcc/arm-none-eabi/11.3.1/include-fixed
 c:\program files\eclipse\toolchains\arm-none-eabi\bin\../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/include
End of search list.
COLLECT_GCC_OPTIONS='-mcpu=cortex-m3' '-mthumb' '-O0' '-fmessage-length=0' '-fsigned-char' '-ffunction-sections' '-fdata-sections' '-g3' '-I' 'E:\_ARM_workspace2\minimal\src' '-I' 'E:\_ARM_workspace2\minimal\inc' '-save-temps' '-v' '-MMD' '-MP' '-MF' 'src/main.d' '-MT' 'src/main.o' '-c' '-o' 'src/main.o' '-mfloat-abi=soft' '-mlibarch=armv7-m' '-march=armv7-m' '-dumpdir' 'src/'
 c:/program files/eclipse/toolchains/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/as.exe --gdwarf-5 -v -I E:\_ARM_workspace2\minimal\src -I E:\_ARM_workspace2\minimal\inc -march=armv7-m -mfloat-abi=soft -meabi=5 -adhlns=src/main.o.lst -o src/main.o src/main.s
GNU assembler version 2.38 (arm-none-eabi) using BFD version (xPack GNU Arm Embedded GCC x86_64) 2.38.20220708
COMPILER_PATH=c:/program files/eclipse/toolchains/arm-none-eabi/bin/../libexec/gcc/arm-none-eabi/11.3.1/;c:/program files/eclipse/toolchains/arm-none-eabi/bin/../libexec/gcc/;c:/program files/eclipse/toolchains/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/
LIBRARY_PATH=c:/program files/eclipse/toolchains/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/thumb/v7-m/nofp/;c:/program files/eclipse/toolchains/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/;c:/program files/eclipse/toolchains/arm-none-eabi/bin/../arm-none-eabi/lib/thumb/v7-m/nofp/;c:/program files/eclipse/toolchains/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/;c:/program files/eclipse/toolchains/arm-none-eabi/bin/../lib/gcc/;c:/program files/eclipse/toolchains/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/;c:/program files/eclipse/toolchains/arm-none-eabi/bin/../arm-none-eabi/lib/
COLLECT_GCC_OPTIONS='-mcpu=cortex-m3' '-mthumb' '-O0' '-fmessage-length=0' '-fsigned-char' '-ffunction-sections' '-fdata-sections' '-g3' '-I' 'E:\_ARM_workspace2\minimal\src' '-I' 'E:\_ARM_workspace2\minimal\inc' '-save-temps' '-v' '-MMD' '-MP' '-MF' 'src/main.d' '-MT' 'src/main.o' '-c' '-o' 'src/main.o' '-mfloat-abi=soft' '-mlibarch=armv7-m' '-march=armv7-m' '-dumpdir' 'src/main.'
Finished building: ../src/main.S
 
Building file: ../src/procedures.S
Invoking: GNU Arm Cross Assembler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections  -g3 -x assembler-with-cpp -I"E:\_ARM_workspace2\minimal\src" -I"E:\_ARM_workspace2\minimal\inc" -Wa,-adhlns="src/procedures.o.lst" --save-temps -v -MMD -MP -MF"src/procedures.d" -MT"src/procedures.o" -c -o "src/procedures.o" "../src/procedures.S"
Using built-in specs.
COLLECT_AS_OPTIONS='-adhlns=src/procedures.o.lst'
COLLECT_GCC=arm-none-eabi-gcc
Target: arm-none-eabi
Configured with: /Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/sources/gcc/configure --prefix=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc --prefix=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc --infodir=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/share/doc/info --mandir=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/share/doc/man --htmldir=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/share/doc/html --pdfdir=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/share/doc/pdf --build=x86_64-pc-linux-gnu --host=x86_64-w64-mingw32 --target=arm-none-eabi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libsanitizer --disable-libssp --disable-nls --disable-shared --disable-threads --disable-tls --enable-checking=release --enable-languages=c,c  ,fortran --enable-mingw-wildcard --with-gmp=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/libs --with-newlib --with-pkgversion='xPack GNU Arm Embedded GCC x86_64' --with-gnu-as --with-gnu-ld --with-system-zlib --with-sysroot=/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/arm-none-eabi --with-native-system-header-dir=/include --disable-libatomic --enable-multilib --with-multilib-list=aprofile,rmprofile
Thread model: single
Supported LTO compression algorithms: zlib
gcc version 11.3.1 20220712 (xPack GNU Arm Embedded GCC x86_64) 
COLLECT_GCC_OPTIONS='-mcpu=cortex-m3' '-mthumb' '-O0' '-fmessage-length=0' '-fsigned-char' '-ffunction-sections' '-fdata-sections' '-g3' '-I' 'E:\_ARM_workspace2\minimal\src' '-I' 'E:\_ARM_workspace2\minimal\inc' '-save-temps' '-v' '-MMD' '-MP' '-MF' 'src/procedures.d' '-MT' 'src/procedures.o' '-c' '-o' 'src/procedures.o' '-mfloat-abi=soft' '-mlibarch=armv7-m' '-march=armv7-m' '-dumpdir' 'src/'
 c:/program files/eclipse/toolchains/arm-none-eabi/bin/../libexec/gcc/arm-none-eabi/11.3.1/cc1.exe -E -lang-asm -quiet -v -I E:\_ARM_workspace2\minimal\src -I E:\_ARM_workspace2\minimal\inc -imultilib thumb/v7-m/nofp -iprefix c:\program files\eclipse\toolchains\arm-none-eabi\bin\../lib/gcc/arm-none-eabi/11.3.1/ -isysroot c:\program files\eclipse\toolchains\arm-none-eabi\bin\../arm-none-eabi -MMD src/procedures.d -MF src/procedures.d -MP -MT src/procedures.o -dD -D__USES_INITFINI__ ../src/procedures.S -mcpu=cortex-m3 -mthumb -mfloat-abi=soft -mlibarch=armv7-m -march=armv7-m -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -g3 -fworking-directory -O0 -fpch-preprocess -fno-directives-only -o src/procedures.s
ignoring duplicate directory "c:/program files/eclipse/toolchains/arm-none-eabi/lib/gcc/../../lib/gcc/arm-none-eabi/11.3.1/include"
ignoring nonexistent directory "c:\program files\eclipse\toolchains\arm-none-eabi\bin\../arm-none-eabi/Host/home/ilg/Work/arm-none-eabi-gcc-11.3.1-1.1/win32-x64/install/arm-none-eabi-gcc/lib/gcc/arm-none-eabi/11.3.1/../../../../include"
ignoring duplicate directory "c:/program files/eclipse/toolchains/arm-none-eabi/lib/gcc/../../lib/gcc/arm-none-eabi/11.3.1/include-fixed"
ignoring duplicate directory "c:/program files/eclipse/toolchains/arm-none-eabi/lib/gcc/../../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/include"
ignoring duplicate directory "c:\program files\eclipse\toolchains\arm-none-eabi\bin\../arm-none-eabi/include"
#include "..." search starts here:
#include <...> search starts here:
 E:\_ARM_workspace2\minimal\src
 E:\_ARM_workspace2\minimal\inc
 c:\program files\eclipse\toolchains\arm-none-eabi\bin\../lib/gcc/arm-none-eabi/11.3.1/include
 c:\program files\eclipse\toolchains\arm-none-eabi\bin\../lib/gcc/arm-none-eabi/11.3.1/include-fixed
 c:\program files\eclipse\toolchains\arm-none-eabi\bin\../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/include
End of search list.
COLLECT_GCC_OPTIONS='-mcpu=cortex-m3' '-mthumb' '-O0' '-fmessage-length=0' '-fsigned-char' '-ffunction-sections' '-fdata-sections' '-g3' '-I' 'E:\_ARM_workspace2\minimal\src' '-I' 'E:\_ARM_workspace2\minimal\inc' '-save-temps' '-v' '-MMD' '-MP' '-MF' 'src/procedures.d' '-MT' 'src/procedures.o' '-c' '-o' 'src/procedures.o' '-mfloat-abi=soft' '-mlibarch=armv7-m' '-march=armv7-m' '-dumpdir' 'src/'
 c:/program files/eclipse/toolchains/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/as.exe --gdwarf-5 -v -I E:\_ARM_workspace2\minimal\src -I E:\_ARM_workspace2\minimal\inc -march=armv7-m -mfloat-abi=soft -meabi=5 -adhlns=src/procedures.o.lst -o src/procedures.o src/procedures.s
GNU assembler version 2.38 (arm-none-eabi) using BFD version (xPack GNU Arm Embedded GCC x86_64) 2.38.20220708
../src/procedures.S: Assembler messages:
../src/procedures.S:17: Error: syntax error -- `ldr r2,=~(RCC_CFGR_HPRE_mask|RCC_CFGR_PPRE1_mask|RCC_CFGR_PPRE2_mask|RCC_CFGR_ADCPRE_mask|RCC_CFGR_MCO_mask)'
../src/procedures.S:20: Error: syntax error -- `ldr r2,=~RCC_CR_CSSON_mask'
make: *** [src/subdir.mk:26: src/procedures.o] Error 1
"make all" terminated with exit code 2. Build might be incomplete.

11:43:02 Build Failed. 3 errors, 0 warnings. (took 354ms)

CodePudding user response:

This is what a minimal example looks like.

.equ BIT_30, (1 << 30)
.equ BIT_27, (1 << 27)
.equ BIT_25, (1 << 25)
.equ BIT_5,  (1 << 5 )
ldr r0, = ~(BIT_30 | BIT_27 | BIT_25 | BIT_5)

That is implied from the info provided in the question. You did not indicate architecture so...

arm-none-eabi-as --version
GNU assembler (GNU Binutils) 2.39
Copyright (C) 2022 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `arm-none-eabi'.

arm-none-eabi-as so.s -o so.o
arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   e51f0004    ldr r0, [pc, #-4]   ; 4 <BIT_5-0x1c>
   4:   b5ffffdf    .word   0xb5ffffdf

No errors nor warnings.

arm-none-eabi-gcc -c so.s -o so.o
arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   e51f0004    ldr r0, [pc, #-4]   ; 4 <BIT_5-0x1c>
   4:   b5ffffdf    .word   0xb5ffffdf

cp so.s so.S

arm-none-eabi-gcc -c so.S -o so.o
arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   e51f0004    ldr r0, [pc, #-4]   ; 4 <BIT_5-0x1c>
   4:   b5ffffdf    .word   0xb5ffffdf

and now

arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -c so.S -o so.o
arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   4800        ldr r0, [pc, #0]    ; (4 <BIT_5-0x1c>)
   2:   0000        .short  0x0000
   4:   b5ffffdf    .word   0xb5ffffdf

getting closer to your code

so.inc

.equ BIT_30, (1 << 30)
.equ BIT_27, (1 << 27)
.equ BIT_25, (1 << 25)
.equ BIT_5,  (1 << 5 )

so.s

.include "so.inc"

ldr r0, = ~(BIT_30 | BIT_27 | BIT_25 | BIT_5)

still works

arm-none-eabi-as -mcpu=cortex-m3 so.s -o so.o
arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   4800        ldr r0, [pc, #0]    ; (4 <BIT_5-0x1c>)
   2:   0000        .short  0x0000
   4:   b5ffffdf    .word   0xb5ffffdf

GNU assembler version 2.38 (arm-none-eabi) using BFD version (xPack GNU Arm Embedded GCC x86_64) 2.38.20220708 ../src/procedures.S: Assembler messages: ../src/procedures.S:17: Error: syntax error -- ldr r2,=~RCC_CFGR_HPRE_mask|RCC_CFGR_PPRE1_mask|RCC_CFGR_PPRE2_mask|RCC_CFGR_ADCPRE_mask|RCC_CFGR_MCO_mask)' ../src/procedures.S:20: Error: syntax error -- ldr r2,=~RCC_CR_CSSON_mask'

So if we look at procedures.S we can easily provide a minimal example of the problem:

so.s

ldr r0, = ~(BIT_30 | BIT_27 | BIT_25 | BIT_5)

gives

arm-none-eabi-as -mcpu=cortex-m3 so.s -o so.o
so.s: Assembler messages:
so.s:2: Error: syntax error -- `ldr r0,=~(BIT_30|BIT_27|BIT_25|BIT_5)'

There we go. reproduced.

You include this red herring though

But GNU toolchain refuses to evaluate the constant expression producing Syntax error. (I can use only ldr r0, =BIT_30 for example).

so.s

ldr r0, =BIT_30

arm-none-eabi-as -mcpu=cortex-m3 so.s -o so.o
arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   4800        ldr r0, [pc, #0]    ; (4 <.text 0x4>)
   2:   0000        .short  0x0000
   4:   00000000    .word   0x00000000

arm-none-eabi-ld so.o -o so.elf
arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000000008000
arm-none-eabi-ld: so.o:(.text 0x4): undefined reference to `BIT_30'

As expected.

provide the definition

.equ BIT_30, (1 << 30)
ldr r0, =BIT_30

and

arm-none-eabi-as -mcpu=cortex-m3 so.s -o so.o
arm-none-eabi-ld so.o -o so.elf
arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000000008000
arm-none-eabi-objdump -d so.elf

so.elf:     file format elf32-littlearm


Disassembly of section .text:

00008000 <__bss_end__-0x10004>:
    8000:   f04f 4080   mov.w   r0, #1073741824 ; 0x40000000

As expected.

Had you tried this instead

so.s

ldr r0, =~BIT_30

You would have seen the problem

arm-none-eabi-as -mcpu=cortex-m3 so.s -o so.o
so.s: Assembler messages:
so.s:2: Error: syntax error -- `ldr r0,=~BIT_30'

Just like you see in procedures.S and actual minimal examples above.

  • Related