3

我看到了以下问题: 如何在 cpp 宏中生成换行符?

让我简要介绍一下 C++ 预处理器中的换行需求。我正在研究 ARM Realview 编译器 3.1 的代码,该代码使用嵌入式汇编代码和 C++ 代码。

#define DEFINE_FUNCTION(rtype, op, val) \
    __asm rtype nt_##op(void*) { \   
      str lr, [sp, ##val];bl vThunk_##op;ldr lr, [sp,##val];bx lr; \
    } \
   void vThunk_##op(void*)

DEFINE_FUNCTION(void*, mov_lt, #0x04)
{
     // do some operation
}

上面的宏声明了一个嵌入的汇编函数,它强制要求函数体中的每个语句之间有换行符。

我认为这是因为函数体中的文本是由 ARM 编译器盲目发送给 ARM 汇编器的。

为什么 C++ 预处理器现在仍然不支持多行替换?而且我不能在替换字符串中使用#。例如,对于这种组装,

str lr, [sp, #0x04]

我尝试了很多方法和方法,但都没有真正奏效。ARM 汇编器/编译器非常基础,以至于 GCC 中没有像 asm volatile 这样的 API。

DEFINE_FUNCTION 宏在很多地方都有使用,所以也不能忽略它。

因此,在最后考虑以下解决方案:

  • 使用 m4 预处理器代替 C++ 预处理器
  • 使用 C++ 模板以某种方式实现这一点并使用 grep/sed 替换 DEFINE_FUNCTION

任何人都可以给我指点或方法来做上述事情吗?我不能使用 ARM Realview 编译器 3.1 以外的任何编译器。

我需要一些像下面这样的扩展,带有新行 DEFINE_FUNCTION(void*, mov_lt, #0x04) {},,

__asm void* nt_mov_lt(void*) {   
      str lr, [sp, 0x04];
      bl vThunk_mov_lt;
      ldr lr, [sp,0x04];
      bx lr;
    }
 void vThunk_mov_lt(void*)
 {
     // do something
  }
4

3 回答 3

3

我使用 GNU m4 预处理器成功解决了上述问题。

m4_define('DEFINE_FUNCTION','
     __asm rtype nt_$2(void*) {  
      str lr, [sp, $3];
      bl vThunk_$1;
      ldr lr, [sp,$3];
      bx lr;
    } 
   void vThunk_$2(void*)')

DEFINE_FUNCTION(void*, mov_lt, 0x04)
{
}

使用 m4 预处理上述代码解决了我在代码中需要换行的问题。Ran m4 -P 作为预构建事件,以便在 C 预处理器和编译阶段进入图片之前处理源文件。

感谢您的帮助,很抱歉让您感到困惑。但是在最新的 C++ 编译器中确实有一个好的宏预处理器的范围。

于 2009-10-12T11:11:43.523 回答
1

每个 gas 版本都有不同的换行符,例如 AVR 有 $ 查找 ARM gas 版本的字符

于 2011-01-29T13:23:03.543 回答
0

您的示例非常令人困惑,但这不起作用吗?

#define DEFINE_FUNCTION(rtype, op, val) \
    __asm rtype nt_##op(void*) { \   
      str lr, [sp, val];\
      bl vThunk_##op;\
      ldr lr, [sp,val];\
      bx lr;\
    }\
   void vThunk_##op(void*)

当被称为

DEFINE_FUNCTION(void*, mov_lt, 0x04)  // notice no # here
{
     // do some operation
}

你会得到

__asm void* nt_mov_lt(void*) {   
      str lr, [sp, 0x04];
      bl vThunk_mov_lt;
      ldr lr, [sp,0x04];
      bx lr;
    }
 void vThunk_mov_lt(void*)
 {
     // do something
 }

这正是您所要求的。

于 2009-10-10T14:14:11.273 回答