diff graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java @ 18176:c2270ad35f57

Better construction of data section and data patches.
author Roland Schatz <roland.schatz@oracle.com>
date Mon, 27 Oct 2014 14:07:49 +0100
parents 3c7e73362d6a
children 9619ba4daf4c
line wrap: on
line diff
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java	Mon Oct 27 13:39:12 2014 -0700
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java	Mon Oct 27 14:07:49 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,10 @@
 import java.util.*;
 
 import com.oracle.graal.api.code.*;
-import com.oracle.graal.api.code.CompilationResult.Data;
+import com.oracle.graal.api.code.CompilationResult.ConstantReference;
+import com.oracle.graal.api.code.CompilationResult.DataSectionReference;
+import com.oracle.graal.api.code.DataSection.Data;
+import com.oracle.graal.api.code.DataSection.DataBuilder;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.asm.*;
 import com.oracle.graal.compiler.common.*;
@@ -77,6 +80,8 @@
 
     private List<ExceptionInfo> exceptionInfoList;
 
+    private final IdentityHashMap<Constant, Data> dataCache;
+
     public CompilationResultBuilder(CodeCacheProvider codeCache, ForeignCallsProvider foreignCalls, FrameMap frameMap, Assembler asm, FrameContext frameContext, CompilationResult compilationResult) {
         this.target = codeCache.getTarget();
         this.codeCache = codeCache;
@@ -86,6 +91,9 @@
         this.compilationResult = compilationResult;
         this.frameContext = frameContext;
         assert frameContext != null;
+
+        // constants are already GVNed in the high level graph, so we can use an IdentityHashMap
+        this.dataCache = new IdentityHashMap<>();
     }
 
     public void setTotalFrameSize(int frameSize) {
@@ -154,27 +162,39 @@
     }
 
     public void recordInlineDataInCode(Constant data) {
-        recordInlineDataInCode(codeCache.createDataItem(data, 0));
-    }
-
-    public void recordInlineDataInCode(Data data) {
         assert data != null;
         int pos = asm.position();
         Debug.log("Inline data in code: pos = %d, data = %s", pos, data);
-        compilationResult.recordInlineData(pos, data);
+        if (data instanceof VMConstant) {
+            compilationResult.recordDataPatch(pos, new ConstantReference((VMConstant) data));
+        }
+    }
+
+    private AbstractAddress recordDataSectionReference(Data data) {
+        assert data != null;
+        DataSectionReference reference = compilationResult.getDataSection().insertData(data);
+        compilationResult.recordDataPatch(asm.position(), reference);
+        return asm.getPlaceholder();
     }
 
-    public AbstractAddress recordDataReferenceInCode(Constant data, int alignment) {
-        assert data != null;
-        return recordDataReferenceInCode(codeCache.createDataItem(data, alignment));
+    public AbstractAddress recordDataReferenceInCode(Constant constant, int alignment) {
+        assert constant != null;
+        Debug.log("Constant reference in code: pos = %d, data = %s", asm.position(), constant);
+        Data data = dataCache.get(constant);
+        if (data == null) {
+            data = codeCache.createDataItem(constant);
+            dataCache.put(constant, data);
+        }
+        data.updateAlignment(alignment);
+        return recordDataSectionReference(data);
     }
 
-    public AbstractAddress recordDataReferenceInCode(Data data) {
+    public AbstractAddress recordDataReferenceInCode(byte[] data, int alignment) {
         assert data != null;
-        int pos = asm.position();
-        Debug.log("Data reference in code: pos = %d, data = %s", pos, data);
-        compilationResult.recordDataReference(pos, data);
-        return asm.getPlaceholder();
+        if (Debug.isLogEnabled()) {
+            Debug.log("Data reference in code: pos = %d, data = %s", asm.position(), Arrays.toString(data));
+        }
+        return recordDataSectionReference(new Data(alignment, data.length, DataBuilder.raw(data)));
     }
 
     /**