clang: lib/Interpreter/Wasm.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

15

16#include <llvm/IR/LegacyPassManager.h>

17#include <llvm/IR/Module.h>

18#include <llvm/MC/TargetRegistry.h>

19#include <llvm/Target/TargetMachine.h>

20

22

23#include

24

28 Gnu,

29 MinGW,

33};

34

36 llvm::raw_ostream &, bool, bool);

37

41};

42

46};

47

50

51namespace wasm {

53 llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput);

54}

55}

56

57#include <dlfcn.h>

58

60

62 llvm::orc::ThreadSafeContext &TSC)

64

66 std::string ErrorString;

67

68 const llvm::Target *Target = llvm::TargetRegistry::lookupTarget(

69 PTU.TheModule->getTargetTriple(), ErrorString);

71 return llvm::make_errorllvm::StringError("Failed to create Wasm Target: ",

72 llvm::inconvertibleErrorCode());

73 }

74

75 llvm::TargetOptions TO = llvm::TargetOptions();

76 llvm::TargetMachine *TargetMachine = Target->createTargetMachine(

77 PTU.TheModule->getTargetTriple(), "", "", TO, llvm::Reloc::Model::PIC_);

78 PTU.TheModule->setDataLayout(TargetMachine->createDataLayout());

79 std::string ObjectFileName = PTU.TheModule->getName().str() + ".o";

80 std::string BinaryFileName = PTU.TheModule->getName().str() + ".wasm";

81

82 std::error_code Error;

83 llvm::raw_fd_ostream ObjectFileOutput(llvm::StringRef(ObjectFileName), Error);

84

85 llvm::legacy::PassManager PM;

86 if (TargetMachine->addPassesToEmitFile(PM, ObjectFileOutput, nullptr,

87 llvm::CodeGenFileType::ObjectFile)) {

88 return llvm::make_errorllvm::StringError(

89 "Wasm backend cannot produce object.", llvm::inconvertibleErrorCode());

90 }

91

93

94 return llvm::make_errorllvm::StringError("Failed to emit Wasm object.",

95 llvm::inconvertibleErrorCode());

96 }

97

98 ObjectFileOutput.close();

99

100 std::vector<const char *> LinkerArgs = {"wasm-ld",

101 "-shared",

102 "--import-memory",

103 "--experimental-pic",

104 "--stack-first",

105 "--allow-undefined",

106 ObjectFileName.c_str(),

107 "-o",

108 BinaryFileName.c_str()};

109

111 std::vectorlld::DriverDef WasmDriverArgs;

112 WasmDriverArgs.push_back(WasmDriver);

114 lld::lldMain(LinkerArgs, llvm::outs(), llvm::errs(), WasmDriverArgs);

115

117 return llvm::make_errorllvm::StringError(

118 "Failed to link incremental module", llvm::inconvertibleErrorCode());

119

120 void *LoadedLibModule =

121 dlopen(BinaryFileName.c_str(), RTLD_NOW | RTLD_GLOBAL);

122 if (LoadedLibModule == nullptr) {

123 llvm::errs() << dlerror() << '\n';

124 return llvm::make_errorllvm::StringError(

125 "Failed to load incremental module", llvm::inconvertibleErrorCode());

126 }

127

128 return llvm::Error::success();

129}

130

132 return llvm::make_errorllvm::StringError("Not implemented yet",

133 llvm::inconvertibleErrorCode());

134}

135

137

138 return llvm::Error::success();

139}

140

142

143

144 return llvm::Error::success();

145}

146

148

149}

llvm::MachO::Target Target

llvm::Error addModule(PartialTranslationUnit &PTU) override

llvm::Error runCtors() const override

~WasmIncrementalExecutor() override

llvm::Error removeModule(PartialTranslationUnit &PTU) override

llvm::Error cleanUp() override

WasmIncrementalExecutor(llvm::orc::ThreadSafeContext &TSC)

The JSON file list parser is used to communicate input to InstallAPI.

@ Result

The result type of a method or function.

bool link(llvm::ArrayRef< const char * > args, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput)

Result lldMain(llvm::ArrayRef< const char * > args, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS, llvm::ArrayRef< DriverDef > drivers)

bool(*)(llvm::ArrayRef< const char * >, llvm::raw_ostream &, llvm::raw_ostream &, bool, bool) Driver

The class keeps track of various objects created as part of processing incremental inputs.

std::unique_ptr< llvm::Module > TheModule

The llvm IR produced for the input.