public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] analyze/change assembly code
@ 2012-10-30 11:08 Gerlando Falauto
  2012-11-10 11:25 ` Albert ARIBAUD
  2012-11-20  8:54 ` Marek Vasut
  0 siblings, 2 replies; 8+ messages in thread
From: Gerlando Falauto @ 2012-10-30 11:08 UTC (permalink / raw)
  To: u-boot

Hi all,

we recently to had face some nasty issues, where for some reason two 
(functionally identical) versions of some code behave very differently. 
Namely, one version works and the other doesn't always work.
It was clear from the beginning this was because of HW- (or compiler-) 
related issues.
I thought it would then be useful to have a peek at what the compiler is 
doing behind the scenes, and possibly make some simple changes to the 
code. For instance, inserting some nops here and there, or reordering 
some instructions, may help in tracking down these different behaviors.

I know the easiest way to LOOK at the file is simply to use objdump to 
disassemble an .o file. In the end I somehow managed to tamper with the 
makefiles so to get what I wanted for a given file, by adding a fake new 
".s" target with the recipe to build it, and having the .o file depend 
on a ".S" file (which would be a manual/changed copy of the generated 
".s" file) instead of the original ".c" file.
This is however not linear and nice at all. So I was wondering whether 
there already is a well-established way of having the make process 
create (and keep) assembly files which can be then manually changed.

Does my question make any sense at all? Any ideas?

Thank you,
Gerlando

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] analyze/change assembly code
  2012-10-30 11:08 [U-Boot] analyze/change assembly code Gerlando Falauto
@ 2012-11-10 11:25 ` Albert ARIBAUD
  2012-11-19  6:23   ` Gerlando Falauto
  2012-11-20  8:54 ` Marek Vasut
  1 sibling, 1 reply; 8+ messages in thread
From: Albert ARIBAUD @ 2012-11-10 11:25 UTC (permalink / raw)
  To: u-boot

Hi Gerlando,

On Tue, 30 Oct 2012 12:08:01 +0100, Gerlando Falauto
<gerlando.falauto@keymile.com> wrote:

> Hi all,
> 
> we recently to had face some nasty issues, where for some reason two 
> (functionally identical) versions of some code behave very differently. 
> Namely, one version works and the other doesn't always work.
> It was clear from the beginning this was because of HW- (or compiler-) 
> related issues.
> I thought it would then be useful to have a peek at what the compiler is 
> doing behind the scenes, and possibly make some simple changes to the 
> code. For instance, inserting some nops here and there, or reordering 
> some instructions, may help in tracking down these different behaviors.
> 
> I know the easiest way to LOOK at the file is simply to use objdump to 
> disassemble an .o file. In the end I somehow managed to tamper with the 
> makefiles so to get what I wanted for a given file, by adding a fake new 
> ".s" target with the recipe to build it, and having the .o file depend 
> on a ".S" file (which would be a manual/changed copy of the generated 
> ".s" file) instead of the original ".c" file.
> This is however not linear and nice at all. So I was wondering whether 
> there already is a well-established way of having the make process 
> create (and keep) assembly files which can be then manually changed.
> 
> Does my question make any sense at all? Any ideas?

Add -save-temps to the gcc arguments? Watch out for parallel build
issues, though.

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] analyze/change assembly code
  2012-11-10 11:25 ` Albert ARIBAUD
@ 2012-11-19  6:23   ` Gerlando Falauto
  0 siblings, 0 replies; 8+ messages in thread
From: Gerlando Falauto @ 2012-11-19  6:23 UTC (permalink / raw)
  To: u-boot

Hi Albert,

On 11/10/2012 12:25 PM, Albert ARIBAUD wrote:
> Hi Gerlando,
>
> On Tue, 30 Oct 2012 12:08:01 +0100, Gerlando Falauto
> <gerlando.falauto@keymile.com>  wrote:
>
>> Hi all,
>>
>> we recently to had face some nasty issues, where for some reason two
>> (functionally identical) versions of some code behave very differently.
>> Namely, one version works and the other doesn't always work.
>> It was clear from the beginning this was because of HW- (or compiler-)
>> related issues.
>> I thought it would then be useful to have a peek at what the compiler is
>> doing behind the scenes, and possibly make some simple changes to the
>> code. For instance, inserting some nops here and there, or reordering
>> some instructions, may help in tracking down these different behaviors.
>>
>> I know the easiest way to LOOK at the file is simply to use objdump to
>> disassemble an .o file. In the end I somehow managed to tamper with the
>> makefiles so to get what I wanted for a given file, by adding a fake new
>> ".s" target with the recipe to build it, and having the .o file depend
>> on a ".S" file (which would be a manual/changed copy of the generated
>> ".s" file) instead of the original ".c" file.
>> This is however not linear and nice at all. So I was wondering whether
>> there already is a well-established way of having the make process
>> create (and keep) assembly files which can be then manually changed.
>>
>> Does my question make any sense at all? Any ideas?
>
> Add -save-temps to the gcc arguments? Watch out for parallel build
> issues, though.

I tried, and it partly does the trick, in that the .s file is created 
and kept afterwards. Manually changing the .s file though doesn't help, 
as it gets overwritten by successive invocations...

Thanks anyway,
Gerlando

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] analyze/change assembly code
  2012-10-30 11:08 [U-Boot] analyze/change assembly code Gerlando Falauto
  2012-11-10 11:25 ` Albert ARIBAUD
@ 2012-11-20  8:54 ` Marek Vasut
  2012-11-20  9:43   ` Gerlando Falauto
  1 sibling, 1 reply; 8+ messages in thread
From: Marek Vasut @ 2012-11-20  8:54 UTC (permalink / raw)
  To: u-boot

Dear Gerlando Falauto,

> Hi all,
> 
> we recently to had face some nasty issues, where for some reason two
> (functionally identical) versions of some code behave very differently.
> Namely, one version works and the other doesn't always work.
> It was clear from the beginning this was because of HW- (or compiler-)
> related issues.
> I thought it would then be useful to have a peek at what the compiler is
> doing behind the scenes, and possibly make some simple changes to the
> code. For instance, inserting some nops here and there, or reordering
> some instructions, may help in tracking down these different behaviors.
> 
> I know the easiest way to LOOK at the file is simply to use objdump to
> disassemble an .o file. In the end I somehow managed to tamper with the
> makefiles so to get what I wanted for a given file, by adding a fake new
> ".s" target with the recipe to build it, and having the .o file depend
> on a ".S" file (which would be a manual/changed copy of the generated
> ".s" file) instead of the original ".c" file.
> This is however not linear and nice at all. So I was wondering whether
> there already is a well-established way of having the make process
> create (and keep) assembly files which can be then manually changed.
> 
> Does my question make any sense at all? Any ideas?

What compiler do you use? The Linaro one didn't behave properly for example.

Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] analyze/change assembly code
  2012-11-20  8:54 ` Marek Vasut
@ 2012-11-20  9:43   ` Gerlando Falauto
  2012-11-20 13:26     ` Marek Vasut
  0 siblings, 1 reply; 8+ messages in thread
From: Gerlando Falauto @ 2012-11-20  9:43 UTC (permalink / raw)
  To: u-boot

On 11/20/2012 09:54 AM, Marek Vasut wrote:
> Dear Gerlando Falauto,
>
>> Hi all,
>>
>> we recently to had face some nasty issues, where for some reason two
>> (functionally identical) versions of some code behave very differently.
>> Namely, one version works and the other doesn't always work.
>> It was clear from the beginning this was because of HW- (or compiler-)
>> related issues.
>> I thought it would then be useful to have a peek at what the compiler is
>> doing behind the scenes, and possibly make some simple changes to the
>> code. For instance, inserting some nops here and there, or reordering
>> some instructions, may help in tracking down these different behaviors.
>>
>> I know the easiest way to LOOK at the file is simply to use objdump to
>> disassemble an .o file. In the end I somehow managed to tamper with the
>> makefiles so to get what I wanted for a given file, by adding a fake new
>> ".s" target with the recipe to build it, and having the .o file depend
>> on a ".S" file (which would be a manual/changed copy of the generated
>> ".s" file) instead of the original ".c" file.
>> This is however not linear and nice at all. So I was wondering whether
>> there already is a well-established way of having the make process
>> create (and keep) assembly files which can be then manually changed.
>>
>> Does my question make any sense at all? Any ideas?
>
> What compiler do you use? The Linaro one didn't behave properly for example.

powerpc-linux-gcc (GCC) 4.6.4 20120303 (prerelease)
arm-linux-gnueabi-gcc (GCC) 4.6.4 20120303 (prerelease)

What do you mean it didn't behave properly???? How's that even possible?
A compiler which doesn't translate to assembly and from assembly to 
binary is by definition a _BROKEN_ compiler, so I strongly doubt that... 
Or maybe I got you wrong?

Best regards,
Gerlando

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] analyze/change assembly code
  2012-11-20  9:43   ` Gerlando Falauto
@ 2012-11-20 13:26     ` Marek Vasut
  2012-11-20 13:40       ` Albert ARIBAUD
  2012-11-20 13:48       ` Gerlando Falauto
  0 siblings, 2 replies; 8+ messages in thread
From: Marek Vasut @ 2012-11-20 13:26 UTC (permalink / raw)
  To: u-boot

Dear Gerlando Falauto,

> On 11/20/2012 09:54 AM, Marek Vasut wrote:
> > Dear Gerlando Falauto,
> > 
> >> Hi all,
> >> 
> >> we recently to had face some nasty issues, where for some reason two
> >> (functionally identical) versions of some code behave very differently.
> >> Namely, one version works and the other doesn't always work.
> >> It was clear from the beginning this was because of HW- (or compiler-)
> >> related issues.
> >> I thought it would then be useful to have a peek at what the compiler is
> >> doing behind the scenes, and possibly make some simple changes to the
> >> code. For instance, inserting some nops here and there, or reordering
> >> some instructions, may help in tracking down these different behaviors.
> >> 
> >> I know the easiest way to LOOK at the file is simply to use objdump to
> >> disassemble an .o file. In the end I somehow managed to tamper with the
> >> makefiles so to get what I wanted for a given file, by adding a fake new
> >> ".s" target with the recipe to build it, and having the .o file depend
> >> on a ".S" file (which would be a manual/changed copy of the generated
> >> ".s" file) instead of the original ".c" file.
> >> This is however not linear and nice at all. So I was wondering whether
> >> there already is a well-established way of having the make process
> >> create (and keep) assembly files which can be then manually changed.
> >> 
> >> Does my question make any sense at all? Any ideas?
> > 
> > What compiler do you use? The Linaro one didn't behave properly for
> > example.
> 
> powerpc-linux-gcc (GCC) 4.6.4 20120303 (prerelease)
> arm-linux-gnueabi-gcc (GCC) 4.6.4 20120303 (prerelease)

Where did you get this from, ELDK or elsewhere?

> What do you mean it didn't behave properly???? How's that even possible?

The Linaro toolchain had broken libgcc and u-boot pulls in components from this 
libgcc ... thus the breakage.

> A compiler which doesn't translate to assembly and from assembly to
> binary is by definition a _BROKEN_ compiler, so I strongly doubt that...
> Or maybe I got you wrong?
> 
> Best regards,
> Gerlando

Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] analyze/change assembly code
  2012-11-20 13:26     ` Marek Vasut
@ 2012-11-20 13:40       ` Albert ARIBAUD
  2012-11-20 13:48       ` Gerlando Falauto
  1 sibling, 0 replies; 8+ messages in thread
From: Albert ARIBAUD @ 2012-11-20 13:40 UTC (permalink / raw)
  To: u-boot

Hi Marek, Gerlando,

On Tue, 20 Nov 2012 14:26:15 +0100, Marek Vasut <marex@denx.de> wrote:

> > What do you mean it didn't behave properly???? How's that even possible?
> 
> The Linaro toolchain had broken libgcc and u-boot pulls in components from this 
> libgcc ... thus the breakage.

Marek: I don't know if that is supposed to be a case where Linaro is
supposed to fail, but FWIW, a versatileqemu build performed with the
Linaro ARM gcc version from Ubuntu 12.04 would fail to run whereas built
with the Linaro ARM gcc from Ubuntu 12.10 -- 4.7.2 (Ubuntu/Linaro
4.7.2-1ubuntu1) -- it does work. So maybe Linaro fixed their act.

> > A compiler which doesn't translate to assembly and from assembly to
> > binary is by definition a _BROKEN_ compiler

Gerlando, you may have to revise this definition: I think LLVM does
not necessarily translate through assembly language, at least, not
through the target's assembly language, and LLVM assembly language may
count as 'intermediate representation' rather than true 'assembly
language'.

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] analyze/change assembly code
  2012-11-20 13:26     ` Marek Vasut
  2012-11-20 13:40       ` Albert ARIBAUD
@ 2012-11-20 13:48       ` Gerlando Falauto
  1 sibling, 0 replies; 8+ messages in thread
From: Gerlando Falauto @ 2012-11-20 13:48 UTC (permalink / raw)
  To: u-boot

On 11/20/2012 02:26 PM, Marek Vasut wrote:
> Dear Gerlando Falauto,
>
>> On 11/20/2012 09:54 AM, Marek Vasut wrote:
>>> Dear Gerlando Falauto,
>>>
>>>> Hi all,
>>>>
>>>> we recently to had face some nasty issues, where for some reason two
>>>> (functionally identical) versions of some code behave very differently.
>>>> Namely, one version works and the other doesn't always work.
>>>> It was clear from the beginning this was because of HW- (or compiler-)
>>>> related issues.
>>>> I thought it would then be useful to have a peek at what the compiler is
>>>> doing behind the scenes, and possibly make some simple changes to the
>>>> code. For instance, inserting some nops here and there, or reordering
>>>> some instructions, may help in tracking down these different behaviors.
>>>>
>>>> I know the easiest way to LOOK at the file is simply to use objdump to
>>>> disassemble an .o file. In the end I somehow managed to tamper with the
>>>> makefiles so to get what I wanted for a given file, by adding a fake new
>>>> ".s" target with the recipe to build it, and having the .o file depend
>>>> on a ".S" file (which would be a manual/changed copy of the generated
>>>> ".s" file) instead of the original ".c" file.
>>>> This is however not linear and nice at all. So I was wondering whether
>>>> there already is a well-established way of having the make process
>>>> create (and keep) assembly files which can be then manually changed.
>>>>
>>>> Does my question make any sense at all? Any ideas?
>>>
>>> What compiler do you use? The Linaro one didn't behave properly for
>>> example.
>>
>> powerpc-linux-gcc (GCC) 4.6.4 20120303 (prerelease)
>> arm-linux-gnueabi-gcc (GCC) 4.6.4 20120303 (prerelease)
>
> Where did you get this from, ELDK or elsewhere?

ELDK, correct.

>> What do you mean it didn't behave properly???? How's that even possible?
>
> The Linaro toolchain had broken libgcc and u-boot pulls in components from this
> libgcc ... thus the breakage.

OK, but... what's that to do with my question?
*WAAAAIIIT*!!!
You mean you suspect my problem might be due to a broken GCC?
No, that was not the case. In the end there was something wrong with 
some CPU settings, so the same code executed tons of times was failing 
every once in a while. Generated assembly was not wrong, though being 
able to refactor it might have been useful in order to identify what 
code pattern was likely to fail (e.g. arithmetics on a register read 
from memory, unless adding a NOP after the ALU operation -- weirdly 
enough, *after* as opposed to *between load and arithmetics*! ).

Anyway, any ideas on how to inspect/manipulate assembly (yes, also for 
catching compiler bugs)?

>> A compiler which doesn't translate to assembly and from assembly to
>> binary is by definition a _BROKEN_ compiler, so I strongly doubt that...
>> Or maybe I got you wrong?
>>
>> Best regards,
>> Gerlando
>
> Best regards,
> Marek Vasut

Best regards,
Gerlando

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2012-11-20 13:48 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-30 11:08 [U-Boot] analyze/change assembly code Gerlando Falauto
2012-11-10 11:25 ` Albert ARIBAUD
2012-11-19  6:23   ` Gerlando Falauto
2012-11-20  8:54 ` Marek Vasut
2012-11-20  9:43   ` Gerlando Falauto
2012-11-20 13:26     ` Marek Vasut
2012-11-20 13:40       ` Albert ARIBAUD
2012-11-20 13:48       ` Gerlando Falauto

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox