工具类的封装
llvm 工具类的封装都实现在 ADT
和 Support
下。
ADT
- AddressRanges:地址范围的封装,地址范围容器的封装。
- ADL: Argument Depend look up 用的。
- AllocatorList:一个可以自己指定分配器的链表。
- any: 类似于 void*, 可以将编译时期不知道类型的东西容纳到里面。一定要是可复制的类型才能在里面,同时在转换之前会进行类型判断。
- APFixedPoint, APFloat, APInt, APSInt:数据类型的低层次封装。
- ArrayRef: 指向一段内存的视图。分为正常类型和 mutable 类型,正常类型保存可读视图,mutable 类型保存读写视图。他们都不保存数据,只保存指向底层数据的指针,如果想要,也提供了方法拷贝。
- bit*: 封装任何能想象到的 bit 操作,同时实现可能还考虑到了大小端序。
- BreadthFirstIterator:广度优先迭代器的封装。
- CachedHashString: 分 string 和 stringref 的实现,主要是这两个实现再带一个 hash 值,可能在存到 map 里面的时候会有用。
- CoalescingBitVector:也是一个 bitvector,他更加适合用于数据分散的场景。
- ConbinationGenerator:一个序列生成器,用户可以注册回调函数使用生成的序列。
- ConcurrentHashTable:并发哈希表,提供接口来插入元素,如果已经有了就返回在table中的指针。
- DeltaAlgorithm:一个集合缩小化的方法,给定一个输入集合,程序会尝试缩小集合中的元素,将集合缩小到一个能够保持原来特征的尺寸。在 debug 的时候缩小错误集合挺好的。
- DeltaTree: BTree 的一种实现。
- Dense*:提供了密集 Map 和密集 Set 的实现。
- DepthFirstIterator:深度优先遍历迭代器的实现。
- DirectGraph: 直接的图实现,顺便封装了节点和边,插入图并不创建边,边要手动相连。
- edit_distance:计算 Levenshtein distance,指把一个字符串转换成另外的字符串需要的步数。
- EnumeratedArray:能用某种 Enum 类型访问的数组。自己实际存储了元素,并不是视图。
- EpochTracker:用于迭代时候计数用的,通过一个计数能够更快的在错误的情况的时候 assert 掉。
- EquivalenceClasses:并查集的封装实现。
- fallible_iterator:能够放回错误情况的迭代器 wrapper,也是能够用于快速退出。
- Floatingpointmode:一些浮点模式,比如说溢出等等。
- FunctionExtras:对 std::function 的一些增强。
- GenericConvergenceVerifier: 貌似是对某些手链操作的认证。
- Generic*:一些通用的实现,包括分析、SSA、机器周期等等。
- GraphTrait:创建图的视图,能够对图进行一些不同方式的遍历。
- Hashing:创建 hash 值的一些接口。
- identity:一个默认函数的实现,类似于cpp20的 identity,什么都不做,类似于占位符。
- ilist:列表的实现,不同于普通的链表,实现采用的是双向循环的链表,注意,实现中告知了最好不要使用 size 方法。
- ImmutableMap,ImmutableSet,ImmutableList:状态不变的数据结构,等于插入和修改不会改变内部的状态,而是会保存快照,之后方便回滚之类的。
- IndexedMap:其实就是简单的 vector,就是传入 index 的能有一个函数能hash一下,改变下访问的下标。
- IntEqClasses:为小数字优化的并查集?
- IntervalMap 和 IntervalTree:区间查询。
- IntrusiveRefCntPtr:类似于智能指针,维护计数的。
- iterator:迭代器抽象。
- iterator_range:一组迭代范围的创建。
- LazyAtomicPointer:Lock free 的原子写保证。
- MapVector:一个 Map,里面装了 vector。
- PackedVector:压缩存储数据的 vector,在数据被存入之后,可能只会保存其中的几位。
- PagedVector:每次按页开辟空间的 vector。
- Pointer*.h: 一个指针类型同时携带着其他类型。
- PostOrderIterator.h:结合 graphtrait 使用,估计也是用来迭代的。
- Prioriry*:优先队列的实现。
- RewriteBuffer:在很多时候,编译器在做了一些优化之后不能直接改变原先的文件,而是需要先写在buffer中,最后准备好了再写到文件中。
- RewritePope:貌似也是一种字符串的实现。
- SCCIterator:查找全联通分量的迭代器。
- ScopeHashTable: 只在自己代码作用域内才会产生影响的 hashTable。
- ScopeExit:用于封装退出某些作用域的时候的操作。
- Sequence:序列产生器,能够产生 (a,b) 这种区间序列的操作。
- SetOperations:对数据结构进行 set 赋值操作的一些运算符。
- SetVector:具有 Set 语义的 Vector。
- simple_list:侵入式链表的实现,链表只管理指针,内存分配要由用户显式管理。
- Small*:在数目比较少的时候采用的数据结构。
- Sparse*:一些用于稀疏情况的数据结构。
- StableHash:用于计算模块和不同版本编译器之间的 Hash。
- Statistic:记录 pass 运行时候的一些统计数值。
- STL*:一些对 STL 功能的增强等等。
- StringRef:自己不维护数据,指向别的 string,string的视图,指向的 string 可以不以
\0
结尾。 - StringSwitch:用 string 进行 switch 的节奏。
- String*:其他为 String 封装的数据结构。
- TinyPtrVector:为了只有 0 或一个元素的 Vector 设计
- trie*:trie相关。
- Twine:貌似是某些情况下用来拼某些字符串用的。
- TypeSwitch:对于 Type 进行 switch,实际上是动态的类型分发。
- UniqueVector:在插入的时候同时为每个元素分配id。
support
- AdvsioryLock:一种同步原语的实现
- Alignment:检查对齐。
- Alignof:封装了对齐内存的类。
- AllocatorBase:所有 llvm 风格分配器的基本接口。
- Allocator: bumppointerallocator 的定义,这种分配器不一个个释放空间,而是一次性释放。
- ArrayRecycle:貌似是小数组的回收器。
- atomic:原子操作的实现。
- AtomicOrdering:对 c 内存模型的支持。
- Automaton: 对 table gen 自动机构造的支持。
- BalancedPartitioning:平衡的分割一个图
- Base64/BCD:与 Base64 和 BCD 编码解码有关。
- BinaryStream*:对 stream format 读写的封装,类似于视图。
- BlockFrequency:统计基本快的频繁度。
- BranchProbability:统计分支的倾向,能够在 IR 间传递访问。
- capacity:计算 AST 使用的内存大小。
- casting:类似于做强制转换修改的操作。
- CFG*:控制流图相关。
- CheckArthi:检查是不是算数相关的操作溢出了
- cacular_raw_ostream:循环缓冲区实现的 raw ostream
- CodeGen:代码生成相关
- CommandLine:几乎所有能想到的命令行操作的封装。opt 的实现方式貌似是先注册 opt,然后根据命令行的传入修改 opt,还能加一些会调。
- Compiler:封装与编译器相关的宏
- Compression:压缩成特定的格式。
- CrashRecoveryContext:一个检测发生 crash 的包装器,在调用函数的时候可以用这个包装下,在 if 判断中判断是不是有 crash 发生。
- DataExtractor:从某个位置开始解析字符串,应该用于报错的时候。
- Debug.h:用来使能 debugflag 用的。
- DebugCounter:类似也是个计数器,到数字了assert掉。用在编译的时候。
- DivisionByConstant:用那个神奇的算法来提升除法的效率。
- DynamicLibrary:动态库加载的接口封装。
- ELF*:ELF 相关。
- Err*:错误处理相关以及错误类的封装,经常使用。
- ExponentialBackoff:保证某件事已经在某个时间内完成?
- File*:封装和文件系统相关的。
- format*:格式化打印相关的。
- Generic*:为分析 pass 提供的一些封装。
- GraphWrite:为画图提供的一些封装。
- initllvm:初始化
- instructioncost:计算指令的开销。
- Knowbits:貌似是对 bit 串的 0 1 检测。
- lineiterator:行迭代器,一行行的读。
- LockFileManager:在多线程的情况下管理被线程独占的文件
- LogicalResult:对返回结果是 true 和 false 一种类似于可读性和功能性的封装。
- MathExtra:提供了一些数学函数。
- memalloc:貌似是对外提供的内存分配接口。
- Memory:分配出的内存。
- memorybuffer:以 memorybuffer 的形式返回各种内存中的空间。
- mutex:锁实现。
- nativeformating:格式化的另一些接口。
- optimizedstructlayout:对 struct 布局的一些优化。
- optimizestrcmp:对 stringref 比较的优化
- Parallel:多线程处理的逻辑。
- Path:路径格式工具类
- pluginloader:插件加载器
- prettystacktrace:调用栈打印
- Printable:显式表示可打印的包装类。
- Process:对当前进程信息的获取。
- program:很杂,能进行输出重定向等等。
- row_os_stream:对输出流封装了颜色。还有其他的一些封装。
- Regex:模式匹配的实现。
- SaveAndRestore:像暂时存放东西的容器。
- ScaledNumber:对数字的一些操作。
- scopedprinter:带范围的打印。
- SMLoc:源代码文件的范围行数等等。
- SourceMgr:和源代码诊断相关的。
- StringSaver:存字符串并返回 StringRef。
- Swapbytecode:交换操作。
- TargetSelect:编译目标平台的选择。
- Thread*:封装线程。
- Time*:时间检测相关的。
- type_trait:自己的一些 trait 封装。
- Typename:返回类型名
- typesize:类型大小相关。
mlir/support
- ADTExtras:对 ArrayRef 的增强, COW.
- DeugStringHelper: debug string 的帮助函数
- fileutil:新封装的打开文件的操作。
- Interface: mlir interface
- LLVM.h: 封装用到 LLVM 的一些东西。
- LogicalResult:对 LLVM LogicalResult 的一些封装。
- StorageUniquer:反正也是涉及到类型的注册。
- ToolUtil:分割文件的帮助方法。
- ThreadLocalCache: ThreadLocal 相关