mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
Merging r222672:
------------------------------------------------------------------------ r222672 | uweigand | 2014-11-24 18:09:47 +0000 (Mon, 24 Nov 2014) | 10 lines [PowerPC] Fix PR 21652 - copy st_other bits on symbol assignment When processing an assignment in the integrated assembler that sets a symbol to the value of another symbol, we need to copy the st_other bits that encode the local entry point offset. Modeled after MipsTargetELFStreamer::emitAssignment handling of the ELF::STO_MIPS_MICROMIPS flag. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_35@223743 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
43c3e8b176
commit
ce361cb525
@ -184,6 +184,23 @@ public:
|
||||
if ((Flags & ELF::EF_PPC64_ABI) == 0)
|
||||
MCA.setELFHeaderEFlags(Flags | 2);
|
||||
}
|
||||
void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override {
|
||||
// When encoding an assignment to set symbol A to symbol B, also copy
|
||||
// the st_other bits encoding the local entry point offset.
|
||||
if (Value->getKind() != MCExpr::SymbolRef)
|
||||
return;
|
||||
const MCSymbol &RhsSym =
|
||||
static_cast<const MCSymbolRefExpr *>(Value)->getSymbol();
|
||||
MCSymbolData &Data = getStreamer().getOrCreateSymbolData(&RhsSym);
|
||||
MCSymbolData &SymbolData = getStreamer().getOrCreateSymbolData(Symbol);
|
||||
// The "other" values are stored in the last 6 bits of the second byte.
|
||||
// The traditional defines for STO values assume the full byte and thus
|
||||
// the shift to pack it.
|
||||
unsigned Other = MCELF::getOther(SymbolData) << 2;
|
||||
Other &= ~ELF::STO_PPC64_LOCAL_MASK;
|
||||
Other |= (MCELF::getOther(Data) << 2) & ELF::STO_PPC64_LOCAL_MASK;
|
||||
MCELF::setOther(SymbolData, Other >> 2);
|
||||
}
|
||||
};
|
||||
|
||||
class PPCTargetMachOStreamer : public PPCTargetStreamer {
|
||||
|
@ -35,6 +35,9 @@ caller_other:
|
||||
nop
|
||||
.size caller_other, .-caller_other
|
||||
|
||||
copy1 = callee1
|
||||
copy2 = callee2
|
||||
|
||||
# Verify that use of .localentry implies ABI version 2
|
||||
# CHECK: ElfHeader {
|
||||
# CHECK: Flags [ (0x2)
|
||||
@ -68,3 +71,19 @@ caller_other:
|
||||
# CHECK-NEXT: Other: 0
|
||||
# CHECK-NEXT: Section: .text
|
||||
|
||||
# Verify that symbol assignment copies the Other bits.
|
||||
# CHECK: Name: copy1
|
||||
# CHECK-NEXT: Value:
|
||||
# CHECK-NEXT: Size: 16
|
||||
# CHECK-NEXT: Binding: Local
|
||||
# CHECK-NEXT: Type: Function
|
||||
# CHECK-NEXT: Other: 96
|
||||
# CHECK-NEXT: Section: .text
|
||||
# CHECK: Name: copy2
|
||||
# CHECK-NEXT: Value:
|
||||
# CHECK-NEXT: Size: 8
|
||||
# CHECK-NEXT: Binding: Local
|
||||
# CHECK-NEXT: Type: Function
|
||||
# CHECK-NEXT: Other: 0
|
||||
# CHECK-NEXT: Section: .text
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user