/*
* Copyright (C) 2012 RoboVM AB
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/gpl-2.0.html>.
*/
package org.robovm.compiler.llvm;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.net.URL;
import java.util.Collection;
import org.apache.commons.io.IOUtils;
/**
*
* @version $Id$
*/
public class Module {
private final Collection<URL> includes;
private final Collection<Global> globals;
private final Collection<Alias> aliases;
private final Collection<Function> functions;
private final Collection<FunctionDeclaration> functionDeclarations;
private final Collection<UserType> types;
private final Collection<String> asm;
private final Collection<NamedMetadata> namedMetadata;
private final Collection<UnnamedMetadata> unnamedMetadata;
public Module(Collection<URL> includes, Collection<UserType> types,
Collection<Global> globals, Collection<Alias> aliases,
Collection<FunctionDeclaration> functionDeclarations, Collection<String> asm,
Collection<Function> functions, Collection<NamedMetadata> namedMetadata,
Collection<UnnamedMetadata> unnamedMetadata) {
this.includes = includes;
this.types = types;
this.globals = globals;
this.aliases = aliases;
this.functionDeclarations = functionDeclarations;
this.asm = asm;
this.functions = functions;
this.namedMetadata = namedMetadata;
this.unnamedMetadata = unnamedMetadata;
}
public void write(Writer writer) throws IOException {
for (URL g : includes) {
InputStream in = null;
try {
in = g.openStream();
IOUtils.copy(in, writer, "UTF-8");
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
IOUtils.closeQuietly(in);
}
writer.write("\n");
}
writer.write("\n");
for (String s : asm) {
writer.write("module asm \"");
writer.write(s);
writer.write("\"\n");
}
writer.write("\n");
for (UserType type : types) {
writer.write(type.getAlias());
writer.write(" = type ");
writer.write(type.getDefinition());
writer.write("\n");
}
writer.write("\n");
for (FunctionDeclaration fd : functionDeclarations) {
writer.write(fd.toString());
writer.write("\n");
}
writer.write("\n");
for (Global g : globals) {
writer.write(g.getDefinition());
writer.write("\n");
}
writer.write("\n");
for (Alias a : aliases) {
writer.write(a.getDefinition());
writer.write("\n");
}
writer.write("\n");
for (Function f : functions) {
writer.write(f.toString());
writer.write("\n");
}
writer.write("\n");
for (NamedMetadata md : namedMetadata) {
writer.write(md.toString());
writer.write("\n");
}
writer.write("\n");
for (UnnamedMetadata md : unnamedMetadata) {
writer.write(md.getDefinition());
writer.write("\n");
}
}
@Override
public String toString() {
StringWriter sw = new StringWriter();
try {
write(sw);
} catch (IOException e) {
throw new RuntimeException(e);
}
return sw.toString();
}
}