mirror of
https://review.haiku-os.org/buildtools
synced 2025-01-18 20:38:39 +01:00
5873a060ca
* these are dependencies for gcc 4 Graphite engine build. * CLooG 0.18.0 includes ISL 0.11.1 which is the backend that the build script enables. * PPL is needed by GCC build even if it isn't the chosen backend.
219 lines
5.6 KiB
C
219 lines
5.6 KiB
C
#include <ctype.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "../include/cloog/cloog.h"
|
|
|
|
#ifdef OSL_SUPPORT
|
|
#include <osl/scop.h>
|
|
#endif
|
|
|
|
#define ALLOC(type) (type*)malloc(sizeof(type))
|
|
|
|
static char *next_line(FILE *input, char *line, unsigned len)
|
|
{
|
|
char *p;
|
|
|
|
do {
|
|
if (!(p = fgets(line, len, input)))
|
|
return NULL;
|
|
while (isspace(*p) && *p != '\n')
|
|
++p;
|
|
} while (*p == '#' || *p == '\n');
|
|
|
|
return p;
|
|
}
|
|
|
|
#ifdef OSL_SUPPORT
|
|
/**
|
|
* This function translates an OpenScop scop to a CLooG input.
|
|
* \param[in,out] state CLooG state.
|
|
* \param[in] scop Scop to translate.
|
|
* \return A CloogInput corresponding to the scop input.
|
|
*/
|
|
CloogInput *cloog_input_from_osl_scop(CloogState *state, osl_scop_p scop) {
|
|
CloogInput *input = NULL;
|
|
CloogDomain *context = NULL;
|
|
CloogUnionDomain *ud = NULL;
|
|
|
|
if (scop) {
|
|
/* Extract the context. */
|
|
context = cloog_domain_from_osl_relation(state, scop->context);
|
|
|
|
/* Extract the union of domains. */
|
|
ud = cloog_union_domain_from_osl_scop(state, scop);
|
|
|
|
/* Build and return the input. */
|
|
input = cloog_input_alloc(context, ud);
|
|
}
|
|
|
|
return input;
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* Read input from a .cloog file, putting most of the information
|
|
* in the returned CloogInput. The chosen language is put in
|
|
* options->language.
|
|
*/
|
|
CloogInput *cloog_input_read(FILE *file, CloogOptions *options)
|
|
{
|
|
char line[MAX_STRING];
|
|
char language;
|
|
CloogDomain *context;
|
|
CloogUnionDomain *ud;
|
|
int nb_par;
|
|
|
|
#ifdef OSL_SUPPORT
|
|
if (options->openscop) {
|
|
osl_scop_p scop = osl_scop_read(file);
|
|
CloogInput * input = cloog_input_from_osl_scop(options->state,
|
|
scop);
|
|
cloog_options_copy_from_osl_scop(scop, options);
|
|
return input;
|
|
}
|
|
#endif
|
|
|
|
/* First of all, we read the language to use. */
|
|
if (!next_line(file, line, sizeof(line)))
|
|
cloog_die("Input error.\n");
|
|
if (sscanf(line, "%c", &language) != 1)
|
|
cloog_die("Input error.\n");
|
|
|
|
if (language == 'f')
|
|
options->language = CLOOG_LANGUAGE_FORTRAN;
|
|
else
|
|
options->language = CLOOG_LANGUAGE_C;
|
|
|
|
/* We then read the context data. */
|
|
context = cloog_domain_read_context(options->state, file);
|
|
nb_par = cloog_domain_parameter_dimension(context);
|
|
|
|
ud = cloog_union_domain_read(file, nb_par, options);
|
|
|
|
return cloog_input_alloc(context, ud);
|
|
}
|
|
|
|
/**
|
|
* Create a CloogInput from a CloogDomain context and a CloogUnionDomain.
|
|
*/
|
|
CloogInput *cloog_input_alloc(CloogDomain *context, CloogUnionDomain *ud)
|
|
{
|
|
CloogInput *input;
|
|
|
|
input = ALLOC(CloogInput);
|
|
if (!input)
|
|
cloog_die("memory overflow.\n");
|
|
|
|
input->context = context;
|
|
input->ud = ud;
|
|
|
|
return input;
|
|
}
|
|
|
|
void cloog_input_free(CloogInput *input)
|
|
{
|
|
cloog_domain_free(input->context);
|
|
cloog_union_domain_free(input->ud);
|
|
free(input);
|
|
}
|
|
|
|
static void print_names(FILE *file, CloogUnionDomain *ud,
|
|
enum cloog_dim_type type, const char *name)
|
|
{
|
|
int i;
|
|
|
|
fprintf(file, "\n%d # %s name(s)\n", ud->name[type] ? 1 : 0, name);
|
|
if (!ud->name[type])
|
|
return;
|
|
|
|
for (i = 0; i < ud->n_name[type]; i++)
|
|
fprintf(file, "%s ", ud->name[type][i]);
|
|
|
|
fprintf(file, "\n");
|
|
}
|
|
|
|
/**
|
|
* Dump the .cloog description of a CloogInput and a CloogOptions data structure
|
|
* into a file. The generated .cloog file will contain the same information as
|
|
* the data structures. The file can be used to run the cloog program on the
|
|
* example.
|
|
*/
|
|
void cloog_input_dump_cloog(FILE *file, CloogInput *input, CloogOptions *opt)
|
|
{
|
|
int i, num_statements;
|
|
CloogUnionDomain *ud = input->ud;
|
|
CloogNamedDomainList *ndl = ud->domain;
|
|
|
|
fprintf(file,
|
|
"# CLooG -> CLooG\n"
|
|
"# This is an automatic dump of a CLooG input file from a "
|
|
"CloogInput data\n"
|
|
"# structure.\n\n");
|
|
|
|
/* Language. */
|
|
if (opt->language == CLOOG_LANGUAGE_FORTRAN) {
|
|
fprintf(file, "# Language: FORTRAN\n");
|
|
fprintf(file, "f\n\n");
|
|
} else {
|
|
fprintf(file, "# Language: C\n");
|
|
fprintf(file, "c\n\n");
|
|
}
|
|
|
|
/* Context. */
|
|
fprintf(file, "# Context:\n");
|
|
cloog_domain_print_constraints(file, input->context, 1);
|
|
|
|
print_names(file, ud, CLOOG_PARAM, "Parameter");
|
|
|
|
/* Statement number. */
|
|
i = 0;
|
|
while (ndl != NULL) {
|
|
i++;
|
|
ndl = ndl->next;
|
|
}
|
|
num_statements = i;
|
|
fprintf(file, "\n# Statement number:\n%d\n\n", num_statements);
|
|
|
|
/* Iteration domains. */
|
|
i = 1;
|
|
ndl = ud->domain;
|
|
while (ndl != NULL) {
|
|
fprintf(file, "# Iteration domain of statement %d (%s).\n", i,
|
|
ndl->name);
|
|
|
|
cloog_domain_print_constraints(file, ndl->domain, 1);
|
|
fprintf(file,"\n0 0 0 # For future options.\n\n");
|
|
|
|
i++;
|
|
ndl = ndl->next;
|
|
}
|
|
|
|
print_names(file, ud, CLOOG_ITER, "Iterator");
|
|
|
|
/* Exit, if no scattering is supplied. */
|
|
if (!ud->domain || !ud->domain->scattering) {
|
|
fprintf(file, "# No scattering functions.\n0\n\n");
|
|
return;
|
|
}
|
|
|
|
/* Scattering relations. */
|
|
fprintf(file,
|
|
"# --------------------- SCATTERING --------------------\n");
|
|
|
|
fprintf(file, "%d # Scattering functions\n", num_statements);
|
|
|
|
i = 1;
|
|
ndl = ud->domain;
|
|
while (ndl != NULL) {
|
|
fprintf(file, "\n# Scattering of statement %d (%s).\n", i,
|
|
ndl->name);
|
|
|
|
cloog_scattering_print_constraints(file, ndl->scattering);
|
|
|
|
i++;
|
|
ndl = ndl->next;
|
|
}
|
|
|
|
print_names(file, ud, CLOOG_SCAT, "Scattering dimension");
|
|
}
|