我想检查boost::variant
在我的代码中应用的程序集输出,以便查看哪些中间调用被优化掉了.
当我编译以下示例(使用GCC 5.3 g++ -O3 -std=c++14 -S
)时,似乎编译器优化了所有内容并直接返回100:
(...)
main:
.LFB9320:
.cfi_startproc
movl $100, %eax
ret
.cfi_endproc
(...)
Run Code Online (Sandbox Code Playgroud)
#include <boost/variant.hpp>
struct Foo
{
int get() { return 100; }
};
struct Bar
{
int get() { return 999; }
};
using Variant = boost::variant<Foo, Bar>;
int run(Variant v)
{
return boost::apply_visitor([](auto& x){return x.get();}, v);
}
int main()
{
Foo f;
return run(f);
}
Run Code Online (Sandbox Code Playgroud)
但是,完整的程序集输出包含的内容远远超过上面的摘录,对我而言,它看起来永远不会被调用.有没有办法告诉GCC/clang删除所有"噪音"并输出程序运行时实际调用的内容?
完整装配输出:
.file "main1.cpp"
.section .rodata.str1.8,"aMS",@progbits,1
.align 8
.LC0:
.string "/opt/boost/include/boost/variant/detail/forced_return.hpp"
.section .rodata.str1.1,"aMS",@progbits,1
.LC1: …
Run Code Online (Sandbox Code Playgroud) 我的最终目标是为我的旧Actiontec调制解调器/路由器编译无线工具,以便将其配置为无线到以太网桥.目前它的无线功能(看似)由管理大部分Web界面的相同二进制文件控制,但看起来他们使用库无线工具在内部使用至少一些功能.
我以前从未为不同的CPU架构交叉编译,也不确定如何完全识别我需要做的事情.我正在尝试使用uClibc,因为它似乎在系统的其余部分使用,但我不知道如何为调制解调器环境配置buildroot.我根据来自下面的proc的信息最好地猜测了配置应该是什么,但有些错误,因为一个简单的C应用程序只返回0编译后它无法正常运行.
# cat /proc/version
Linux version 2.4.17_mvl21-malta-mips_fp_le (root@localhost.localdomain) (gcc version 2.95.3 20010315 (release/MontaVista)) #1 Thu Apr 21 18:04:37 PDT 2005
# cat /proc/cpuinfo
processor : 0
cpu model : MIPS 4KEc V4.8
BogoMIPS : 149.91
wait instruction : no
microsecond timers : yes
extra interrupt vector : yes
hardware watchpoint : yes
VCED exceptions : not available
VCEI exceptions : not available
Run Code Online (Sandbox Code Playgroud) 遵循这个问题:使用跳转(和链接)指令的奇怪的MIPS汇编程序行为我有一个工作的GNU程序集工具链用于我的单周期MIPS项目(没有分支延迟插槽!).我真的更喜欢用C语写.从编译器生成的代码本身确实运行,但我必须每次都手动编辑汇编源,因为GCC出于某种原因喜欢自动重新排序分支指令本身.我不想用脚本来破解这个,以确定何时重新排序分支.
有没有办法绕过这个?GCC出于某种原因生成这样的代码:
.set noreorder
...
jr $ra <-- GCC reordered for me!
addi $v0, $v0, 10 <--
...
.set reorder
Run Code Online (Sandbox Code Playgroud)
在哪里我真的想要为汇编程序提供这样的东西:
.set noreorder
addi $v0, $v0, 10
jr $ra
Run Code Online (Sandbox Code Playgroud) mips-gcc生成的MIPS汇编代码几乎(但不是完全)运行在Mars MIPS模拟器上。例如:
此外,生成的程序集还没有完全设置好,因此无法正确启动和停止(即,末尾没有sycall 10)。
这些问题似乎都可以通过简单的脚本轻松解决。但是,在我重新发明轮子之前,我想知道:(1)是否有任何gcc标志将使其中的一些问题消失?(2)是否有人知道可以修复mips-gcc输出以使其在火星上运行的现有程序?
(FWIW,我在gcc 3.3.6和4.6.1上看到相同的行为。)
我已经看到了几种方法(到目前为止我没有尝试过一对但我想要轻松地隔离这个)
应该有一种方法来做这个VIA gcc我更喜欢这个我只是一直打墙.
我正在使用debian7并且可以使用其他任何风味的东西(我暂时想要避免qemu casue我想要更小规模的东西.)我在这里找到这个例子.
http://moozing.wordpress.com/2011/04/05/cross-compile-in-debian/
我已经能够完成所有工作,在此过程中,我必须安装libgmp3c2-dummy_1.0_all.deb才能继续
刚才我需要编译,所有我正在编译的是一个简单的hello world脚本但是,编译时我不能导致libgmp.so.3不在/ usr/lib/dir但是,/ usr /中有一个lib/mips-linux-gnu-gcc文件夹我以为我会复制它以查看是否可以编译它,我得到的是这个elf文件是用big-endian编码的,这是有道理的.但是我缺少什么来编译这个文件?
我试图将这个东西编译成大端,我认为要么是我对库有困惑,要么我需要一个不同的libgmp.so.3 ..
我也尝试了apt-get install libgmp-dev libgmp3-dev.
感谢您的帮助,如果可以的话!:)如果你知道一个简单的方法来做这个不会占用我的机器上的一堆空间然后我是开放但我想尝试与GCC和使用工具链.
谢谢!
我正在尝试将C代码文件编译成mips程序集.我的操作系统是suse linux,我已经安装了gcc和cross-mips-binutils - 我根本不知道用什么命令交叉编译成mips.
我已经用过了:
gcc -S text.c -o text.s
它编译得很好 - 只是没有进入mips.我还查看了堆栈溢出的其他帖子,如:如何交叉编译MIPS?但要么它们没有帮助,要么就像这个,有用的链接不再起作用.
我将不胜感激任何帮助!谢谢 :)
我知道要编译到汇编,我应该使用或者-S
选项,但是我如何获得MIPS汇编?gcc
g++
我试过了
g++ -march=mips2 dll.c
Run Code Online (Sandbox Code Playgroud)
但这给出了错误
dll.c:1:0: error: bad value (mips2) for -march= switch
Run Code Online (Sandbox Code Playgroud)
我看到了编译命令的建议mips_gcc
,但我找不到如何安装该编译器.
我正在使用Ubuntu 64位,如果这有帮助的话.
这是高级函数:J[6] = K[d-e]
d = $t0,e = $t1,J = $s1,K = $s2,最终结果放入$s4
到目前为止我有:
lw $t2, 24($s1) #Load J[6] into $t2
sub $t3, $t0, $t1 #Subtract e from d to $t3
Run Code Online (Sandbox Code Playgroud)
我知道我不能做的是lw $t4, $t3($s2)
但我不知道如何翻译 K[$t0 - $t1]。
我需要将其翻译成MIPS汇编(在Mars Assembler上工作)
void mm ( double x[][], double y[][], double z[][], int n)
{
int i,j;
for (i=0; i !=n; i++)
for (j=0; j !=n; j++)
z[i][j] = 0.0;
for (k=0; k !=n; k++)
z[i][j] = z[i][j] + x[i][k] * y[k][j];
}
Run Code Online (Sandbox Code Playgroud)