mirror of
https://github.com/danog/gllvm.git
synced 2024-11-30 07:19:00 +01:00
Preparing to stress the race detector.
This commit is contained in:
parent
8e330f2e72
commit
64ececee96
117
shared/replay.go
Normal file
117
shared/replay.go
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
package shared
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
recording_env_var = "GLLVM_REPLAY_LOG"
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Assumming GLLVM_REPLAY_LOG is set, this records the compiler call out to the file indicated by the
|
||||||
|
* value of said environment variable. The format of the record is:
|
||||||
|
* <start of format>
|
||||||
|
* pwd
|
||||||
|
* compiler
|
||||||
|
* args[0]
|
||||||
|
* args[1]
|
||||||
|
* ...
|
||||||
|
* args[N]
|
||||||
|
*
|
||||||
|
* </start of format>
|
||||||
|
* The end being signalled by a blank line. This format make replaying somewaht trivial.
|
||||||
|
*/
|
||||||
|
func Record(args []string, compiler string) {
|
||||||
|
logfile := os.Getenv(recording_env_var)
|
||||||
|
if len(logfile) > 0 {
|
||||||
|
fp, err := os.OpenFile(logfile, os.O_WRONLY | os.O_APPEND | os.O_CREATE, os.ModePerm)
|
||||||
|
if err != nil { panic(err) }
|
||||||
|
defer fp.Close()
|
||||||
|
dir, err := os.Getwd()
|
||||||
|
if err != nil { panic(err) }
|
||||||
|
fp.WriteString(dir)
|
||||||
|
fp.WriteString("\n")
|
||||||
|
fp.WriteString(compiler)
|
||||||
|
fp.WriteString("\n")
|
||||||
|
for _, arg := range args {
|
||||||
|
fp.WriteString(arg)
|
||||||
|
fp.WriteString("\n")
|
||||||
|
}
|
||||||
|
fp.WriteString("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
type CompilerCall struct {
|
||||||
|
Pwd string
|
||||||
|
Name string
|
||||||
|
Args []string
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func readCompilerCall(scanner *bufio.Scanner) (call *CompilerCall) {
|
||||||
|
if scanner.Scan() {
|
||||||
|
//got one line, probably an entire call too ...
|
||||||
|
callp := new(CompilerCall) //pass in a local version later, save on mallocing.
|
||||||
|
line := scanner.Text()
|
||||||
|
if len(line) == 0 {
|
||||||
|
panic("empty CompilerCall.Pwd")
|
||||||
|
}
|
||||||
|
call.Pwd = line
|
||||||
|
if !scanner.Scan() {
|
||||||
|
panic("non-existant CompilerCall.Name")
|
||||||
|
}
|
||||||
|
line = scanner.Text()
|
||||||
|
if len(line) == 0 {
|
||||||
|
panic("empty CompilerCall.Name")
|
||||||
|
}
|
||||||
|
call.Name = line
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
line = scanner.Text()
|
||||||
|
if len(line) == 0 {
|
||||||
|
if len(call.Args) == 0 {
|
||||||
|
panic("empty CompilerCall.Args")
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
call.Args = append(call.Args, line)
|
||||||
|
}
|
||||||
|
call = callp
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
func Replay(path string) (ok bool) {
|
||||||
|
fp, err := os.OpenFile(path, os.O_RDONLY, os.ModePerm)
|
||||||
|
if err != nil { return }
|
||||||
|
defer fp.Close()
|
||||||
|
scanner := bufio.NewScanner(fp)
|
||||||
|
for {
|
||||||
|
callp := readCompilerCall(scanner)
|
||||||
|
if callp == nil { return }
|
||||||
|
ok = replayCall(callp)
|
||||||
|
if !ok { return }
|
||||||
|
}
|
||||||
|
ok = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
func replayCall(call *CompilerCall) bool {
|
||||||
|
err := os.Chdir(call.Pwd)
|
||||||
|
if err != nil { panic(err) }
|
||||||
|
exitCode := Compile(call.Args, call.Name)
|
||||||
|
if exitCode != 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user