// 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";
	"syscall";
)

// TODO(kaib): add support

type armRegs struct {
}

func (r *armRegs) PC() Word {
	return Word(0);
}

func (r *armRegs) SetPC(val Word) os.Error {
	return nil;
}

func (r * armRegs) Link() Word {
	return Word(0);
}

func (r* armRegs) SetLink(val Word) (os.Error) {
	return nil;
}

func (r* armRegs) SP() Word {
	return Word(0);
}

func (r* armRegs) SetSP(val Word) os.Error {
	return nil;
}

func (r* armRegs) Names() []string {
	return nil;
}

func (r* armRegs) Get(i int) Word {
	return Word(0);
}

func (r* armRegs) Set(i int, val Word) os.Error {
	return nil;
}

func newRegs(regs *syscall.PtraceRegs, setter func (*syscall.PtraceRegs) os.Error) Regs {
	res := armRegs{};
	return &res;
}
