1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-02-17 10:30:43 +00:00

Moved kickasm data to data chunk.

This commit is contained in:
jespergravgaard 2019-09-13 20:05:31 +02:00
parent d0a9d81abf
commit 00d6cad179
2 changed files with 60 additions and 24 deletions

View File

@ -84,7 +84,7 @@ public class AsmDataChunk {
}
}
/** A string data elements. */
/** A string data element. */
public static class AsmDataStringElement implements AsmDataElement {
/** The string value. */
String value;
@ -105,6 +105,35 @@ public class AsmDataChunk {
}
}
/** A kickasm data element. */
public static class AsmDataKickAsmElement implements AsmDataElement {
/** The size in bytes. */
int byteSize;
/** The kickasm code initializing the value. */
String kickAsmCode;
/** The string encoding used in the string value */
Set<ConstantString.Encoding> encoding;
public AsmDataKickAsmElement(int byteSize, String kickAsmCode, Set<ConstantString.Encoding> encoding) {
this.byteSize = byteSize;
this.kickAsmCode = kickAsmCode;
this.encoding = encoding;
}
public int getByteSize() {
return byteSize;
}
public String getKickAsmCode() {
return kickAsmCode;
}
public Set<ConstantString.Encoding> getEncoding() {
return encoding;
}
}
/** A sequence of data elements. */
private List<AsmDataElement> elements;
@ -124,6 +153,11 @@ public class AsmDataChunk {
elements.add(new AsmDataStringElement(string, encoding));
}
public void addDataKickAsm(int byteSize, String kickAsmCode, Set<ConstantString.Encoding> encoding) {
elements.add(new AsmDataKickAsmElement(byteSize, kickAsmCode, encoding));
}
public List<AsmDataElement> getElements() {
return elements;
}
@ -139,24 +173,25 @@ public class AsmDataChunk {
AsmDataNumeric.Type currentNumericType = null;
List<String> currentNumericElements = null;
for(AsmDataChunk.AsmDataElement element : this.getElements()) {
if(element instanceof AsmDataFilledElement) {
if(currentNumericElements!=null && currentNumericElements.size() > 0) {
if(element instanceof AsmDataFilledElement || element instanceof AsmDataStringElement || element instanceof AsmDataKickAsmElement) {
if(currentNumericElements != null && currentNumericElements.size() > 0) {
asm.addDataNumeric(label, currentNumericType, currentNumericElements);
label = null; // Only output label once
currentNumericElements = null;
currentNumericType = null;
}
}
if(element instanceof AsmDataFilledElement) {
AsmDataFilledElement filledElement = (AsmDataFilledElement) element;
asm.ensureEncoding(filledElement.getEncoding());
asm.addDataFilled(label, filledElement.getType(), filledElement.getTotalSizeBytesAsm(), filledElement.getNumElements(), filledElement.getFillValue());
label = null; // Only output label once
} else if(element instanceof AsmDataKickAsmElement) {
AsmDataKickAsmElement kickAsmElement = (AsmDataKickAsmElement) element;
asm.ensureEncoding(kickAsmElement.getEncoding());
asm.addDataKickAsm(label, kickAsmElement.getByteSize(), kickAsmElement.getKickAsmCode());
label = null; // Only output label once
} else if(element instanceof AsmDataStringElement) {
if(currentNumericElements!=null && currentNumericElements.size() > 0) {
asm.addDataNumeric(label, currentNumericType, currentNumericElements);
label = null; // Only output label once
currentNumericElements = null;
currentNumericType = null;
}
AsmDataStringElement stringElement = (AsmDataStringElement) element;
asm.ensureEncoding(stringElement.getEncoding());
asm.addDataString(label, stringElement.getValue());

View File

@ -460,21 +460,9 @@ public class Pass4CodeGeneration {
addChunkData(asmDataChunk, constantValue, constantVar.getType(), scopeRef);
asmDataChunk.addToAsm(asmName, asm);
} else if(constantValue instanceof ConstantArrayKickAsm) {
ConstantArrayKickAsm kickAsm = (ConstantArrayKickAsm) constantValue;
SymbolType type = constantVar.getType();
// default - larger then 256
int bytes = 1023;
if(type instanceof SymbolTypeArray) {
SymbolType elementType = ((SymbolTypeArray) type).getElementType();
RValue size = ((SymbolTypeArray) type).getSize();
if(size instanceof ConstantValue) {
ConstantLiteral sizeLiteral = ((ConstantValue) size).calculateLiteral(getScope());
if(sizeLiteral instanceof ConstantInteger) {
bytes = (int) (((ConstantInteger) sizeLiteral).getInteger() * elementType.getSizeBytes());
}
}
}
asm.addDataKickAsm(AsmFormat.asmFix(asmName), bytes, kickAsm.getKickAsmCode());
AsmDataChunk asmDataChunk = new AsmDataChunk();
addChunkData(asmDataChunk, constantValue, constantVar.getType(), scopeRef);
asmDataChunk.addToAsm(asmName, asm);
} else {
try {
ConstantLiteral literal = constantValue.calculateLiteral(getScope());
@ -584,6 +572,19 @@ public class Pass4CodeGeneration {
int totalSizeBytes = elementSizeBytes*dataNumElements;
dataChunk.addDataFilled(AsmDataNumeric.Type.BYTE, totalSizeBytesAsm, totalSizeBytes, "0", null);
}
} else if(value instanceof ConstantArrayKickAsm) {
ConstantArrayKickAsm kickAsm = (ConstantArrayKickAsm) value;
// default - larger then 256
int bytes = 1023;
RValue size = constTypeArray.getSize();
if(size instanceof ConstantValue) {
ConstantLiteral sizeLiteral = ((ConstantValue) size).calculateLiteral(getScope());
if(sizeLiteral instanceof ConstantInteger) {
bytes = (int) (((ConstantInteger) sizeLiteral).getInteger() * elementType.getSizeBytes());
}
}
dataChunk.addDataKickAsm(bytes, kickAsm.getKickAsmCode(), getEncoding(value));
dataNumElements = bytes;
} else if(dataType.equals(SymbolType.STRING)) {
try {
ConstantLiteral literal = value.calculateLiteral(getScope());