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

Unified Diff: src/IceTargetLoweringX8632.cpp

Issue 358013003: Subzero: Partial implementation of global initializers. (Closed) Base URL: https://gerrit.chromium.org/gerrit/p/native_client/pnacl-subzero.git@master
Patch Set: After rebasing from laster master Created 6 years, 6 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/IceTargetLoweringX8632.h ('k') | src/llvm2ice.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceTargetLoweringX8632.cpp
diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
index ef9bc22f525087d8ac85bd66b4824871ba58fbab..fec2d625f544eff323a05acacd436868da414501 100644
--- a/src/IceTargetLoweringX8632.cpp
+++ b/src/IceTargetLoweringX8632.cpp
@@ -1319,7 +1319,9 @@ void TargetX8632::lowerCall(const InstCall *Instr) {
break;
}
}
- Operand *CallTarget = legalize(Instr->getCallTarget());
+ // TODO(stichnot): LEAHACK: remove Legal_All (and use default) once
+ // a proper emitter is used.
+ Operand *CallTarget = legalize(Instr->getCallTarget(), Legal_All);
Inst *NewCall = InstX8632Call::create(Func, eax, CallTarget);
Context.insert(NewCall);
if (edx)
@@ -2445,11 +2447,19 @@ Operand *TargetX8632::legalize(Operand *From, LegalMask Allowed,
// need to go in uninitialized registers.
From = Ctx->getConstantZero(From->getType());
}
- bool NeedsReg =
- !(Allowed & Legal_Imm) ||
- // ConstantFloat and ConstantDouble are actually memory operands.
- (!(Allowed & Legal_Mem) &&
- (From->getType() == IceType_f32 || From->getType() == IceType_f64));
+ bool NeedsReg = false;
+ if (!(Allowed & Legal_Imm))
+ // Immediate specifically not allowed
+ NeedsReg = true;
+ // TODO(stichnot): LEAHACK: remove Legal_Reloc once a proper
+ // emitter is used.
+ if (!(Allowed & Legal_Reloc) && llvm::isa<ConstantRelocatable>(From))
+ // Relocatable specifically not allowed
+ NeedsReg = true;
+ if (!(Allowed & Legal_Mem) &&
+ (From->getType() == IceType_f32 || From->getType() == IceType_f64))
+ // On x86, FP constants are lowered to mem operands.
+ NeedsReg = true;
if (NeedsReg) {
Variable *Reg = makeReg(From->getType(), RegNum);
_mov(Reg, From);
@@ -2581,4 +2591,100 @@ template <> void ConstantDouble::emit(GlobalContext *Ctx) const {
Str << "qword ptr [L$" << IceType_f64 << "$" << getPoolEntryID() << "]";
}
+TargetGlobalInitX8632::TargetGlobalInitX8632(GlobalContext *Ctx)
+ : TargetGlobalInitLowering(Ctx) {}
+
+namespace {
+char hexdigit(unsigned X) { return X < 10 ? '0' + X : 'A' + X - 10; }
+}
+
+void TargetGlobalInitX8632::lower(const IceString &Name, SizeT Align,
+ bool IsInternal, bool IsConst,
+ bool IsZeroInitializer, SizeT Size,
+ const char *Data, bool DisableTranslation) {
+ if (Ctx->isVerbose()) {
+ // TODO: Consider moving the dump output into the driver to be
+ // reused for all targets.
+ Ostream &Str = Ctx->getStrDump();
+ Str << "@" << Name << " = " << (IsInternal ? "internal" : "external");
+ Str << (IsConst ? " constant" : " global");
+ Str << " [" << Size << " x i8] ";
+ if (IsZeroInitializer) {
+ Str << "zeroinitializer";
+ } else {
+ Str << "c\"";
+ // Code taken from PrintEscapedString() in AsmWriter.cpp. Keep
+ // the strings in the same format as the .ll file for practical
+ // diffing.
+ for (uint64_t i = 0; i < Size; ++i) {
+ unsigned char C = Data[i];
+ if (isprint(C) && C != '\\' && C != '"')
+ Str << C;
+ else
+ Str << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);
+ }
+ Str << "\"";
+ }
+ Str << ", align " << Align << "\n";
+ }
+
+ if (DisableTranslation)
+ return;
+
+ Ostream &Str = Ctx->getStrEmit();
+ // constant:
+ // .section .rodata,"a",@progbits
+ // .align ALIGN
+ // .byte ...
+ // .size NAME, SIZE
+
+ // non-constant:
+ // .data
+ // .align ALIGN
+ // .byte ...
+ // .size NAME, SIZE
+
+ // zeroinitializer (constant):
+ // (.section or .data as above)
+ // .align ALIGN
+ // .zero SIZE
+ // .size NAME, SIZE
+
+ // zeroinitializer (non-constant):
+ // (.section or .data as above)
+ // .comm NAME, SIZE, ALIGN
+ // .local NAME
+
+ IceString MangledName = Ctx->mangleName(Name);
+ // Start a new section.
+ if (IsConst) {
+ Str << "\t.section\t.rodata,\"a\",@progbits\n";
+ } else {
+ Str << "\t.type\t" << MangledName << ",@object\n";
+ Str << "\t.data\n";
+ }
+ if (IsZeroInitializer) {
+ if (IsConst) {
+ Str << "\t.align\t" << Align << "\n";
+ Str << MangledName << ":\n";
+ Str << "\t.zero\t" << Size << "\n";
+ Str << "\t.size\t" << MangledName << ", " << Size << "\n";
+ } else {
+ // TODO(stichnot): Put the appropriate non-constant
+ // zeroinitializers in a .bss section to reduce object size.
+ Str << "\t.comm\t" << MangledName << ", " << Size << ", " << Align
+ << "\n";
+ }
+ } else {
+ Str << "\t.align\t" << Align << "\n";
+ Str << MangledName << ":\n";
+ for (SizeT i = 0; i < Size; ++i) {
+ Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n";
+ }
+ Str << "\t.size\t" << MangledName << ", " << Size << "\n";
+ }
+ Str << "\t" << (IsInternal ? ".local" : ".global") << "\t" << MangledName
+ << "\n";
+}
+
} // end of namespace Ice
« no previous file with comments | « src/IceTargetLoweringX8632.h ('k') | src/llvm2ice.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698