forked from OSchip/llvm-project
46 lines
1.3 KiB
C++
46 lines
1.3 KiB
C++
//===- HexagonRelocationFunction.h ----------------------------------------===//
|
|
//
|
|
// The MCLinker Project
|
|
//
|
|
// 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"
|
|
|
|
|
|
/// \brief finds the scatter Bits that need to be used to apply relocations
|
|
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;
|
|
}
|
|
assert(0 && "found unknown instruction");
|
|
}
|
|
|
|
} // elf
|
|
} // lld
|
|
|
|
#endif // LLD_READER_WRITER_ELF_HEXAGON_RELOCATION_FUNCTIONS_H
|