Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(346)

Unified Diff: src/IceGlobalInits.cpp

Issue 624663002: Introduce model of global initializers in Subzero. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nits. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/IceGlobalInits.h ('k') | src/IceTargetLowering.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceGlobalInits.cpp
diff --git a/src/IceGlobalInits.cpp b/src/IceGlobalInits.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4d9dadb4c076de53fdf2f8d1b57ddd2701ed102e
--- /dev/null
+++ b/src/IceGlobalInits.cpp
@@ -0,0 +1,139 @@
+//===- subzero/src/IceGlobalInits.cpp - Global initializers ---------------===//
+//
+// The Subzero Code Generator
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the notion of global addresses and
+// initializers in Subzero.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Value.h"
+
+#include "IceDefs.h"
+#include "IceGlobalInits.h"
+#include "IceTypes.h"
+
+namespace {
+char hexdigit(unsigned X) { return X < 10 ? '0' + X : 'A' + X - 10; }
+}
+
+namespace Ice {
+
+GlobalAddress::~GlobalAddress() { llvm::DeleteContainerPointers(Initializers); }
+
+void GlobalAddress::dumpType(Ostream &Stream) const {
+ if (Initializers.size() == 1) {
+ Initializers.front()->dumpType(Stream);
+ } else {
+ Stream << "<{ ";
+ bool IsFirst = true;
+ for (Initializer *Init : Initializers) {
+ if (IsFirst) {
+ IsFirst = false;
+ } else {
+ Stream << ", ";
+ }
+ Init->dumpType(Stream);
+ }
+ Stream << " }>";
+ }
+}
+
+void GlobalAddress::dump(Ostream &Stream) const {
+ Stream << "@" << getName() << " = internal "
+ << (IsConstant ? "constant" : "global") << " ";
+
+ // Add initializer.
+ if (Initializers.size() == 1) {
+ Initializers.front()->dump(Stream);
+ } else {
+ dumpType(Stream);
+ Stream << " <{ ";
+ bool IsFirst = true;
+ for (Initializer *Init : Initializers) {
+ if (IsFirst) {
+ IsFirst = false;
+ } else {
+ Stream << ", ";
+ }
+ Init->dump(Stream);
+ }
+ Stream << " }>";
+ }
+
+ // Add alignment.
+ if (Alignment > 0)
+ Stream << ", align " << Alignment;
+ Stream << "\n";
+}
+
+void GlobalAddress::Initializer::dumpType(Ostream &Stream) const {
+ Stream << "[" << getNumBytes() << " x " << Ice::IceType_i8 << "]";
+}
+
+void GlobalAddress::DataInitializer::dump(Ostream &Stream) const {
+ dumpType(Stream);
+ Stream << " c\"";
+ // Code taken from PrintEscapedString() in AsmWriter.cpp. Keep
+ // the strings in the same format as the .ll file for practical
+ // diffing.
+ for (uint8_t C : Contents) {
+ if (isprint(C) && C != '\\' && C != '"')
+ Stream << C;
+ else
+ Stream << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);
+ }
+ Stream << "\"";
+}
+
+void GlobalAddress::ZeroInitializer::dump(Ostream &Stream) const {
+ dumpType(Stream);
+ Stream << " zeroinitializer";
+}
+
+IceString GlobalAddress::RelocInitializer::getName() const {
+ switch (Address.getKind()) {
+ case FunctionRelocation:
+ return Address.getFunction()->getName();
+ case GlobalAddressRelocation:
+ return Address.getGlobalAddr()->getName();
+ default:
+ llvm::report_fatal_error("Malformed relocation address!");
+ }
+}
+
+void GlobalAddress::RelocInitializer::dumpType(Ostream &Stream) const {
+ Stream << Ice::IceType_i32;
+}
+
+void GlobalAddress::RelocInitializer::dump(Ostream &Stream) const {
+ if (Offset != 0) {
+ dumpType(Stream);
+ Stream << " add (";
+ }
+ dumpType(Stream);
+ Stream << " ptrtoint (";
+ if (Address.getKind() == FunctionRelocation) {
+ Stream << *Address.getFunction()->getType() << " @"
+ << Address.getFunction()->getName();
+ } else {
+ Address.getGlobalAddr()->dumpType(Stream);
+ Stream << "* @" << Address.getGlobalAddr()->getName();
+ }
+ Stream << " to ";
+ dumpType(Stream);
+ Stream << ")";
+ if (Offset != 0) {
+ Stream << ", ";
+ dumpType(Stream);
+ Stream << " " << Offset << ")";
+ }
+}
+}
« no previous file with comments | « src/IceGlobalInits.h ('k') | src/IceTargetLowering.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698