forked from OSchip/llvm-project
51 lines
1.6 KiB
C++
51 lines
1.6 KiB
C++
//===- HexagonRelocationFunction.h ----------------------------------------===//
|
|
//
|
|
// The LLVM Linker
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef LLD_READER_WRITER_ELF_HEXAGON_RELOCATION_FUNCTIONS_H
|
|
#define LLD_READER_WRITER_ELF_HEXAGON_RELOCATION_FUNCTIONS_H
|
|
|
|
namespace lld {
|
|
namespace elf {
|
|
|
|
/// \brief HexagonInstruction which is used to store various values
|
|
typedef struct {
|
|
const char *insnSyntax;
|
|
uint32_t insnMask;
|
|
uint32_t insnCmpMask;
|
|
uint32_t insnBitMask;
|
|
bool isDuplex;
|
|
} Instruction;
|
|
|
|
#include "HexagonV4Encodings.h"
|
|
|
|
#define FINDV4BITMASK(INSN) \
|
|
findBitMask((uint32_t) * ((llvm::support::ulittle32_t *) INSN), \
|
|
insn_encodings_v4, \
|
|
sizeof(insn_encodings_v4) / sizeof(Instruction))
|
|
|
|
/// \brief finds the scatter Bits that need to be used to apply relocations
|
|
inline uint32_t
|
|
findBitMask(uint32_t insn, Instruction *encodings, int32_t numInsns) {
|
|
for (int32_t i = 0; i < numInsns ; i++) {
|
|
if (((insn & 0xc000) == 0) && !(encodings[i].isDuplex))
|
|
continue;
|
|
|
|
if (((insn & 0xc000) != 0) && (encodings[i].isDuplex))
|
|
continue;
|
|
|
|
if (((encodings[i].insnMask) & insn) == encodings[i].insnCmpMask)
|
|
return encodings[i].insnBitMask;
|
|
}
|
|
llvm_unreachable("found unknown instruction");
|
|
}
|
|
|
|
} // elf
|
|
} // lld
|
|
|
|
#endif // LLD_READER_WRITER_ELF_HEXAGON_RELOCATION_FUNCTIONS_H
|