Viewing C and Assembler inline
Hi,
how can I view C source and the resulting assembler in one file?
Like in the listing files generated by gcc.
Is there a CrossWorks way to do that?
Greet
-
I generate asm (with C code intermingled) list files by adding a python script to call objdump in the Post-Link Command project property:
python $(ProjectDir)/gen_lst_files.py 1 "$(ProjectDir)/$(OutDir)"
Here is my python v.2.6.2 script gen_lst_files.py:
from __future__ import print_function
import os
import subprocess
import sys
from stat import *
def gen_lst_files(path):
os.chdir(path)
file_list = os.walk(path).next()[2]
for filename in file_list:
if('.o' in filename):
run_objdump = False
st_obj = os.stat(filename)
fileout = filename.split('.')[0] + '.lst'
try:
if os.path.exists(fileout):
#print(fileout, 'exists')
st_lst = os.stat(fileout)
if st_obj[ST_MTIME] > st_lst[ST_MTIME]: #was object time modified after lst file
#print('time delta pos, run objdump')
run_objdump = True
else:
raise FileError
except:
#print('exception, run objdump')
run_objdump = True
if run_objdump == True:
arg = '"C:\Program Files\Rowley Associates Limited\CrossWorks for ARM 2.0\gcc\\bin\\objdump.exe" -S ' + filename + " > " + fileout
subprocess.call(arg, shell=True)
print(arg)
if __name__ == '__main__':
if len(sys.argv) >= 2:
if(sys.argv[1] == '1'):
print(sys.argv[2])
gen_lst_files(sys.argv[2])
else:
gen_lst_files(root_dir) -
@Jörg:
I tried your method and it works but the output is truncated and there are a lot of path statements. Here is a snipet..
mine:
--------------
if(n < 6)
28: e15b30bc ldrh r3, [fp, #-12]
2c: e3530005 cmp r3, #5 ; 0x5
30: 8a00002c bhi e8 <SetControlReg+0xe8>
{
s = NewBlock();
34: ebfffffe bl 0 <NewBlock>
38: e1a03000 mov r3, r0
3c: e50b3008 str r3, [fp, #-8]--------------
Yours:
--------------
66:C:/DEV/GCC_ARM_PROJECTS/AII_CTL\DdsBoard.c **** if(n < 6)
41 h r3, [fp, #-12]
42 0028 BC305BE1 cmp r3, #5
43 002c 050053E3 bhi .L3
44 0030 2C00008A .loc 1 68 0
67:C:/DEV/GCC_ARM_PROJECTS/AII_CTL\DdsBoard.c **** {
68:C:/DEV/GCC_ARM_PROJECTS/AII_CTL\DdsBoard.c **** s = NewBlock();
45 NewBlock
46 0034 FEFFFFEB mov r3, r0
47 0038 0030A0E1 str r3, [fp, #-8]
48 003c 08300BE5 .loc 1 69 0--------------
-
@Andy
The output isn't terribly readable. All "C" source is stripped. OP specifically said that is what he didn't want. There are a lot of .loc statements that help the compiler but don't really mean much to mere mortals like me. Pretty hard to beat objdump with the -S option. The example from above reads as follows from the asm file:
------------------
.loc 1 66 0
ldrh r3, [fp, #-12]
cmp r3, #5
bhi .L3
.loc 1 68 0
bl NewBlock
mov r3, r0
str r3, [fp, #-8]
.loc 1 69 0------------------
-
@Kelly
Thanks for the objdump.exe -S command.
FWIW I took this and put it into a windows batch file with these lines:
@echo off
echo Generating listing for %3.o.
"%~1/gcc/bin/objdump.exe" -S "%~2/%3.o" > "%~2/%3.lst"
Then in the project common options, "User Build Step Options" | "Post-Compile Command" field, saymakelisting.bat "$(StudioDir)" "$(OutDir)" $(InputName)
Thus I have a lst file with each successfully compiled C file and I don't need python. FWIW, I tried entering the objdump command directly in the Post-Compile Command field but CrossStudio mishandled the ">" redirector, hence I had to resort to a batch file.
PS: for those wondering about the use of tilde "~",
%~1 This expands %1 and removes any surrounding quotation marks ("")
Please sign in to leave a comment.
Comments
7 comments