Enable elimination of dead globals by marking them private
This eliminates most of the newly created dead globals.
Этот коммит содержится в:
родитель
5f28b07f75
коммит
f49ceddd73
1 изменённых файлов: 8 добавлений и 2 удалений
10
compiler.go
10
compiler.go
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче