Skip to content

Commit

Permalink
Decouple Obj-C literals generator from context and single LLVM module
Browse files Browse the repository at this point in the history
  • Loading branch information
SvyatoslavScherbina committed Oct 17, 2019
1 parent fde7265 commit cf06b6e
Showing 1 changed file with 32 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -246,32 +246,48 @@ internal class ObjCDataGenerator(val codegen: CodeGenerator) {
context.llvm.compilerUsedGlobals += global.llvmGlobal
}

private val classNames =
CStringLiteralsTable("OBJC_CLASS_NAME_", "__TEXT,__objc_classname,cstring_literals")
private val classNames = CStringLiteralsTable(classNameGenerator)

private val selectors =
CStringLiteralsTable("OBJC_METH_VAR_NAME_", "__TEXT,__objc_methname,cstring_literals")
private val selectors = CStringLiteralsTable(selectorGenerator)

private val encodings =
CStringLiteralsTable("OBJC_METH_VAR_TYPE_", "__TEXT,__objc_methtype,cstring_literals")
private val encodings = CStringLiteralsTable(encodingGenerator)

private inner class CStringLiteralsTable(val label: String, val section: String) {
private inner class CStringLiteralsTable(val generator: CStringLiteralsGenerator) {

private val literals = mutableMapOf<String, ConstPointer>()

fun get(value: String) = literals.getOrPut(value) {
val bytes = value.toByteArray(Charsets.UTF_8).map { Int8(it) } + Int8(0)
val global = context.llvm.staticData.placeGlobalArray(label, int8Type, bytes)
val globalPointer = generator.generate(context.llvmModule!!, value)
context.llvm.compilerUsedGlobals += globalPointer.llvm
globalPointer.getElementPtr(0)
}
}

global.setConstant(true)
global.setLinkage(LLVMLinkage.LLVMPrivateLinkage)
global.setSection(section)
LLVMSetUnnamedAddr(global.llvmGlobal, 1)
global.setAlignment(1)
companion object {
val classNameGenerator =
CStringLiteralsGenerator("OBJC_CLASS_NAME_", "__TEXT,__objc_classname,cstring_literals")

context.llvm.compilerUsedGlobals += global.llvmGlobal
val selectorGenerator =
CStringLiteralsGenerator("OBJC_METH_VAR_NAME_", "__TEXT,__objc_methname,cstring_literals")

private val encodingGenerator =
CStringLiteralsGenerator("OBJC_METH_VAR_TYPE_", "__TEXT,__objc_methtype,cstring_literals")
}

class CStringLiteralsGenerator(val label: String, val section: String) {
fun generate(module: LLVMModuleRef, value: String): ConstPointer {
val bytes = value.toByteArray(Charsets.UTF_8).map { Int8(it) } + Int8(0)
val initializer = ConstArray(int8Type, bytes)
val llvmGlobal = LLVMAddGlobal(module, initializer.llvmType, label)!!
LLVMSetInitializer(llvmGlobal, initializer.llvm)

LLVMSetGlobalConstant(llvmGlobal, 1)
LLVMSetLinkage(llvmGlobal, LLVMLinkage.LLVMPrivateLinkage)
LLVMSetSection(llvmGlobal, section)
LLVMSetUnnamedAddr(llvmGlobal, 1)
LLVMSetAlignment(llvmGlobal, 1)

global.pointer.getElementPtr(0)
return constPointer(llvmGlobal)
}
}
}

0 comments on commit cf06b6e

Please sign in to comment.