Skip to content

s2wasm: add outfile #23

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 22, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions src/command-line.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* Copyright 2015 WebAssembly Community Group participants
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

//
// Command line helpers.
//

#include "wasm.h"

namespace wasm {

struct Options {
bool debug;
std::string infile;
std::string outfile;
Options() : debug(false) {}
};

bool optionIs(const char *arg, const char *LongOpt, const char *ShortOpt) {
return strcmp(arg, LongOpt) == 0 || strcmp(arg, ShortOpt) == 0;
}

// TODO(jfb) Make this configurable: callers should pass in option handlers.
void processCommandLine(int argc, const char *argv[], Options *options) {
for (size_t i = 1; i != argc; ++i) {
if (optionIs(argv[i], "--help", "-h")) {
std::cerr << "s2wasm INFILE\n\n"
"Link .s file into .wast\n\n"
"Optional arguments:\n"
" -n, --help Show this help message and exit\n"
" -d, --debug Print debug information to stderr\n"
" -o, --output Output file (stdout if not specified)\n"
<< std::endl;
exit(EXIT_SUCCESS);
} else if (optionIs(argv[i], "--debug", "-d")) {
options->debug = true;
} else if (optionIs(argv[i], "--output", "-o")) {
if (i + 1 == argc) {
std::cerr << "No output file" << std::endl;
exit(EXIT_FAILURE);
}
if (options->outfile.size()) {
std::cerr << "Expected only one output file, got '" << options->outfile
<< "' and '" << argv[i] << "'" << std::endl;
exit(EXIT_FAILURE);
}
options->outfile = argv[++i];
} else {
if (options->infile.size()) {
std::cerr << "Expected only one input file, got '" << options->infile
<< "' and '" << argv[i] << "'" << std::endl;
exit(EXIT_FAILURE);
}
options->infile = argv[i];
}
}
}

} // namespace wasm
72 changes: 42 additions & 30 deletions src/s2wasm-main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,46 +18,58 @@
// wasm2asm console tool
//

#include "command-line.h"
#include "s2wasm.h"

using namespace cashew;
using namespace wasm;

namespace wasm {
int debug = 0;
}
int main(int argc, const char *argv[]) {
Options options;
processCommandLine(argc, argv, &options);

std::string input;
{
if (options.debug) {
std::cerr << "Loading '" << options.infile << "'..." << std::endl;
}
std::ifstream infile(options.infile);
if (!infile.is_open()) {
std::cerr << "Failed opening '" << options.infile << "'" << std::endl;
exit(EXIT_FAILURE);
}
infile.seekg(0, std::ios::end);
size_t insize = infile.tellg();
input.resize(insize + 1);
infile.seekg(0);
infile.read(&input[0], insize);
}

std::streambuf *buffer;
std::ofstream outfile;
if (options.outfile.size()) {
if (options.debug) std::cerr << "Opening '" << options.outfile << std::endl;
outfile.open(options.outfile, std::ofstream::out | std::ofstream::trunc);
if (!outfile.is_open()) {
std::cerr << "Failed opening '" << options.outfile << "'" << std::endl;
exit(EXIT_FAILURE);
}
buffer = outfile.rdbuf();
} else {
buffer = std::cout.rdbuf();
}
std::ostream out(buffer);

int main(int argc, char **argv) {
debug = getenv("S2WASM_DEBUG") ? getenv("S2WASM_DEBUG")[0] - '0' : 0;

char *infile = argv[1];

if (debug) std::cerr << "loading '" << infile << "'...\n";
FILE *f = fopen(argv[1], "r");
assert(f);
fseek(f, 0, SEEK_END);
int size = ftell(f);
char *input = new char[size+1];
rewind(f);
int num = fread(input, 1, size, f);
// On Windows, ftell() gives the byte position (\r\n counts as two bytes), but when
// reading, fread() returns the number of characters read (\r\n is read as one char \n, and counted as one),
// so return value of fread can be less than size reported by ftell, and that is normal.
assert((num > 0 || size == 0) && num <= size);
fclose(f);
input[num] = 0;

if (debug) std::cerr << "parsing and wasming...\n";
if (options.debug) std::cerr << "Parsing and wasming..." << std::endl;
AllocatingModule wasm;
S2WasmBuilder s2wasm(wasm, input);
S2WasmBuilder s2wasm(wasm, input.c_str(), options.debug);

if (debug) std::cerr << "emscripten gluing...\n";
if (options.debug) std::cerr << "Emscripten gluing..." << std::endl;
std::stringstream meta;
s2wasm.emscriptenGlue(meta);

if (debug) std::cerr << "printing...\n";
std::cout << wasm;
std::cout << meta.str();
if (options.debug) std::cerr << "Printing..." << std::endl;
out << wasm << meta.str() << std::endl;

if (debug) std::cerr << "done.\n";
if (options.debug) std::cerr << "Done." << std::endl;
}
22 changes: 11 additions & 11 deletions src/s2wasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@

namespace wasm {

extern int debug; // wasm::debug is set in main(), typically from an env var

cashew::IString EMSCRIPTEN_ASM_CONST("emscripten_asm_const");

//
Expand All @@ -35,15 +33,17 @@ cashew::IString EMSCRIPTEN_ASM_CONST("emscripten_asm_const");
class S2WasmBuilder {
AllocatingModule& wasm;
MixedArena& allocator;
char *s;
const char *s;
bool debug;

public:
S2WasmBuilder(AllocatingModule& wasm, char *input) : wasm(wasm), allocator(wasm.allocator) {
s = input;
scan();
s = input;
process();
fix();
S2WasmBuilder(AllocatingModule& wasm, const char* input, bool debug)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why did this lose indentation?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

clang-format. Do you have a style guide I can teach it? I'd rather just blindly format stuff, we can tell if which style to follow.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh sure, clang-format is fine. Just wanted to check this wasn't a mistake.

I'd be fine with clang-format on all the things.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I won't format things I don't touch though, I'll do incremental.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool.

: wasm(wasm), allocator(wasm.allocator), debug(debug) {
s = input;
scan();
s = input;
process();
fix();
}

private:
Expand Down Expand Up @@ -217,7 +217,7 @@ class S2WasmBuilder {
skipWhitespace();
if (*s != '$') return Name();
std::string str;
char *before = s;
const char *before = s;
while (*s && *s != '=' && *s != '\n' && *s != ',') {
str += *s;
s++;
Expand Down Expand Up @@ -393,7 +393,7 @@ class S2WasmBuilder {
};
auto getNumInputs = [&]() {
int ret = 1;
char *t = s;
const char *t = s;
while (*t != '\n') {
if (*t == ',') ret++;
t++;
Expand Down
2 changes: 2 additions & 0 deletions src/wasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <fstream>
#include <map>
#include <vector>

Expand Down