summaryrefslogtreecommitdiff
path: root/src/binaryen-c.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/binaryen-c.cpp')
-rw-r--r--src/binaryen-c.cpp71
1 files changed, 65 insertions, 6 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 63ce7ee6c..c2ba7fa6b 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -2100,19 +2100,43 @@ void BinaryenModuleAutoDrop(BinaryenModuleRef module) {
passRunner.run();
}
-size_t BinaryenModuleWrite(BinaryenModuleRef module, char* output, size_t outputSize) {
- if (tracing) {
- std::cout << " // BinaryenModuleWrite\n";
- }
-
+static BinaryenBufferSizes writeModule(BinaryenModuleRef module, char* output, size_t outputSize, const char* sourceMapUrl, char* sourceMap, size_t sourceMapSize) {
Module* wasm = (Module*)module;
BufferWithRandomAccess buffer(false);
WasmBinaryWriter writer(wasm, buffer, false);
writer.setNamesSection(globalPassOptions.debugInfo);
+ std::ostringstream os;
+ if (sourceMapUrl) {
+ writer.setSourceMap(&os, sourceMapUrl);
+ }
writer.write();
size_t bytes = std::min(buffer.size(), outputSize);
std::copy_n(buffer.begin(), bytes, output);
- return bytes;
+ size_t sourceMapBytes = 0;
+ if (sourceMapUrl) {
+ auto str = os.str();
+ sourceMapBytes = std::min(str.length(), sourceMapSize);
+ std::copy_n(str.c_str(), sourceMapBytes, sourceMap);
+ }
+ return { bytes, sourceMapBytes };
+}
+
+size_t BinaryenModuleWrite(BinaryenModuleRef module, char* output, size_t outputSize) {
+ if (tracing) {
+ std::cout << " // BinaryenModuleWrite\n";
+ }
+
+ return writeModule((Module*)module, output, outputSize, nullptr, nullptr, 0).outputBytes;
+}
+
+BinaryenBufferSizes BinaryenModuleWriteWithSourceMap(BinaryenModuleRef module, const char* url, char* output, size_t outputSize, char* sourceMap, size_t sourceMapSize) {
+ if (tracing) {
+ std::cout << " // BinaryenModuleWriteWithSourceMap\n";
+ }
+
+ assert(url);
+ assert(sourceMap);
+ return writeModule((Module*)module, output, outputSize, url, sourceMap, sourceMapSize);
}
BinaryenModuleRef BinaryenModuleRead(char* input, size_t inputSize) {
@@ -2144,6 +2168,26 @@ void BinaryenModuleInterpret(BinaryenModuleRef module) {
ModuleInstance instance(*wasm, &interface);
}
+BinaryenIndex BinaryenModuleAddDebugInfoFileName(BinaryenModuleRef module, const char* filename) {
+ if (tracing) {
+ std::cout << " BinaryenModuleAddDebugInfoFileName(the_module, \"" << filename << "\");\n";
+ }
+
+ Module* wasm = (Module*)module;
+ BinaryenIndex index = wasm->debugInfoFileNames.size();
+ wasm->debugInfoFileNames.push_back(filename);
+ return index;
+}
+
+const char* BinaryenModuleGetDebugInfoFileName(BinaryenModuleRef module, BinaryenIndex index) {
+ if (tracing) {
+ std::cout << " BinaryenModuleGetDebugInfoFileName(the_module, \"" << index << "\");\n";
+ }
+
+ Module* wasm = (Module*)module;
+ return index < wasm->debugInfoFileNames.size() ? wasm->debugInfoFileNames.at(index).c_str() : nullptr;
+}
+
//
// ======== FunctionType Operations ========
//
@@ -2275,6 +2319,21 @@ void BinaryenFunctionRunPasses(BinaryenFunctionRef func, BinaryenModuleRef modul
}
passRunner.runOnFunction((Function*)func);
}
+void BinaryenFunctionSetDebugLocation(BinaryenFunctionRef func, BinaryenExpressionRef expr, BinaryenIndex fileIndex, BinaryenIndex lineNumber, BinaryenIndex columnNumber) {
+ if (tracing) {
+ std::cout << " BinaryenFunctionSetDebugLocation(functions[" << functions[func] << "], expressions[" << expressions[expr] << "], " << fileIndex << ", " << lineNumber << ", " << columnNumber << ");\n";
+ }
+
+ auto* fn = (Function*)func;
+ auto* ex = (Expression*)expr;
+
+ Function::DebugLocation loc;
+ loc.fileIndex = fileIndex;
+ loc.lineNumber = lineNumber;
+ loc.columnNumber = columnNumber;
+
+ fn->debugLocations[ex] = loc;
+}
//
// =========== Import operations ===========