[llvm-dev] A possible bug in the assembly parser for ARM
Peter Smith via llvm-dev
llvm-dev at lists.llvm.org
Mon Jul 31 03:31:09 PDT 2017
I agree that this is producing incorrect output. Are you able to
create a bug in https://bugs.llvm.org/ ?
When producing an object file from llvm-mc the .thumb_func appears to
give the right symbol type to f1 and f2, but when reassembling the
it-block.S file f1 is not given type STT_FUNC. The incorrect position
of the label f2 appears in the generated llvm-mc object, which could
cause a problem if the label where a branch target.
Peter
On 30 July 2017 at 05:25, 章明 via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> Dear developers,
>
>
> As the following code snippet copied from lib/MC/MCParser/AsmParser.cpp
> shows, when parsing a label, AsmParser::parseStatement calls the
> onLabelParsed method of a target parser after emitting the label:
>
>
> // Emit the label.
> if (!getTargetParser().isParsingInlineAsm())
> Out.EmitLabel(Sym, IDLoc);
>
> // If we are generating dwarf for assembly source files then gather the
> // info to make a dwarf label entry for this label if needed.
> if (getContext().getGenDwarfForAssembly())
> MCGenDwarfLabelEntry::Make(Sym, &getStreamer(), getSourceManager(),
> IDLoc);
>
> getTargetParser().onLabelParsed(Sym);
>
>
> For ARM, calling onLabelParsed after emitting the label seems to be a bug.
>
>
> If I understand it correctly, ARMAsmParser::onLabelParsed (defined in
> lib/Target/ARM/AsmParser/ARMAsmParser.cpp) performs two tasks:
>
> 1) Complete the current implicit IT block (if one is open for new
> conditional instructions) BEFORE the label, so that the IT block cannot be
> entered from the middle of it.
>
> 2) Emit a .thumb_func directive, if the label is the first label following a
> previously parsed .thumb_func directive without an optional symbol.
>
> Considering the tasks above, calling onLabelParsed after the label is
> emitted leads to two types of errors in the generated code:
>
> 1) Instructions of an IT block BEFORE the label may be incorrectly emitted
> AFTER the label.
>
> 2) .thumb_func directives, which should be emitted BEFORE the corresponding
> function symbols, are emitted AFTER the function symbols.
>
>
> I tested llvm-mc with the following assembly code:
>
>
> .text
> .syntax unified
> .p2align 1
> .code 16
> .globl f1
> .globl f2
> .thumb_func
> f1:
> CMP r0, #10
>
> .thumb_func
>
> MOVPL r0, #0
>
> f2:
> MOVS r1, #0
> .Ltmp:
> CMP r0, #0
> ITTT PL
> ADDPL r1, r1, r0
> SUBPL r0, r0, #1
> BPL .Ltmp
> MOV r0, r1
> BX lr
>
> .end
>
>
> The generated assembly code was as follows:
>
>
> .text
> .p2align 1
> .code 16
> .globl f1
> .globl f2
> f1:
> .thumb_func
> cmp r0, #10
>
>
>
> f2:
> it pl
> movpl r0, #0
> .thumb_func
> movs r1, #0
> .Ltmp:
> cmp r0, #0
> ittt pl
> addpl r1, r1, r0
> subpl r0, r0, #1
> bpl .Ltmp
> mov r0, r1
> bx lr
>
>
> By comparing the generated assembly code with the original assembly code, it
> can be seen that both types of errors are present in the generated code.
>
>
> I tested llvm-mc with the following command line:
>
>
> llvm-mc -arch=thumb -filetype=asm
> -mattr=+soft-float,-neon,-crypto,+strict-align -mcpu=cortex-m3 -n
> -triple=armv7m-none-none-eabi -o=it-block-roundtrip.s it-block.S
> -arm-implicit-it=always
>
>
> where it-block.S is the original assembly file and it-block-roundtrip.s is
> the generated assembly file.
>
>
>
> Ming Zhang
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
More information about the llvm-dev
mailing list