
gcc/: * gcc.c (default_compilers): Add entry for ".go". * common.opt: Add -static-libgo as a driver option. * doc/install.texi (Configuration): Mention libgo as an option for --enable-shared. Mention go as an option for --enable-languages. * doc/invoke.texi (Overall Options): Mention .go as a file name suffix. Mention go as a -x option. * doc/frontends.texi (G++ and GCC): Mention Go as a supported language. * doc/sourcebuild.texi (Top Level): Mention libgo. * doc/standards.texi (Standards): Add section on Go language. Move references for other languages into their own section. * doc/contrib.texi (Contributors): Mention that I contributed the Go frontend. gcc/testsuite/: * lib/go.exp: New file. * lib/go-dg.exp: New file. * lib/go-torture.exp: New file. * lib/target-supports.exp (check_compile): Match // Go. From-SVN: r167407
143 lines
2.4 KiB
Go
143 lines
2.4 KiB
Go
// Copyright 2009 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 proc
|
|
|
|
import (
|
|
"os"
|
|
"strconv"
|
|
"syscall"
|
|
)
|
|
|
|
type _386Regs struct {
|
|
syscall.PtraceRegs
|
|
setter func(*syscall.PtraceRegs) os.Error
|
|
}
|
|
|
|
var names = []string{
|
|
"eax",
|
|
"ebx",
|
|
"ecx",
|
|
"edx",
|
|
"esi",
|
|
"edi",
|
|
"ebp",
|
|
"esp",
|
|
"eip",
|
|
"eflags",
|
|
"cs",
|
|
"ss",
|
|
"ds",
|
|
"es",
|
|
"fs",
|
|
"gs",
|
|
}
|
|
|
|
func (r *_386Regs) PC() Word { return Word(r.Eip) }
|
|
|
|
func (r *_386Regs) SetPC(val Word) os.Error {
|
|
r.Eip = int32(val)
|
|
return r.setter(&r.PtraceRegs)
|
|
}
|
|
|
|
func (r *_386Regs) Link() Word {
|
|
// TODO(austin)
|
|
panic("No link register")
|
|
}
|
|
|
|
func (r *_386Regs) SetLink(val Word) os.Error { panic("No link register") }
|
|
|
|
func (r *_386Regs) SP() Word { return Word(r.Esp) }
|
|
|
|
func (r *_386Regs) SetSP(val Word) os.Error {
|
|
r.Esp = int32(val)
|
|
return r.setter(&r.PtraceRegs)
|
|
}
|
|
|
|
func (r *_386Regs) Names() []string { return names }
|
|
|
|
func (r *_386Regs) Get(i int) Word {
|
|
switch i {
|
|
case 0:
|
|
return Word(uint32(r.Eax))
|
|
case 1:
|
|
return Word(uint32(r.Ebx))
|
|
case 2:
|
|
return Word(uint32(r.Ecx))
|
|
case 3:
|
|
return Word(uint32(r.Edx))
|
|
case 4:
|
|
return Word(uint32(r.Esi))
|
|
case 5:
|
|
return Word(uint32(r.Edi))
|
|
case 6:
|
|
return Word(uint32(r.Ebp))
|
|
case 7:
|
|
return Word(uint32(r.Esp))
|
|
case 8:
|
|
return Word(uint32(r.Eip))
|
|
case 9:
|
|
return Word(uint32(r.Eflags))
|
|
case 10:
|
|
return Word(r.Xcs)
|
|
case 11:
|
|
return Word(r.Xss)
|
|
case 12:
|
|
return Word(r.Xds)
|
|
case 13:
|
|
return Word(r.Xes)
|
|
case 14:
|
|
return Word(r.Xfs)
|
|
case 15:
|
|
return Word(r.Xgs)
|
|
}
|
|
panic("invalid register index " + strconv.Itoa(i))
|
|
}
|
|
|
|
func (r *_386Regs) Set(i int, val Word) os.Error {
|
|
switch i {
|
|
case 0:
|
|
r.Eax = int32(val)
|
|
case 1:
|
|
r.Ebx = int32(val)
|
|
case 2:
|
|
r.Ecx = int32(val)
|
|
case 3:
|
|
r.Edx = int32(val)
|
|
case 4:
|
|
r.Esi = int32(val)
|
|
case 5:
|
|
r.Edi = int32(val)
|
|
case 6:
|
|
r.Ebp = int32(val)
|
|
case 7:
|
|
r.Esp = int32(val)
|
|
case 8:
|
|
r.Eip = int32(val)
|
|
case 9:
|
|
r.Eflags = int32(val)
|
|
case 10:
|
|
r.Xcs = int32(val)
|
|
case 11:
|
|
r.Xss = int32(val)
|
|
case 12:
|
|
r.Xds = int32(val)
|
|
case 13:
|
|
r.Xes = int32(val)
|
|
case 14:
|
|
r.Xfs = int32(val)
|
|
case 15:
|
|
r.Xgs = int32(val)
|
|
default:
|
|
panic("invalid register index " + strconv.Itoa(i))
|
|
}
|
|
return r.setter(&r.PtraceRegs)
|
|
}
|
|
|
|
func newRegs(regs *syscall.PtraceRegs, setter func(*syscall.PtraceRegs) os.Error) Regs {
|
|
res := _386Regs{}
|
|
res.PtraceRegs = *regs
|
|
res.setter = setter
|
|
return &res
|
|
}
|