Clang-format before editing.
This commit is contained in:
parent
c4e3d0903e
commit
ac33bdd031
|
@ -34,10 +34,13 @@ static uint32_t read4(char* addr, int type)
|
||||||
{
|
{
|
||||||
unsigned short word0, word1;
|
unsigned short word0, word1;
|
||||||
|
|
||||||
if (type & RELBR) {
|
if (type & RELBR)
|
||||||
|
{
|
||||||
word0 = (UBYTE(addr[0]) << WIDTH) + UBYTE(addr[1]);
|
word0 = (UBYTE(addr[0]) << WIDTH) + UBYTE(addr[1]);
|
||||||
word1 = (UBYTE(addr[2]) << WIDTH) + UBYTE(addr[3]);
|
word1 = (UBYTE(addr[2]) << WIDTH) + UBYTE(addr[3]);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
word0 = (UBYTE(addr[1]) << WIDTH) + UBYTE(addr[0]);
|
word0 = (UBYTE(addr[1]) << WIDTH) + UBYTE(addr[0]);
|
||||||
word1 = (UBYTE(addr[3]) << WIDTH) + UBYTE(addr[2]);
|
word1 = (UBYTE(addr[3]) << WIDTH) + UBYTE(addr[2]);
|
||||||
}
|
}
|
||||||
|
@ -145,14 +148,12 @@ static uint32_t get_powerpc_valu(char* addr, uint16_t type)
|
||||||
/* branch instruction */
|
/* branch instruction */
|
||||||
return opcode1 & 0x03fffffd;
|
return opcode1 & 0x03fffffd;
|
||||||
}
|
}
|
||||||
else if (((opcode1 & 0xfc1f0000) == 0x3c000000) &&
|
else if (((opcode1 & 0xfc1f0000) == 0x3c000000) && ((opcode2 & 0xfc000000) == 0x60000000))
|
||||||
((opcode2 & 0xfc000000) == 0x60000000))
|
|
||||||
{
|
{
|
||||||
/* addis / ori instruction pair */
|
/* addis / ori instruction pair */
|
||||||
return ((opcode1 & 0xffff) << 16) | (opcode2 & 0xffff);
|
return ((opcode1 & 0xffff) << 16) | (opcode2 & 0xffff);
|
||||||
}
|
}
|
||||||
else if (((opcode1 & 0xfc1f0000) == 0x3c000000) &&
|
else if (((opcode1 & 0xfc1f0000) == 0x3c000000) && is_powerpc_memory_op(opcode2))
|
||||||
is_powerpc_memory_op(opcode2))
|
|
||||||
{
|
{
|
||||||
/* addis / memoryop instruction pair */
|
/* addis / memoryop instruction pair */
|
||||||
uint16_t hi = opcode1 & 0xffff;
|
uint16_t hi = opcode1 & 0xffff;
|
||||||
|
@ -166,7 +167,8 @@ static uint32_t get_powerpc_valu(char* addr, uint16_t type)
|
||||||
return ((hi << 16) | lo);
|
return ((hi << 16) | lo);
|
||||||
}
|
}
|
||||||
|
|
||||||
fatal("Don't know how to read from PowerPC fixup on instructions 0x%08lx+0x%08lx",
|
fatal(
|
||||||
|
"Don't know how to read from PowerPC fixup on instructions 0x%08lx+0x%08lx",
|
||||||
(unsigned long)opcode1, (unsigned long)opcode2);
|
(unsigned long)opcode1, (unsigned long)opcode2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,7 +211,8 @@ static uint32_t get_mips_valu(char* addr)
|
||||||
*/
|
*/
|
||||||
static uint32_t getvalu(char* addr, uint16_t type)
|
static uint32_t getvalu(char* addr, uint16_t type)
|
||||||
{
|
{
|
||||||
switch (type & RELSZ) {
|
switch (type & RELSZ)
|
||||||
|
{
|
||||||
case RELO1:
|
case RELO1:
|
||||||
return UBYTE(addr[0]);
|
return UBYTE(addr[0]);
|
||||||
case RELO2:
|
case RELO2:
|
||||||
|
@ -236,10 +239,13 @@ static void write2(uint16_t valu, char* addr, int type)
|
||||||
{
|
{
|
||||||
unsigned short word0, word1;
|
unsigned short word0, word1;
|
||||||
|
|
||||||
if (type & RELBR) {
|
if (type & RELBR)
|
||||||
|
{
|
||||||
addr[0] = valu >> WIDTH;
|
addr[0] = valu >> WIDTH;
|
||||||
addr[1] = valu;
|
addr[1] = valu;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
addr[0] = valu;
|
addr[0] = valu;
|
||||||
addr[1] = valu >> WIDTH;
|
addr[1] = valu >> WIDTH;
|
||||||
}
|
}
|
||||||
|
@ -249,19 +255,25 @@ static void write4(uint32_t valu, char* addr, int type)
|
||||||
{
|
{
|
||||||
unsigned short word0, word1;
|
unsigned short word0, word1;
|
||||||
|
|
||||||
if (type & RELWR) {
|
if (type & RELWR)
|
||||||
|
{
|
||||||
word0 = valu >> (2 * WIDTH);
|
word0 = valu >> (2 * WIDTH);
|
||||||
word1 = valu;
|
word1 = valu;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
word0 = valu;
|
word0 = valu;
|
||||||
word1 = valu >> (2 * WIDTH);
|
word1 = valu >> (2 * WIDTH);
|
||||||
}
|
}
|
||||||
if (type & RELBR) {
|
if (type & RELBR)
|
||||||
|
{
|
||||||
addr[0] = word0 >> WIDTH;
|
addr[0] = word0 >> WIDTH;
|
||||||
addr[1] = word0;
|
addr[1] = word0;
|
||||||
addr[2] = word1 >> WIDTH;
|
addr[2] = word1 >> WIDTH;
|
||||||
addr[3] = word1;
|
addr[3] = word1;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
addr[0] = word0;
|
addr[0] = word0;
|
||||||
addr[1] = word0 >> WIDTH;
|
addr[1] = word0 >> WIDTH;
|
||||||
addr[2] = word1;
|
addr[2] = word1;
|
||||||
|
@ -340,8 +352,7 @@ static void put_powerpc_valu(char* addr, uint32_t value, uint16_t type)
|
||||||
i |= value & 0x03fffffd;
|
i |= value & 0x03fffffd;
|
||||||
write4(i, addr, type);
|
write4(i, addr, type);
|
||||||
}
|
}
|
||||||
else if (((opcode1 & 0xfc1f0000) == 0x3c000000) &&
|
else if (((opcode1 & 0xfc1f0000) == 0x3c000000) && ((opcode2 & 0xfc000000) == 0x60000000))
|
||||||
((opcode2 & 0xfc000000) == 0x60000000))
|
|
||||||
{
|
{
|
||||||
/* addis / ori instruction pair */
|
/* addis / ori instruction pair */
|
||||||
uint16_t hi = value >> 16;
|
uint16_t hi = value >> 16;
|
||||||
|
@ -350,8 +361,7 @@ static void put_powerpc_valu(char* addr, uint32_t value, uint16_t type)
|
||||||
write4((opcode1 & 0xffff0000) | hi, addr + 0, type);
|
write4((opcode1 & 0xffff0000) | hi, addr + 0, type);
|
||||||
write4((opcode2 & 0xffff0000) | lo, addr + 4, type);
|
write4((opcode2 & 0xffff0000) | lo, addr + 4, type);
|
||||||
}
|
}
|
||||||
else if (((opcode1 & 0xfc1f0000) == 0x3c000000) &&
|
else if (((opcode1 & 0xfc1f0000) == 0x3c000000) && is_powerpc_memory_op(opcode2))
|
||||||
is_powerpc_memory_op(opcode2))
|
|
||||||
{
|
{
|
||||||
/* addis / memoryop instruction pair */
|
/* addis / memoryop instruction pair */
|
||||||
uint16_t hi = value >> 16;
|
uint16_t hi = value >> 16;
|
||||||
|
@ -367,7 +377,8 @@ static void put_powerpc_valu(char* addr, uint32_t value, uint16_t type)
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
fatal("Don't know how to write a PowerPC fixup to instructions 0x%08lx+0x%08lx",
|
fatal(
|
||||||
|
"Don't know how to write a PowerPC fixup to instructions 0x%08lx+0x%08lx",
|
||||||
(unsigned long)opcode1, (unsigned long)opcode2);
|
(unsigned long)opcode1, (unsigned long)opcode2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -435,7 +446,8 @@ static void put_mips_valu(char* addr, uint32_t value)
|
||||||
static putvalu(uint32_t valu, char* addr, uint16_t type)
|
static putvalu(uint32_t valu, char* addr, uint16_t type)
|
||||||
{
|
{
|
||||||
|
|
||||||
switch (type & RELSZ) {
|
switch (type & RELSZ)
|
||||||
|
{
|
||||||
case RELO1:
|
case RELO1:
|
||||||
addr[0] = valu;
|
addr[0] = valu;
|
||||||
break;
|
break;
|
||||||
|
@ -483,9 +495,7 @@ extern struct orig relorig[];
|
||||||
* Second case: we must update the value by the change
|
* Second case: we must update the value by the change
|
||||||
* in position of the section of local.
|
* in position of the section of local.
|
||||||
*/
|
*/
|
||||||
static unsigned
|
static unsigned addrelo(relo, names, valu_out) struct outrelo* relo;
|
||||||
addrelo(relo, names, valu_out)
|
|
||||||
struct outrelo *relo;
|
|
||||||
struct outname* names;
|
struct outname* names;
|
||||||
long* valu_out; /* Out variable. */
|
long* valu_out; /* Out variable. */
|
||||||
{
|
{
|
||||||
|
@ -493,13 +503,16 @@ addrelo(relo, names, valu_out)
|
||||||
register unsigned short index = NLocals;
|
register unsigned short index = NLocals;
|
||||||
register long valu = *valu_out;
|
register long valu = *valu_out;
|
||||||
|
|
||||||
if ((local->on_type & S_SCT)) {
|
if ((local->on_type & S_SCT))
|
||||||
|
{
|
||||||
register int sectindex = (local->on_type & S_TYP) - S_MIN;
|
register int sectindex = (local->on_type & S_TYP) - S_MIN;
|
||||||
|
|
||||||
valu += relorig[sectindex].org_size;
|
valu += relorig[sectindex].org_size;
|
||||||
valu += outsect[sectindex].os_base;
|
valu += outsect[sectindex].os_base;
|
||||||
index += NGlobals + sectindex;
|
index += NGlobals + sectindex;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
register struct outname* name;
|
register struct outname* name;
|
||||||
extern int hash();
|
extern int hash();
|
||||||
extern struct outname* searchname();
|
extern struct outname* searchname();
|
||||||
|
@ -509,16 +522,20 @@ addrelo(relo, names, valu_out)
|
||||||
name = searchname(local->on_mptr, hash(local->on_mptr));
|
name = searchname(local->on_mptr, hash(local->on_mptr));
|
||||||
if (name == (struct outname*)0)
|
if (name == (struct outname*)0)
|
||||||
fatal("name %s not found in pass 2", local->on_mptr);
|
fatal("name %s not found in pass 2", local->on_mptr);
|
||||||
if (ISCOMMON(name) || ISUNDEFINED(name)) {
|
if (ISCOMMON(name) || ISUNDEFINED(name))
|
||||||
|
{
|
||||||
debug("can't relocate from %s\n", local->on_mptr, 0, 0, 0);
|
debug("can't relocate from %s\n", local->on_mptr, 0, 0, 0);
|
||||||
index += indexof(name);
|
index += indexof(name);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
valu += name->on_valu;
|
valu += name->on_valu;
|
||||||
if ((name->on_type & S_TYP) == S_ABS) {
|
if ((name->on_type & S_TYP) == S_ABS)
|
||||||
|
{
|
||||||
index += NGlobals + outhead.oh_nsect;
|
index += NGlobals + outhead.oh_nsect;
|
||||||
}
|
}
|
||||||
else index += NGlobals +
|
else
|
||||||
(name->on_type & S_TYP) - S_MIN;
|
index += NGlobals + (name->on_type & S_TYP) - S_MIN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*valu_out = valu;
|
*valu_out = valu;
|
||||||
|
@ -530,8 +547,7 @@ addrelo(relo, names, valu_out)
|
||||||
* which the header is pointed to by `head'. Relocation is relative to the
|
* which the header is pointed to by `head'. Relocation is relative to the
|
||||||
* names in `names'; `relo' tells how to relocate.
|
* names in `names'; `relo' tells how to relocate.
|
||||||
*/
|
*/
|
||||||
relocate(head, emit, names, relo, off)
|
relocate(head, emit, names, relo, off) struct outhead* head;
|
||||||
struct outhead *head;
|
|
||||||
char* emit;
|
char* emit;
|
||||||
struct outname names[];
|
struct outname names[];
|
||||||
struct outrelo* relo;
|
struct outrelo* relo;
|
||||||
|
@ -553,10 +569,13 @@ relocate(head, emit, names, relo, off)
|
||||||
* - a section name
|
* - a section name
|
||||||
* - the first name outside! the name table (argh)
|
* - the first name outside! the name table (argh)
|
||||||
*/
|
*/
|
||||||
if (relo->or_nami < head->oh_nname) {
|
if (relo->or_nami < head->oh_nname)
|
||||||
|
{
|
||||||
/* First two cases. */
|
/* First two cases. */
|
||||||
relo->or_nami = addrelo(relo, names, &valu);
|
relo->or_nami = addrelo(relo, names, &valu);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Third case: it is absolute. The relocation of absolute
|
* Third case: it is absolute. The relocation of absolute
|
||||||
* names is always 0. We only need to change the index.
|
* names is always 0. We only need to change the index.
|
||||||
|
|
Loading…
Reference in a new issue