tblgen 0.10.0

Safe Rust bindings for TableGen.
// Original work Copyright 2016 Alexander Stocko <as@coder.gg>.
// Modified work Copyright 2023 Daan Vanoverloop
// See the COPYRIGHT file at the top-level directory of this distribution.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#ifndef _CTABLEGEN_TABLEGEN_H_
#define _CTABLEGEN_TABLEGEN_H_

#ifdef __cplusplus
#include <cstddef>
#include <cstdint>
#else
#include <stddef.h>
#include <stdint.h>
#endif

#include "Types.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
  TABLEGEN_DK_ERROR,
  TABLEGEN_DK_WARNING,
  TABLEGEN_DK_REMARK,
  TABLEGEN_DK_NOTE,
} TableGenDiagKind;

typedef enum {
  TableGenBitRecTyKind,
  TableGenBitsRecTyKind,
  TableGenCodeRecTyKind,
  TableGenIntRecTyKind,
  TableGenStringRecTyKind,
  TableGenListRecTyKind,
  TableGenDagRecTyKind,
  TableGenRecordRecTyKind,
  TableGenInvalidRecTyKind
} TableGenRecTyKind;

typedef struct TableGenStringRef {
  const char *data;
  size_t len;
} TableGenStringRef;

typedef void (*TableGenStringCallback)(TableGenStringRef, void *);

TableGenParserRef tableGenGet();
void tableGenFree(TableGenParserRef tg_ref);
TableGenBool tableGenAddSource(TableGenParserRef tg_ref, const char *source);
void tableGenAddSourceFile(TableGenParserRef tg_ref, TableGenStringRef source);
void tableGenAddIncludeDirectory(TableGenParserRef tg_ref,
                                 TableGenStringRef include);

/// NOTE: TableGen currently relies on global state within a given parser
///       invocation, so this function is not thread-safe.
TableGenRecordKeeperRef tableGenParse(TableGenParserRef tg_ref);

// LLVM RecordKeeper
void tableGenRecordKeeperFree(TableGenRecordKeeperRef rk_ref);
TableGenRecordMapRef
tableGenRecordKeeperGetClasses(TableGenRecordKeeperRef rk_ref);
TableGenRecordMapRef
tableGenRecordKeeperGetDefs(TableGenRecordKeeperRef rk_ref);
TableGenRecordRef tableGenRecordKeeperGetClass(TableGenRecordKeeperRef rk_ref,
                                               TableGenStringRef name);
TableGenRecordRef tableGenRecordKeeperGetDef(TableGenRecordKeeperRef rk_ref,
                                             TableGenStringRef name);
TableGenRecordVectorRef
tableGenRecordKeeperGetAllDerivedDefinitions(TableGenRecordKeeperRef rk_ref,
                                             TableGenStringRef className);
TableGenRecordVectorRef tableGenRecordKeeperGetAllDerivedDefinitionsIfDefined(
    TableGenRecordKeeperRef rk_ref, TableGenStringRef className);

TableGenRecordRef tableGenRecordVectorGet(TableGenRecordVectorRef vec_ref,
                                          size_t index);
size_t tableGenRecordVectorSize(TableGenRecordVectorRef vec_ref);
void tableGenRecordVectorFree(TableGenRecordVectorRef vec_ref);

TableGenRecordKeeperIteratorRef
tableGenRecordKeeperGetFirstClass(TableGenRecordKeeperRef rk_ref);

TableGenRecordKeeperIteratorRef
tableGenRecordKeeperGetFirstDef(TableGenRecordKeeperRef rk_ref);

void tableGenRecordKeeperGetNextClass(TableGenRecordKeeperIteratorRef *item);
void tableGenRecordKeeperGetNextDef(TableGenRecordKeeperIteratorRef *item);

TableGenStringRef
tableGenRecordKeeperItemGetName(TableGenRecordKeeperIteratorRef item);
TableGenRecordRef
tableGenRecordKeeperItemGetRecord(TableGenRecordKeeperIteratorRef item);
void tableGenRecordKeeperIteratorFree(TableGenRecordKeeperIteratorRef item);
TableGenRecordKeeperIteratorRef
tableGenRecordKeeperIteratorClone(TableGenRecordKeeperIteratorRef item);

// LLVM Record
TableGenRecordKeeperRef tableGenRecordGetRecords(TableGenRecordRef record_ref);
TableGenStringRef tableGenRecordGetName(TableGenRecordRef record_ref);
TableGenRecordValRef tableGenRecordGetValue(TableGenRecordRef record_ref,
                                            TableGenStringRef name);
TableGenRecTyKind tableGenRecordGetFieldType(TableGenRecordRef record_ref,
                                             TableGenStringRef name);
TableGenBool tableGenRecordIsAnonymous(TableGenRecordRef record_ref);
TableGenBool tableGenRecordIsSubclassOf(TableGenRecordRef record_ref,
                                        TableGenStringRef name);
void tableGenRecordPrint(TableGenRecordRef record_ref,
                         TableGenStringCallback callback, void *userData);
void tableGenRecordDump(TableGenRecordRef record_ref);
TableGenSourceLocationRef tableGenRecordGetLoc(TableGenRecordRef record_ref);
size_t tableGenRecordGetNumTemplateArgs(TableGenRecordRef record_ref);
TableGenStringRef tableGenRecordGetTemplateArgName(TableGenRecordRef record_ref,
                                                   size_t index);
size_t tableGenRecordGetNumSuperClasses(TableGenRecordRef record_ref);
TableGenRecordRef tableGenRecordGetSuperClass(TableGenRecordRef record_ref,
                                              size_t index);

// LLVM RecordVal
TableGenStringRef tableGenRecordValGetName(TableGenRecordValRef rv_ref);
TableGenTypedInitRef tableGenRecordValGetNameInit(TableGenRecordValRef rv_ref);
TableGenRecTyKind tableGenRecordValGetType(TableGenRecordValRef rv_ref);
TableGenTypedInitRef tableGenRecordValGetValue(TableGenRecordValRef rv_ref);
void tableGenRecordValTest(TableGenRecordValRef rv_ref);
TableGenRecordValRef tableGenRecordGetFirstValue(TableGenRecordRef record_ref);
TableGenRecordValRef tableGenRecordValNext(TableGenRecordRef record,
                                           TableGenRecordValRef current);
void tableGenRecordValPrint(TableGenRecordValRef rv_ref,
                            TableGenStringCallback callback, void *userData);
void tableGenRecordValDump(TableGenRecordValRef rv_ref);
TableGenSourceLocationRef tableGenRecordValGetLoc(TableGenRecordValRef rv_ref);

char *tableGenRecordValGetValAsNewString(TableGenRecordValRef rv_ref);
TableGenBool tableGenRecordValGetValAsBit(TableGenRecordValRef rv_ref,
                                          int8_t *bit);
TableGenBool tableGenRecordValGetValAsInt(TableGenRecordValRef rv_ref,
                                          int64_t *integer);
TableGenRecordRef
tableGenRecordValGetValAsDefRecord(TableGenRecordValRef rv_ref);

// LLVM ListType
TableGenRecTyKind tableGenListRecordGetType(TableGenRecordValRef rv_ref);
TableGenTypedInitRef tableGenListRecordGet(TableGenTypedInitRef rv_ref,
                                           size_t index);
size_t tableGenListRecordNumElements(TableGenTypedInitRef rv_ref);
TableGenRecTyKind tableGenListInitGetElementType(TableGenTypedInitRef ti);

// LLVM DagType
TableGenRecordRef tableGenDagRecordOperator(TableGenTypedInitRef rv_ref);
TableGenTypedInitRef tableGenDagRecordGet(TableGenTypedInitRef rv_ref,
                                          size_t index);
TableGenStringRef tableGenDagRecordArgName(TableGenTypedInitRef rv_ref,
                                           size_t index);
size_t tableGenDagRecordNumArgs(TableGenTypedInitRef rv_ref);

// Utility
TableGenRecTyKind tableGenInitRecType(TableGenTypedInitRef ti);
TableGenBool tableGenBitInitGetValue(TableGenTypedInitRef ti, int8_t *bit);
TableGenBool tableGenBitsInitGetNumBits(TableGenTypedInitRef ti, size_t *len);
TableGenTypedInitRef tableGenBitsInitGetBitInit(TableGenTypedInitRef ti,
                                                size_t index);
uint64_t tableGenBitsInitConvertKnownBitsToInt(TableGenTypedInitRef ti);
TableGenBool tableGenIntInitGetValue(TableGenTypedInitRef ti, int64_t *integer);
TableGenStringRef tableGenStringInitGetValue(TableGenTypedInitRef ti);
char *tableGenStringInitGetValueNewString(TableGenTypedInitRef ti);
TableGenRecordRef tableGenDefInitGetValue(TableGenTypedInitRef ti);
void tableGenInitPrint(TableGenTypedInitRef ti, TableGenStringCallback callback,
                       void *userData);
void tableGenInitDump(TableGenTypedInitRef ti);
TableGenBool tableGenPrintError(TableGenParserRef ref,
                                TableGenSourceLocationRef loc_ref,
                                TableGenDiagKind dk, TableGenStringRef message,
                                TableGenStringCallback callback,
                                void *userData);
TableGenSourceLocationRef tableGenSourceLocationNull();
TableGenSourceLocationRef
tableGenSourceLocationClone(TableGenSourceLocationRef loc_ref);

// VarBitInit support (variable bit references in BitsInit fields)
TableGenBool tableGenBitInitIsVarBit(TableGenTypedInitRef ti);
TableGenStringRef tableGenVarBitInitGetVarName(TableGenTypedInitRef ti);
size_t tableGenVarBitInitGetBitNum(TableGenTypedInitRef ti);

// Memory
void tableGenSourceLocationFree(TableGenSourceLocationRef loc_ref);
void tableGenStringFree(const char *str);
void tableGenStringArrayFree(const char **str_array);

// Record typed value accessors
TableGenBool tableGenRecordGetValueAsInt(TableGenRecordRef record_ref,
                                         TableGenStringRef name, int64_t *out);
TableGenStringRef tableGenRecordGetValueAsString(TableGenRecordRef record_ref,
                                                 TableGenStringRef name);
TableGenBool tableGenRecordGetValueAsBit(TableGenRecordRef record_ref,
                                         TableGenStringRef name, int8_t *out);
TableGenRecordRef tableGenRecordGetValueAsDef(TableGenRecordRef record_ref,
                                              TableGenStringRef name);
TableGenTypedInitRef tableGenRecordGetValueAsDag(TableGenRecordRef record_ref,
                                                 TableGenStringRef name);
TableGenTypedInitRef
tableGenRecordGetValueAsBitsInit(TableGenRecordRef record_ref,
                                 TableGenStringRef name);
TableGenTypedInitRef
tableGenRecordGetValueAsListInit(TableGenRecordRef record_ref,
                                 TableGenStringRef name);
TableGenRecordVectorRef
tableGenRecordGetValueAsListOfDefs(TableGenRecordRef record_ref,
                                   TableGenStringRef name);
TableGenBool tableGenRecordGetValueAsListOfInts(TableGenRecordRef record_ref,
                                                TableGenStringRef name,
                                                int64_t **out, size_t *out_len);
TableGenBool tableGenRecordGetValueAsListOfStrings(TableGenRecordRef record_ref,
                                                   TableGenStringRef name,
                                                   TableGenStringRef **out,
                                                   size_t *out_len);
TableGenBool
tableGenRecordGetValueAsOptionalString(TableGenRecordRef record_ref,
                                       TableGenStringRef name,
                                       TableGenStringRef *out);
TableGenRecordRef
tableGenRecordGetValueAsOptionalDef(TableGenRecordRef record_ref,
                                    TableGenStringRef name);
TableGenBool tableGenRecordIsValueUnset(TableGenRecordRef record_ref,
                                        TableGenStringRef name);
void tableGenIntArrayFree(int64_t *arr);
void tableGenStringRefArrayFree(TableGenStringRef *arr);

// Record identity/metadata
TableGenBool tableGenRecordIsClass(TableGenRecordRef record_ref);
TableGenTypedInitRef tableGenRecordGetDefInit(TableGenRecordRef record_ref);
unsigned tableGenRecordGetID(TableGenRecordRef record_ref);
TableGenTypedInitRef tableGenRecordGetNameInit(TableGenRecordRef record_ref);
TableGenBool tableGenRecordHasDirectSuperClass(TableGenRecordRef record_ref,
                                               TableGenRecordRef super_ref);

// RecTy detail accessors
size_t tableGenRecordValGetBitsWidth(TableGenRecordValRef rv_ref);
TableGenRecTyKind
tableGenRecordValGetListElementType(TableGenRecordValRef rv_ref);
size_t tableGenRecordRecTyGetNumClasses(TableGenRecordRef record_ref);
TableGenRecordRef tableGenRecordRecTyGetClass(TableGenRecordRef record_ref,
                                              size_t index);
TableGenBool tableGenRecordRecTyIsSubClassOf(TableGenRecordRef record_ref,
                                             TableGenRecordRef class_ref);

// RecordVal accessors
TableGenBool tableGenRecordValIsTemplateArg(TableGenRecordValRef rv_ref);
TableGenBool tableGenRecordValIsNonconcreteOK(TableGenRecordValRef rv_ref);

// DagInit accessors
size_t tableGenDagRecordGetArgNo(TableGenTypedInitRef dag_ref,
                                 TableGenStringRef name);

// RecordKeeper accessors
TableGenStringRef
tableGenRecordKeeperGetInputFilename(TableGenRecordKeeperRef rk_ref);
TableGenTypedInitRef
tableGenRecordKeeperGetGlobal(TableGenRecordKeeperRef rk_ref,
                              TableGenStringRef name);

#ifdef __cplusplus
}
#endif
#endif