Ulrich Weigand
2014-Nov-25 13:09 UTC
[LLVMdev] Remaining big-endian host issues in RuntimeDyld
Daniel Sanders wrote:>David: There's one more patch after r221047. I've just submitted it to >llvm-commits and you can find it at http://reviews.llvm.org/D6130. >I haven't touched the PowerPC path of createStubFunction() in that >patch since I'm not sure whether PowerPC's opcodes are endian-dependant >and (unlike the other paths) it currently specifies an endianness.I just noticed this. PowerPC opcodes are indeed endian-dependant. However, the current implementation of createStubFunction for PowerPC should be correct for any combination of host and target endianness. The functions named (somewhat misleadingly) writeInt32BE etc. actually do take the target endianness into account: void writeInt32BE(uint8_t *Addr, uint32_t Value) { if (IsTargetLittleEndian) sys::swapByteOrder(Value); *Addr = (Value >> 24) & 0xFF; *(Addr + 1) = (Value >> 16) & 0xFF; *(Addr + 2) = (Value >> 8) & 0xFF; *(Addr + 3) = Value & 0xFF; } Calling them with an explicit uint32_t value automatically takes host endianness into account, so everything will work out OK. It seems that these days, the writeInt32BE etc. routines are actually equivalent to writeBytesUnaligned, so maybe those can now be merged. Back when I added PowerPC LE support, IIRC writeBytesUnaligned didn't do the right thing on some host/target combinations ... Bye, Ulrich