mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-29 06:30:30 +00:00
Thumb2 only force the fixup thumb bit for data relocations.
rdar://10493453 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145318 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
54b92113e2
commit
958da85b93
@ -273,13 +273,17 @@ bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout,
|
||||
|
||||
Value = Target.getConstant();
|
||||
|
||||
bool IsThumb = false;
|
||||
bool SetThumbBit = false;
|
||||
if (const MCSymbolRefExpr *A = Target.getSymA()) {
|
||||
const MCSymbol &Sym = A->getSymbol().AliasedSymbol();
|
||||
if (Sym.isDefined())
|
||||
Value += Layout.getSymbolOffset(&getSymbolData(Sym));
|
||||
if (isThumbFunc(&Sym))
|
||||
IsThumb = true;
|
||||
// ARM data fixups based from a thumb function address need to have the low
|
||||
// bit set. The actual value is always at least 16-bit aligned, so the
|
||||
// low bit is normally clear and available for use as an ISA flag for
|
||||
// interworking.
|
||||
if (Fixup.getKind() == FK_Data_4 && isThumbFunc(&Sym))
|
||||
SetThumbBit = true;
|
||||
}
|
||||
if (const MCSymbolRefExpr *B = Target.getSymB()) {
|
||||
const MCSymbol &Sym = B->getSymbol().AliasedSymbol();
|
||||
@ -302,11 +306,7 @@ bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout,
|
||||
Value -= Offset;
|
||||
}
|
||||
|
||||
// ARM fixups based from a thumb function address need to have the low
|
||||
// bit set. The actual value is always at least 16-bit aligned, so the
|
||||
// low bit is normally clear and available for use as an ISA flag for
|
||||
// interworking.
|
||||
if (IsThumb)
|
||||
if (SetThumbBit)
|
||||
Value |= 1;
|
||||
|
||||
return IsResolved;
|
||||
|
Loading…
Reference in New Issue
Block a user