#include "TableGen.hpp"
#include "TableGen.h"
#include "Types.h"
#include <cstring>
using ctablegen::RecordMap;
using ctablegen::tableGenFromRecType;
RecordKeeper *ctablegen::TableGenParser::parse() {
auto recordKeeper = std::unique_ptr<RecordKeeper>(new RecordKeeper);
sourceMgr.setIncludeDirs(includeDirs);
for (const auto &file : files) {
std::string full_path;
if (!sourceMgr.AddIncludeFile(file, SMLoc(), full_path)) {
return nullptr;
}
}
bool result = TableGenParseFile(sourceMgr, *recordKeeper);
if (!result) {
return recordKeeper.release();
}
return nullptr;
}
void ctablegen::TableGenParser::addIncludeDirectory(const StringRef include) {
includeDirs.push_back(std::string(include));
}
bool ctablegen::TableGenParser::addSource(const char *source) {
ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
MemoryBuffer::getMemBuffer(source);
if (std::error_code EC = FileOrErr.getError()) {
return false;
}
sourceMgr.AddNewSourceBuffer(std::move(*FileOrErr), SMLoc());
return true;
}
void ctablegen::TableGenParser::addSourceFile(const StringRef file) {
files.push_back(std::string(file));
}
TableGenParserRef tableGenGet() {
return wrap(new ctablegen::TableGenParser());
}
void tableGenFree(TableGenParserRef tg_ref) { delete unwrap(tg_ref); }
void tableGenAddSourceFile(TableGenParserRef tg_ref, TableGenStringRef source) {
unwrap(tg_ref)->addSourceFile(StringRef(source.data, source.len));
}
TableGenBool tableGenAddSource(TableGenParserRef tg_ref, const char *source) {
return unwrap(tg_ref)->addSource(source);
}
void tableGenAddIncludeDirectory(TableGenParserRef tg_ref,
TableGenStringRef include) {
return unwrap(tg_ref)->addIncludeDirectory(
StringRef(include.data, include.len));
}
TableGenRecordKeeperRef tableGenParse(TableGenParserRef tg_ref) {
return wrap(unwrap(tg_ref)->parse());
}
TableGenRecTyKind tableGenListRecordGetType(TableGenRecordValRef rv_ref) {
if (!rv_ref)
return TableGenInvalidRecTyKind;
auto rv = unwrap(rv_ref);
if (rv->getType()->getRecTyKind() == RecTy::ListRecTyKind) {
auto list = rv->getType()->getListTy();
return tableGenFromRecType(list->getElementType());
}
return TableGenInvalidRecTyKind;
}
size_t tableGenListRecordNumElements(TableGenTypedInitRef rv_ref) {
auto list = dyn_cast<ListInit>(unwrap(rv_ref));
if (!list)
return 0;
return list->size();
}
TableGenTypedInitRef tableGenListRecordGet(TableGenTypedInitRef rv_ref,
size_t index) {
auto list = dyn_cast<ListInit>(unwrap(rv_ref));
if (!list)
return nullptr;
if (index >= list->size())
return nullptr;
auto elem = dyn_cast<TypedInit>(list->getElement(index));
if (!elem)
return nullptr;
return wrap(elem);
}
TableGenTypedInitRef tableGenDagRecordGet(TableGenTypedInitRef rv_ref,
size_t index) {
auto dag = dyn_cast<DagInit>(unwrap(rv_ref));
if (!dag)
return nullptr;
if (index >= dag->getNumArgs())
return nullptr;
auto arg = dyn_cast<TypedInit>(dag->getArg(index));
if (!arg)
return nullptr;
return wrap(arg);
}
size_t tableGenDagRecordNumArgs(TableGenTypedInitRef rv_ref) {
auto dag = dyn_cast<DagInit>(unwrap(rv_ref));
if (!dag)
return 0;
return dag->getNumArgs();
}
TableGenRecordRef tableGenDagRecordOperator(TableGenTypedInitRef rv_ref) {
auto dag = dyn_cast<DagInit>(unwrap(rv_ref));
if (!dag)
return 0;
return wrap(dag->getOperatorAsDef(SMLoc()));
}
TableGenStringRef tableGenDagRecordArgName(TableGenTypedInitRef rv_ref,
size_t index) {
auto dag = dyn_cast<DagInit>(unwrap(rv_ref));
if (!dag)
return TableGenStringRef{.data = nullptr, .len = 0};
if (index >= dag->getNumArgs())
return TableGenStringRef{.data = nullptr, .len = 0};
auto s = dag->getArgNameStr(index);
return TableGenStringRef{.data = s.data(), .len = s.size()};
}
void tableGenBitArrayFree(int8_t bit_array[]) { delete[] bit_array; }
void tableGenStringFree(const char *str) { delete str; }
void tableGenStringArrayFree(const char **str_array) { delete str_array; }