由于llvm::StringRef 只拥有数据的引用,而不管理实际字符串的内存,所以它的结构很简单。 class StringRef { private: const char *data = nullptr; size_t length = 0; }; 成员方法 事实上,使用 const std::string & 基本可以取代 llvm::StringRef,然而,StringRef 的另一个优势是,它提供了更多更易用的...
StringRef oldName = GV.getName(); Hasher.update("kanxue_"); Hasher.update(oldName); Hasher.final(Hash); SmallString<32> HexString; llvm::MD5::stringifyResult(Hash, HexString); errs() << "EncodeVariableName: " << oldName << " -...
.PluginVersion = LLVM_VERSION_STRING, .RegisterPassBuilderCallbacks = [](PassBuilder &PB) { PB.registerPipelineParsingCallback( [](StringRef Name, ModulePassManager &MPM, ArrayRef<PassBuilder::PipelineElement>) -> bool { if (Name == "gvobfus") { MPM.addP...
现在C++ 开发中,处理数组和序列数据的需求非常常见,而有效的数组管理能显著提高程序性能。本文介绍一种数组引用的实现: ArrayRef,它以一种简单直接地方式,帮助开发者高效访问和操作数组。 基本介绍 llvm::Ar…
// toplevelexpr ::= expression std::unique_ptr<FunctionAST> ParseTopLevelExpr() { auto expr = ParseExpression(); auto proto = std::make_unique<PrototypeAST>("", std::vector<std::string>()); return std::make_unique<FunctionAST>(std::move(proto), std::move(expr)); } 顶层代码的意...
std::string targetISA = std::move(*maybeTargetISA); std::unique_ptr<std::vector<char>> blob =serializeISA(targetISA); } LLVM的JIT编译能力也是其区别于传统静态编译器的重要特性。通过MCJIT(Machine Code JIT)和ORC(On Request Compilation)框架,LLVM可以在运行时将IR编译为机器代码并立即执行,这对实现...
#include "Sema.h" #include "llvm/ADT/StringSet.h" namespace { class DeclCheck : public ASTVisitor { llvm::StringSet<> Scope; bool HasError; enum ErrorType { Twice, Not }; void error(ErrorType ET, llvm::StringRef V) { llvm::errs() << "Variable " << V << " " << (ET =...
RecordType:描述了记录类型,例如 struct __NSConstantString_tag。 FunctionDecl:表示函数声明,包括函数名称、返回类型和参数信息。 ParmVarDecl:参数变量的声明,包括参数名称和类型。 CompoundStmt:表示由多个语句组成的语句块。 函数调用表达式、声明引用表达式和隐式类型转换表达式等,用于描述不同的语法结构。 各种属性信...
I'm planning to migrate StringRef to std::string_view eventually. Since std::string_view does not have slice, this patch migrates slice(0, N) to substr(0, N).