#pragma once #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" #include #include #include namespace scriptc { // A program module divided into independently compilable textual modules. struct ProgramPartitions { // One complete LLVM assembly module per partition. std::vector Sources; // Definitions that were not internal in the original module. Every other // definition was internal and is promoted to hidden visibility only so the // partitions can reference each other. llvm::StringSet<> PublicSymbols; }; // Divides the LLVM assembly scriptc emits into Count modules without parsing // it, so the partitions can be parsed concurrently. Functions are placed by a // stable hash of their name; an internal function referenced by exactly one // other function stays with that function unless its body is too large to // inline, and a global stays with the first function that references it. Returns nullopt for any construct outside the // emitter's narrow top-level grammar; callers then split a parsed module. std::optional partitionProgramText(llvm::StringRef Text, unsigned Count); } // namespace scriptc