所有权:StringRef 是对字符串数据的引用,不拥有字符串的所有权。需要确保 StringRef 对象的生命周期,小于实际引用字符串的生命周期,否则会带来悬空引用。 大小:StringRef 只占用很小的内存,和实际字符串相比可以忽略不计。std::string 不仅包括了指针、长度,还包括了数据的内存管理信息,它在内部维护了一个动态分配的...
最后一个类是 CheckerFrontendAction,用于创建前端操作和ASTConsumer的唯一指针。 classCheckerFrontendAction:publicASTFrontendAction{public:autoCreateASTConsumer(clang::CompilerInstance&CI,llvm::StringRefInFile)->std::unique_ptr<clang::ASTConsumer>override{returnstd::make_unique<CheckerASTConsumer>();}}; 现在...
for (GlobalVariable &GV : M.globals()) { StringRef oldName = GV.getName(); Hasher.update("kanxue_"); Hasher.update(oldName); Hasher.final(Hash); SmallString<32> HexString; llvm::MD5::stringifyResult(Hash, HexString); errs() <<...
GeneratorLLVM(std::string name, bool emitDebugInfo = false) { /* Module instantiation */ this->module = std::make_unique<llvm::Module>(llvm::StringRef(name),llvmContext); /* IRBuilder instantiation */ this->builder = std::make_unique<llvm::IRBuilder<>>(llvmContext); } private: std:...
static std::unique_ptr<Module> g_llvm_module; // 用于创建 LLVM 指令 static std::unique_ptr<IRBuilder<>> g_ir_builder; // 用于记录函数的变量参数 static std::map<std::string, Value *> g_named_values; 5.1 添加 Codegen() 在每个 AST 类中添加 Codegen(),用于生成 LLVM IR。
std::string g_identifier_str; // Filled in if TOKEN_IDENTIFIER double g_number_val; // Filled in if TOKEN_NUMBER // 从标准输入解析一个Token并返回 int GetToken() { static int last_char = ' '; // 忽略空白字符 while (isspace(last_char)) { ...
return {LLVM_PLUGIN_API_VERSION, "HelloWorld", LLVM_VERSION_STRING, [](PassBuilder &PB) { PB.registerPipelineParsingCallback( [](StringRef Name, FunctionPassManager &FPM, ArrayRef<PassBuilder::PipelineElement>) { if (Name == "hello-world") { ...
(default='-O2')--check-for-objc-Only checkifthe module has objective-Cdefinedinit--disable-verify-Do not run the verifier during the optimization pipeline--dso-symbol=<string>-Symbol to putinthe symtabinthe resulting dso--exported-symbol=<string>-Listofsymbols toexportfrom the resulting ...
builder.CreateGlobalStringPtr("hello world!\n"); std::vector<llvm::Type *> putsArgs; putsArgs.push_back(builder.getInt8Ty()->getPointerTo()); llvm::ArrayRef<llvm::Type*> argsRef(putsArgs); llvm::FunctionType *putsType = llvm::FunctionType::get(builder.getInt32Ty(), argsRef, ...
unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, StringRef iFile) { //返回自定义的CJLASTConsumer,即ASTConsumer的子类对象 /* CI用于: - 判断文件是否使用户的 - 抛出警告 */ return unique_ptr<CJLASTConsumer> (new CJLASTConsumer(CI)); ...