mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[Sparc] Support relocatable expressions in the assembler
Allow assembler expressions to start with an identifier. This allows for expressions such as ``` b symbol + 4 ``` and ``` mov symEnd - symStart, %g1 ``` The patch builds upon https://reviews.llvm.org/D47136. Reviewed By: joerg Differential Revision: https://reviews.llvm.org/D47458
This commit is contained in:
parent
d37d68a83e
commit
d254f97c03
@ -1054,18 +1054,12 @@ SparcAsmParser::parseSparcAsmOperand(std::unique_ptr<SparcOperand> &Op,
|
||||
case AsmToken::Integer:
|
||||
case AsmToken::LParen:
|
||||
case AsmToken::Dot:
|
||||
if (!getParser().parseExpression(EVal, E))
|
||||
Op = SparcOperand::CreateImm(EVal, S, E);
|
||||
break;
|
||||
case AsmToken::Identifier:
|
||||
if (getParser().parseExpression(EVal, E))
|
||||
break;
|
||||
|
||||
case AsmToken::Identifier: {
|
||||
StringRef Identifier;
|
||||
if (!getParser().parseIdentifier(Identifier)) {
|
||||
E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
|
||||
MCSymbol *Sym = getContext().getOrCreateSymbol(Identifier);
|
||||
|
||||
const MCExpr *Res = MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None,
|
||||
getContext());
|
||||
int64_t Res;
|
||||
if (!EVal->evaluateAsAbsolute(Res)) {
|
||||
SparcMCExpr::VariantKind Kind = SparcMCExpr::VK_Sparc_13;
|
||||
|
||||
if (getContext().getObjectFileInfo()->isPositionIndependent()) {
|
||||
@ -1074,14 +1068,11 @@ SparcAsmParser::parseSparcAsmOperand(std::unique_ptr<SparcOperand> &Op,
|
||||
else
|
||||
Kind = SparcMCExpr::VK_Sparc_GOT13;
|
||||
}
|
||||
|
||||
Res = SparcMCExpr::create(Kind, Res, getContext());
|
||||
|
||||
Op = SparcOperand::CreateImm(Res, S, E);
|
||||
EVal = SparcMCExpr::create(Kind, EVal, getContext());
|
||||
}
|
||||
Op = SparcOperand::CreateImm(EVal, S, E);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (Op) ? MatchOperand_Success : MatchOperand_ParseFail;
|
||||
}
|
||||
|
||||
|
@ -1,10 +1,43 @@
|
||||
! RUN: llvm-mc %s -arch=sparc -show-encoding | FileCheck %s
|
||||
! RUN: llvm-mc %s -arch=sparc -filetype=obj | llvm-objdump -r -d - | FileCheck %s --check-prefix=OBJDUMP
|
||||
|
||||
! CHECK: mov 1033, %o1 ! encoding: [0x92,0x10,0x24,0x09]
|
||||
mov (0x400|9), %o1
|
||||
! CHECK: mov 60, %o2 ! encoding: [0x94,0x10,0x20,0x3c]
|
||||
mov ((12+3)<<2), %o2
|
||||
|
||||
! CHECK: ba symStart+4 ! encoding: [0x10,0b10AAAAAA,A,A]
|
||||
! CHECK: fixup A - offset: 0, value: symStart+4, kind: fixup_sparc_br22
|
||||
! OBJDUMP: ba 1
|
||||
symStart:
|
||||
b symStart + 4
|
||||
|
||||
! CHECK: mov symEnd-symStart, %g1 ! encoding: [0x82,0x10,0b001AAAAA,A]
|
||||
! CHECK: fixup A - offset: 0, value: symEnd-symStart, kind: fixup_sparc_13
|
||||
! OBJDUMP: mov 24, %g1
|
||||
mov symEnd - symStart, %g1
|
||||
|
||||
! CHECK: sethi %hi(sym+10), %g2 ! encoding: [0x05,0b00AAAAAA,A,A]
|
||||
! CHECK: fixup A - offset: 0, value: %hi(sym+10), kind: fixup_sparc_hi22
|
||||
! OBJDUMP: R_SPARC_HI22 sym+0xa
|
||||
sethi %hi(sym + 10), %g2
|
||||
|
||||
! CHECK: call foo+40 ! encoding: [0b01AAAAAA,A,A,A]
|
||||
! CHECK: fixup A - offset: 0, value: foo+40, kind: fixup_sparc_call30
|
||||
! OBJDUMP: R_SPARC_WDISP30 foo+0x28
|
||||
call foo + 40
|
||||
|
||||
! CHECK: add %g1, val+100, %g1 ! encoding: [0x82,0x00,0b011AAAAA,A]
|
||||
! CHECK: fixup A - offset: 0, value: val+100, kind: fixup_sparc_13
|
||||
! OBJDUMP: R_SPARC_13 val+0x64
|
||||
add %g1, val + 100, %g1
|
||||
|
||||
! CHECK: add %g1, 100+val, %g2 ! encoding: [0x84,0x00,0b011AAAAA,A]
|
||||
! CHECK: fixup A - offset: 0, value: 100+val, kind: fixup_sparc_13
|
||||
! OBJDUMP: R_SPARC_13 val+0x64
|
||||
add %g1, 100 + val, %g2
|
||||
symEnd:
|
||||
|
||||
! "." is exactly like a temporary symbol equated to the current line.
|
||||
! RUN: llvm-mc %s -arch=sparc | FileCheck %s --check-prefix=DOTEXPR
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user