correction Call et CallVoid avec print et read + clean
This commit is contained in:
@@ -173,7 +173,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
ArrayList<ValLLVM> params = new ArrayList<>();
|
ArrayList<ValLLVM> params = new ArrayList<>();
|
||||||
|
|
||||||
String name = h.getGlobalDeclName();
|
String name = h.getGlobalDeclName();
|
||||||
VarLLVMImp varGlobal = new VarLLVMImp(new CharLLVMImp(true),name,true);
|
VarLLVMImp varGlobal = new VarLLVMImp(new PointerLLVMImp(new CharLLVMImp()),name,true);
|
||||||
|
|
||||||
params.add(varGlobal);
|
params.add(varGlobal);
|
||||||
String strGlobal = "";
|
String strGlobal = "";
|
||||||
@@ -183,7 +183,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
if(obj instanceof String){
|
if(obj instanceof String){
|
||||||
String str = (String)obj;
|
String str = (String)obj;
|
||||||
size+=str.length(); //on compte avant car \0A compte pour 1 en LLVM, mais 3 pour java
|
size+=str.length(); //on compte avant car \0A compte pour 1 en LLVM, mais 3 pour java
|
||||||
str = str.replace("\n", "\\0A");
|
str = str.replace("\\n", "\\0A");
|
||||||
strGlobal+=str;
|
strGlobal+=str;
|
||||||
}
|
}
|
||||||
else if(obj instanceof Expression){
|
else if(obj instanceof Expression){
|
||||||
@@ -198,7 +198,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
}
|
}
|
||||||
strGlobal+="\\00";
|
strGlobal+="\\00";
|
||||||
|
|
||||||
DeclarGlobalLLVMImp globalDecl = new DeclarGlobalLLVMImp(varGlobal,new CharLLVMImp(false),strGlobal,size); //TODO
|
DeclarGlobalLLVMImp globalDecl = new DeclarGlobalLLVMImp(varGlobal,new CharLLVMImp(),strGlobal,size); //TODO
|
||||||
h.addGlobalDecl(globalDecl);
|
h.addGlobalDecl(globalDecl);
|
||||||
|
|
||||||
l.add(new PrintLLVMImp(globalDecl,params));
|
l.add(new PrintLLVMImp(globalDecl,params));
|
||||||
@@ -211,7 +211,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
ArrayList<ValLLVM> params = new ArrayList<>();
|
ArrayList<ValLLVM> params = new ArrayList<>();
|
||||||
|
|
||||||
String name = h.getGlobalDeclName();
|
String name = h.getGlobalDeclName();
|
||||||
VarLLVMImp varGlobal = new VarLLVMImp(new CharLLVMImp(true),name,true);
|
VarLLVMImp varGlobal = new VarLLVMImp(new PointerLLVMImp(new CharLLVMImp()),name,true);
|
||||||
|
|
||||||
params.add(varGlobal);
|
params.add(varGlobal);
|
||||||
|
|
||||||
@@ -232,7 +232,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
}
|
}
|
||||||
strGlobal+="\\00";
|
strGlobal+="\\00";
|
||||||
|
|
||||||
DeclarGlobalLLVMImp globalDecl = new DeclarGlobalLLVMImp(varGlobal,new CharLLVMImp(false),strGlobal,size);//TODO
|
DeclarGlobalLLVMImp globalDecl = new DeclarGlobalLLVMImp(varGlobal,new CharLLVMImp(),strGlobal,size);//TODO
|
||||||
h.addGlobalDecl(globalDecl);
|
h.addGlobalDecl(globalDecl);
|
||||||
|
|
||||||
l.add(new ScanLLVMImp(globalDecl,params));
|
l.add(new ScanLLVMImp(globalDecl,params));
|
||||||
|
|||||||
@@ -76,7 +76,18 @@ TypeLLVMVisitor<String,String>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visitCallVoidLLVM(CallVoidLLVMImp instr, String h) {
|
public String visitCallVoidLLVM(CallVoidLLVMImp instr, String h) {
|
||||||
String str = INDENT+ "call " + instr.str() + instr.f().type().accept(this, h) + " @"+instr.f().name() + "(";
|
String str = INDENT+ "call " + instr.f().type().accept(this, h) + " " + instr.str() + " @"+instr.f().name() + "(";
|
||||||
|
for(int i = 0; i<instr.params().size(); i++){
|
||||||
|
str += instr.params().get(i).getType().accept(this, h) + " " + instr.params().get(i).accept(this,h);
|
||||||
|
if(i<instr.params().size()-1) str += ", ";
|
||||||
|
}
|
||||||
|
return str + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String visitCallLLVM(CallLLVMImp instr, String h) {
|
||||||
|
String str = "call " + instr.f().type().accept(this, h) + " " + instr.str() + " @" + instr.f().name() + "(";
|
||||||
|
|
||||||
for (int i = 0; i < instr.params().size(); i++) {
|
for (int i = 0; i < instr.params().size(); i++) {
|
||||||
str += instr.params().get(i).getType().accept(this, h) + " " + instr.params().get(i).accept(this, h);
|
str += instr.params().get(i).getType().accept(this, h) + " " + instr.params().get(i).accept(this, h);
|
||||||
if (i < instr.params().size() - 1) str += ", ";
|
if (i < instr.params().size() - 1) str += ", ";
|
||||||
@@ -130,28 +141,18 @@ TypeLLVMVisitor<String,String>
|
|||||||
return "load" + " " + e.getType().accept(this, h) + ", "+ e.getType().accept(this, h) + "* " + e.val().accept(this, h);
|
return "load" + " " + e.getType().accept(this, h) + ", "+ e.getType().accept(this, h) + "* " + e.val().accept(this, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String visitCallLLVM(CallLLVMImp instr, String h) {
|
|
||||||
String str = "call " + instr.f().type().accept(this, h) + " (" + instr.str() + ") @" + instr.f().name() + "(";
|
|
||||||
|
|
||||||
for (int i = 0; i < instr.params().size(); i++) {
|
|
||||||
str += instr.params().get(i).getType().accept(this, h) + " " + instr.params().get(i).accept(this, h);
|
|
||||||
if (i < instr.params().size() - 1) str += ", ";
|
|
||||||
}
|
|
||||||
return str + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visitPrintLLVM(PrintLLVMImp instr, String h) { //TODO
|
public String visitPrintLLVM(PrintLLVMImp instr, String h) { //TODO
|
||||||
DefineLLVMImp printLLVM = new DefineLLVMImp("printf", new IntLLVMImp(), new ArrayList<>(), new ArrayList<>());
|
DefineLLVMImp printLLVM = new DefineLLVMImp("printf", new IntLLVMImp(), new ArrayList<>(), new ArrayList<>());
|
||||||
CallLLVMImp callPrint = new CallLLVMImp(printLLVM, instr.l(),"i8*, ...");
|
CallVoidLLVMImp callPrint = new CallVoidLLVMImp(printLLVM, instr.l(),"(i8*, ...)");
|
||||||
return callPrint.accept(this, h);
|
return callPrint.accept(this, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visitScanLLVM(ScanLLVMImp instr, String h) { //TODO
|
public String visitScanLLVM(ScanLLVMImp instr, String h) { //TODO
|
||||||
DefineLLVMImp readLLVM = new DefineLLVMImp("scanf", new IntLLVMImp(), new ArrayList<>(), new ArrayList<>());
|
DefineLLVMImp readLLVM = new DefineLLVMImp("scanf", new IntLLVMImp(), new ArrayList<>(), new ArrayList<>());
|
||||||
CallLLVMImp callRead = new CallLLVMImp(readLLVM, instr.l(),"i8*, ...");
|
CallVoidLLVMImp callRead = new CallVoidLLVMImp(readLLVM, instr.l(),"(i8*, ...)");
|
||||||
return callRead.accept(this, h);
|
return callRead.accept(this, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,8 +212,7 @@ TypeLLVMVisitor<String,String>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visitCharLLVM(CharLLVMImp e, String h) {
|
public String visitCharLLVM(CharLLVMImp e, String h) {
|
||||||
if(e.isString()) return "i8*";
|
return "i8";
|
||||||
else return "i8";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ public class ProgramLLVM {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static record CharLLVMImp(Boolean isString) implements TypeLLVM{
|
public static record CharLLVMImp() implements TypeLLVM{
|
||||||
@Override
|
@Override
|
||||||
public <H, S> S accept(TypeLLVMVisitor<H, S> v, H h) {
|
public <H, S> S accept(TypeLLVMVisitor<H, S> v, H h) {
|
||||||
return v.visitCharLLVM(this, h);
|
return v.visitCharLLVM(this, h);
|
||||||
|
|||||||
Reference in New Issue
Block a user