Enable elimination of dead globals by marking them private

This eliminates most of the newly created dead globals.
Этот коммит содержится в:
Ayke van Laethem 2018-08-24 04:18:12 +02:00
родитель 5f28b07f75
коммит f49ceddd73
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: E97FF5335DFDFDED

Просмотреть файл

@ -375,6 +375,7 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
tupleArray := llvm.ConstArray(tupleType, tuples) tupleArray := llvm.ConstArray(tupleType, tuples)
tupleArrayNewGlobal := llvm.AddGlobal(c.mod, tupleArray.Type(), "interface_tuples.tmp") tupleArrayNewGlobal := llvm.AddGlobal(c.mod, tupleArray.Type(), "interface_tuples.tmp")
tupleArrayNewGlobal.SetInitializer(tupleArray) tupleArrayNewGlobal.SetInitializer(tupleArray)
tupleArrayNewGlobal.SetLinkage(llvm.PrivateLinkage)
tupleArrayOldGlobal := c.mod.NamedGlobal("interface_tuples") tupleArrayOldGlobal := c.mod.NamedGlobal("interface_tuples")
tupleArrayOldGlobal.ReplaceAllUsesWith(llvm.ConstBitCast(tupleArrayNewGlobal, tupleArrayOldGlobal.Type())) tupleArrayOldGlobal.ReplaceAllUsesWith(llvm.ConstBitCast(tupleArrayNewGlobal, tupleArrayOldGlobal.Type()))
tupleArrayOldGlobal.EraseFromParentAsGlobal() tupleArrayOldGlobal.EraseFromParentAsGlobal()
@ -382,6 +383,7 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
funcArray := llvm.ConstArray(c.i8ptrType, funcPointers) funcArray := llvm.ConstArray(c.i8ptrType, funcPointers)
funcArrayNewGlobal := llvm.AddGlobal(c.mod, funcArray.Type(), "interface_functions.tmp") funcArrayNewGlobal := llvm.AddGlobal(c.mod, funcArray.Type(), "interface_functions.tmp")
funcArrayNewGlobal.SetInitializer(funcArray) funcArrayNewGlobal.SetInitializer(funcArray)
funcArrayNewGlobal.SetLinkage(llvm.PrivateLinkage)
funcArrayOldGlobal := c.mod.NamedGlobal("interface_functions") funcArrayOldGlobal := c.mod.NamedGlobal("interface_functions")
funcArrayOldGlobal.ReplaceAllUsesWith(llvm.ConstBitCast(funcArrayNewGlobal, funcArrayOldGlobal.Type())) funcArrayOldGlobal.ReplaceAllUsesWith(llvm.ConstBitCast(funcArrayNewGlobal, funcArrayOldGlobal.Type()))
funcArrayOldGlobal.EraseFromParentAsGlobal() funcArrayOldGlobal.EraseFromParentAsGlobal()
@ -389,6 +391,7 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
signatureArray := llvm.ConstArray(llvm.Int32Type(), signatures) signatureArray := llvm.ConstArray(llvm.Int32Type(), signatures)
signatureArrayNewGlobal := llvm.AddGlobal(c.mod, signatureArray.Type(), "interface_signatures.tmp") signatureArrayNewGlobal := llvm.AddGlobal(c.mod, signatureArray.Type(), "interface_signatures.tmp")
signatureArrayNewGlobal.SetInitializer(signatureArray) signatureArrayNewGlobal.SetInitializer(signatureArray)
signatureArrayNewGlobal.SetLinkage(llvm.PrivateLinkage)
signatureArrayOldGlobal := c.mod.NamedGlobal("interface_signatures") signatureArrayOldGlobal := c.mod.NamedGlobal("interface_signatures")
signatureArrayOldGlobal.ReplaceAllUsesWith(llvm.ConstBitCast(signatureArrayNewGlobal, signatureArrayOldGlobal.Type())) signatureArrayOldGlobal.ReplaceAllUsesWith(llvm.ConstBitCast(signatureArrayNewGlobal, signatureArrayOldGlobal.Type()))
signatureArrayOldGlobal.EraseFromParentAsGlobal() signatureArrayOldGlobal.EraseFromParentAsGlobal()
@ -803,8 +806,8 @@ func (c *Compiler) parseInitFunc(frame *Frame) error {
length := typ.Elem().(*types.Array).Len() length := typ.Elem().(*types.Array).Len()
llvmLen := llvm.ConstInt(c.lenType, uint64(length), false) llvmLen := llvm.ConstInt(c.lenType, uint64(length), false)
global := llvm.AddGlobal(c.mod, val.Type(), ".array") global := llvm.AddGlobal(c.mod, val.Type(), ".array")
global.SetLinkage(llvm.PrivateLinkage)
global.SetInitializer(val) global.SetInitializer(val)
global.SetLinkage(llvm.PrivateLinkage)
zero := llvm.ConstInt(llvm.Int32Type(), 0, false) zero := llvm.ConstInt(llvm.Int32Type(), 0, false)
globalPtr := c.builder.CreateInBoundsGEP(global, []llvm.Value{zero, zero}, "") globalPtr := c.builder.CreateInBoundsGEP(global, []llvm.Value{zero, zero}, "")
sliceTyp, err := c.getLLVMType(instr.Type()) sliceTyp, err := c.getLLVMType(instr.Type())
@ -845,6 +848,7 @@ func (c *Compiler) parseInitFunc(frame *Frame) error {
// replaced with a different map. // replaced with a different map.
hashmap := llvm.AddGlobal(c.mod, val.Type(), ".hashmap") hashmap := llvm.AddGlobal(c.mod, val.Type(), ".hashmap")
hashmap.SetInitializer(val) hashmap.SetInitializer(val)
hashmap.SetLinkage(llvm.PrivateLinkage)
zero := llvm.ConstInt(llvm.Int32Type(), 0, false) zero := llvm.ConstInt(llvm.Int32Type(), 0, false)
val = llvm.ConstInBoundsGEP(hashmap, []llvm.Value{zero}) val = llvm.ConstInBoundsGEP(hashmap, []llvm.Value{zero})
case *types.Pointer: case *types.Pointer:
@ -853,6 +857,7 @@ func (c *Compiler) parseInitFunc(frame *Frame) error {
if val.IsConstant() && val.IsAGlobalVariable().IsNil() { if val.IsConstant() && val.IsAGlobalVariable().IsNil() {
obj := llvm.AddGlobal(c.mod, val.Type(), ".obj") obj := llvm.AddGlobal(c.mod, val.Type(), ".obj")
obj.SetInitializer(val) obj.SetInitializer(val)
obj.SetLinkage(llvm.PrivateLinkage)
zero := llvm.ConstInt(llvm.Int32Type(), 0, false) zero := llvm.ConstInt(llvm.Int32Type(), 0, false)
val = llvm.ConstInBoundsGEP(obj, []llvm.Value{zero}) val = llvm.ConstInBoundsGEP(obj, []llvm.Value{zero})
} }
@ -934,12 +939,13 @@ func (c *Compiler) initMapNewBucket(mapType *types.Map) (llvm.Value, uint64, uin
llvm.ArrayType(llvmKeyType, 8), // key type llvm.ArrayType(llvmKeyType, 8), // key type
llvm.ArrayType(llvmValueType, 8), // value type llvm.ArrayType(llvmValueType, 8), // value type
}, false) }, false)
bucket := llvm.AddGlobal(c.mod, bucketType, ".hashmap.bucket")
bucketValue, err := getZeroValue(bucketType) bucketValue, err := getZeroValue(bucketType)
if err != nil { if err != nil {
return llvm.Value{}, 0, 0, err return llvm.Value{}, 0, 0, err
} }
bucket := llvm.AddGlobal(c.mod, bucketType, ".hashmap.bucket")
bucket.SetInitializer(bucketValue) bucket.SetInitializer(bucketValue)
bucket.SetLinkage(llvm.PrivateLinkage)
return bucket, keySize, valueSize, nil return bucket, keySize, valueSize, nil
} }