package de.fuberlin.optimierung.commands; import de.fuberlin.optimierung.*; /* * Syntax: * <result> = getelementptr <pty>* <ptrval>{, <ty> <idx>}* * <result> = getelementptr inbounds <pty>* <ptrval>{, <ty> <idx>}* */ public class LLVM_GetElementPtrCommand extends LLVM_GenericCommand { boolean hasInbounds = false; public LLVM_GetElementPtrCommand(String cmdLine, LLVM_GenericCommand predecessor, LLVM_Block block){ super(predecessor, block, cmdLine); setOperation(LLVM_Operation.GETELEMENTPTR); StringBuilder cmd = new StringBuilder(cmdLine); parseEraseComment(cmd); String result = parseReadResult(cmd); parseEraseString(cmd, "getelementptr"); if (parseOptionalString(cmd, "inbounds")) hasInbounds = true; String pty = parseReadPointer(cmd); String ptyval = parseReadValue(cmd); target = new LLVM_Parameter(result, pty); operands.add(new LLVM_Parameter(ptyval, pty)); while (parseEraseString(cmd, ",")){ String ty = parseReadType(cmd); String idx = parseReadValue(cmd); operands.add(new LLVM_Parameter(idx, ty)); } if (LLVM_Optimization.DEBUG) System.out.println("Operation generiert: " + this.toString()); } public String toString(){ if (target == null || operands == null || operands.size() < 1) return null; String cmd_out = target.getName() + " = "; cmd_out += "getelementptr "; if (hasInbounds) cmd_out += "inbounds "; cmd_out += operands.get(0).getTypeString() + " "; cmd_out += operands.get(0).getName(); for (int i = 1; i < operands.size(); i++){ cmd_out += ", " + operands.get(i).getTypeString() + " "; cmd_out += operands.get(i).getName(); } cmd_out += " " + getComment(); return cmd_out; } }