GCC 4.5.2(在 Ubuntu 11.10 x64 上但编译为 32 位)生成无效的汇编代码,我很好奇是否可以在不更改代码的情况下修复,只需应用选项或类似的东西。请注意,优化已经是-O0。
我有两个功能:
inline long Class::Get()
{
long v = *(long*)(m_p);
m_p += 4;
return v;
}
inline void Class::Command()
{
m_p += Get();
}
GCC 4.5.2 生成这个汇编代码:
9840 m_p += Get();
f689eff5: mov 0x8(%ebp),%eax
f689eff8: mov 0xd4(%eax),%eax
f689effe: mov %eax,%esi
f689f000: mov 0x8(%ebp),%eax
f689f003: mov %eax,(%esp)
f689f006: call 0xf66116a0
f689f00b: lea (%esi,%eax,1),%edx
f689f00e: mov 0x8(%ebp),%eax
f689f011: mov %edx,0xd4(%eax)
如您所见,它将 m_p 值存储在 %esi 中,然后使用 lea 将返回值添加到它。但是::Get() 也确实改变了 m_p!GCC 似乎没有意识到这一点。因此,错误 m_p 不正确(比预期少 4 个字节),因为 %esi 中的值已过时。
我可以使用修复它
inline void Class::Command()
{
long v = Get();
m_p += v;
}
但我只是想知道是否可以在不更改代码的情况下应用一些 pragma 或类似的东西来消除错误。至于 gcc 版本,我坚持使用给定的版本。