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

Unified Diff: src/llvm2ice.cpp

Issue 678533005: Subzero: Add basic ELFObjectWriter (text section, symtab, strtab, headers) (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: stuff Created 6 years, 1 month 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
Index: src/llvm2ice.cpp
diff --git a/src/llvm2ice.cpp b/src/llvm2ice.cpp
index 774a8e6a88dd8ebfd443c8ebcf75b6cc91ac5cc9..1c524ebc5085e2cd920b4ac0cf82017e6def145d 100644
--- a/src/llvm2ice.cpp
+++ b/src/llvm2ice.cpp
@@ -173,6 +173,11 @@ static cl::opt<bool>
static cl::alias UseIas("ias", cl::desc("Alias for -integrated-as"),
cl::NotHidden, cl::aliasopt(UseIntegratedAssembler));
+static cl::opt<bool>
+ UseELFWriter("elf-writer",
+ cl::desc("Use ELF writer with the integrated assembler"),
+ cl::init(false));
+
static cl::opt<bool> AlwaysExitSuccess(
"exit-success", cl::desc("Exit with success status, even if errors found"),
cl::init(false));
@@ -242,18 +247,6 @@ int main(int argc, char **argv) {
VMask |= VerboseList[i];
}
- std::ofstream Ofs;
- if (OutputFilename != "-") {
- Ofs.open(OutputFilename.c_str(), std::ofstream::out);
- }
- raw_os_ostream *Os =
- new raw_os_ostream(OutputFilename == "-" ? std::cout : Ofs);
- Os->SetUnbuffered();
-
- ValidateAndGenerateBuildAttributes(GenerateBuildAtts ? Os : nullptr);
- if (GenerateBuildAtts)
- return GetReturnValue(0);
-
std::ofstream Lfs;
if (LogFilename != "-") {
Lfs.open(LogFilename.c_str(), std::ofstream::out);
@@ -261,6 +254,10 @@ int main(int argc, char **argv) {
raw_os_ostream *Ls = new raw_os_ostream(LogFilename == "-" ? std::cout : Lfs);
Ls->SetUnbuffered();
+ ValidateAndGenerateBuildAttributes(GenerateBuildAtts ? Ls : nullptr);
+ if (GenerateBuildAtts)
+ return GetReturnValue(0);
+
if (!ALLOW_DISABLE_IR_GEN && DisableIRGeneration) {
*Ls << "Error: Build doesn't allow --no-ir-gen when not "
<< "ALLOW_DISABLE_IR_GEN!\n";
@@ -274,6 +271,7 @@ int main(int argc, char **argv) {
Flags.FunctionSections = FunctionSections;
Flags.DataSections = DataSections;
Flags.UseIntegratedAssembler = UseIntegratedAssembler;
+ Flags.UseELFWriter = UseELFWriter;
Flags.UseSandboxing = UseSandboxing;
Flags.PhiEdgeSplit = EnablePhiEdgeSplit;
Flags.DecorateAsm = DecorateAsm;
@@ -294,11 +292,39 @@ int main(int argc, char **argv) {
LLSuffix.length(), LLSuffix) == 0)
BuildOnRead = false;
- Ice::GlobalContext Ctx(Ls, Os, VMask, TargetArch, OptLevel, TestPrefix,
- Flags);
+ // With the ELF writer, use a raw_fd_ostream to allow seeking.
+ // Also don't buffer, otherwise it gets pretty slow.
+ Ice::Ostream *Os;
+ Ice::ELFStreamer *ELFStr = nullptr;
+ std::ofstream Ofs;
+ if (UseELFWriter) {
+ std::string ErrorInfo;
+ raw_fd_ostream *FdOs =
+ new raw_fd_ostream(OutputFilename.c_str(), ErrorInfo);
Jim Stichnoth 2014/11/21 21:32:23 Should we disallow OutputFilename=="-" which is it
jvoung (off chromium) 2014/11/24 21:35:47 Done -- streaming to stdout will have problems bec
+ if (!ErrorInfo.empty()) {
+ *Ls << "Failed to open output file: " << OutputFilename << ":\n"
+ << ErrorInfo << "\n";
+ return GetReturnValue(1);
+ }
+ ELFStr = new Ice::ELFStreamer(*FdOs);
+ Os = FdOs;
+ } else {
+ if (OutputFilename != "-") {
+ Ofs.open(OutputFilename.c_str(), std::ofstream::out);
+ }
+ Os = new raw_os_ostream(OutputFilename == "-" ? std::cout : Ofs);
Jim Stichnoth 2014/11/21 21:32:23 I know this was just copy/paste, but can we struct
jvoung (off chromium) 2014/11/24 21:35:46 Done. Did something similar for the Ls stream.
+ Os->SetUnbuffered();
+ }
+
+ Ice::GlobalContext Ctx(Ls, Os, ELFStr, VMask, TargetArch, OptLevel,
+ TestPrefix, Flags);
Ice::TimerMarker T(Ice::TimerStack::TT_szmain, &Ctx);
+ if (UseELFWriter) {
+ Ctx.getObjectWriter()->writeInitialELFHeader();
+ }
+
int ErrorStatus = 0;
if (BuildOnRead) {
Ice::PNaClTranslator Translator(&Ctx, Flags);
@@ -324,6 +350,9 @@ int main(int argc, char **argv) {
<< "--build-on-read=0 not allowed\n";
return GetReturnValue(1);
}
+ if (UseELFWriter) {
+ Ctx.getObjectWriter()->writeNonUserSections();
+ }
if (SubzeroTimingEnabled)
Ctx.dumpTimers();
if (TimeEachFunction) {
@@ -332,5 +361,6 @@ int main(int argc, char **argv) {
}
const bool FinalStats = true;
Ctx.dumpStats("_FINAL_", FinalStats);
+ Os->flush();
Jim Stichnoth 2014/11/21 21:32:23 Is it enough to just flush Os? Should it be close
jvoung (off chromium) 2014/11/24 21:35:46 Switch Os and Ls to a unique_ptr, so it gets delet
return GetReturnValue(ErrorStatus);
}

Powered by Google App Engine
This is Rietveld 408576698