blob: e82087dcc605477e6a3c00a0c32c795da1a77325 [file]
#include "mpact/sim/util/asm/resolver.h"
#include <cstdint>
#include <string>
#include "absl/container/flat_hash_map.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "elfio/elf_types.hpp"
#include "elfio/elfio_section.hpp"
namespace mpact::sim::util::assembler {
absl::StatusOr<uint64_t> ZeroResolver::Resolve(absl::string_view text) {
// Any symbol name should be added to the symbol table as an undefined
// symbol if it is not already there. When the symbol is defined, the
// symbol table will be updated. In the case of generating an executable
// ELF file, any unresolved symbols will result in an error. When generating
// an object file, any unresolved symbols will remain in the symbol table
// and must be handled by the linker.
add_symbol_fcn_(text);
// Return 0 for any symbol name.
return 0;
}
SymbolResolver::SymbolResolver(
int elf_file_class, ELFIO::section* symtab,
const absl::flat_hash_map<std::string, ELFIO::Elf_Word>& symbol_indices)
: elf_file_class_(elf_file_class),
symtab_(symtab),
symbol_indices_(symbol_indices) {}
absl::StatusOr<uint64_t> SymbolResolver::Resolve(absl::string_view text) {
auto iter = symbol_indices_.find(text);
if (iter == symbol_indices_.end()) {
return absl::InvalidArgumentError(
absl::StrCat("SymbolResolver: Symbol '", text, "' not found"));
}
auto index = iter->second;
if (elf_file_class_ == ELFCLASS64) {
auto* sym = reinterpret_cast<const ELFIO::Elf64_Sym*>(symtab_->get_data());
return sym[index].st_value;
} else if (elf_file_class_ == ELFCLASS32) {
auto* sym = reinterpret_cast<const ELFIO::Elf32_Sym*>(symtab_->get_data());
return sym[index].st_value;
}
return absl::InternalError("Unsupported ELF file class");
}
} // namespace mpact::sim::util::assembler