2020#include " llvm/IR/LegacyPassManager.h"
2121#include " llvm/IR/Module.h"
2222#include " llvm/MC/TargetRegistry.h"
23+ #include " llvm/Support/FileSystem.h"
24+ #include " llvm/Support/Path.h"
2325#include " llvm/Support/TargetSelect.h"
2426#include " llvm/Target/TargetMachine.h"
2527
@@ -93,11 +95,18 @@ MlirStringRef compileModule(MlirOperation module, MlirStringRef moduleName,
9395 assert (optLevel >= 0 && optLevel <= 3 && " expected optLevel between 0 and 3" );
9496 targetMachine->setOptLevel (static_cast <llvm::CodeGenOptLevel>(optLevel));
9597 llvmModule->setDataLayout (targetMachine->createDataLayout ());
96- std::string moduleNameStr (unwrap (moduleName));
97- std::string objectFileName = moduleNameStr + " .o" ;
98+
99+ llvm::SmallString<256 > TempDir;
100+ std::error_code EC = llvm::sys::fs::createUniqueDirectory (" wasm-module" , TempDir);
101+ if (EC)
102+ llvm::report_fatal_error (" Failed to create temporary directory: " + EC.message ());
103+
104+ llvm::SmallString<256 > objectFileName (TempDir);
105+ llvm::sys::path::append (objectFileName, unwrap (moduleName));
106+ objectFileName.append (" .o" );
98107
99108 std::error_code error;
100- llvm::raw_fd_ostream objectFileOutput (llvm::StringRef ( objectFileName) , error);
109+ llvm::raw_fd_ostream objectFileOutput (objectFileName, error);
101110
102111 llvm::legacy::PassManager pm;
103112 if (targetMachine->addPassesToEmitFile (pm, objectFileOutput, nullptr ,
@@ -114,17 +123,20 @@ MlirStringRef compileModule(MlirOperation module, MlirStringRef moduleName,
114123
115124void linkLoadModule (MlirStringRef objectFileName,
116125 MlirStringRef binaryFileName) {
117- std::string objectFileNameStr (unwrap (objectFileName));
118- std::string binaryFileNameStr (unwrap (binaryFileName));
126+ llvm::SmallString<256 > ObjectFileName (unwrap (objectFileName));
127+
128+ llvm::SmallString<256 > BinaryFileName (llvm::sys::path::parent_path (ObjectFileName));
129+ llvm::sys::path::append (BinaryFileName, unwrap (binaryFileName));
130+
119131 std::vector<const char *> linkerArgs = {" wasm-ld" ,
120132 " -shared" ,
121133 " --import-memory" ,
122134 " --experimental-pic" ,
123135 " --stack-first" ,
124136 " --allow-undefined" ,
125- objectFileNameStr .c_str (),
137+ ObjectFileName .c_str (),
126138 " -o" ,
127- binaryFileNameStr .c_str ()};
139+ BinaryFileName .c_str ()};
128140
129141 const lld::DriverDef wasmDriver = {lld::Flavor::Wasm, &lld::wasm::link};
130142 std::vector<lld::DriverDef> wasmDriverArgs;
@@ -136,7 +148,7 @@ void linkLoadModule(MlirStringRef objectFileName,
136148 llvm::report_fatal_error (" Failed to link incremental module" );
137149
138150 void *loadedLibModule =
139- dlopen (binaryFileNameStr .c_str (), RTLD_NOW | RTLD_GLOBAL);
151+ dlopen (BinaryFileName .c_str (), RTLD_NOW | RTLD_GLOBAL);
140152 if (!loadedLibModule)
141153 llvm::report_fatal_error (" Failed to link incremental module" );
142154}
@@ -145,6 +157,6 @@ void *getSymbolAddress(MlirStringRef name) {
145157 std::string nameStr (unwrap (name));
146158 void *sym = dlsym (RTLD_DEFAULT, nameStr.c_str ());
147159 if (!sym)
148- llvm::report_fatal_error (" dlsym failed for symbol: " );
160+ llvm::report_fatal_error (" dlsym failed for symbol: " + nameStr );
149161 return sym;
150162}
0 commit comments