![Ian Lance Taylor](/assets/img/avatar_default.png)
Encode all external symbol names using only ASCII alphanumeric characters, underscore, and dot. Use a scheme that can be reliably demangled to a somewhat readable version as described in the long comment in names.cc. A minor cleanup discovered during this was that we were treating function types as different if one had a NULL parameters_ field and another has a non-NULL parameters_ field that has no parameters. This worked because we mangled them slightly differently. We now mangle them the same, so we treat them as equal, as we should anyhow. Reviewed-on: https://go-review.googlesource.com/89555 * go.go-torture/execute/names-1.go: New test. From-SVN: r257033
111 lines
2.0 KiB
C
111 lines
2.0 KiB
C
/* wait.c -- functions for getting wait status values.
|
|
|
|
Copyright 2011 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.
|
|
|
|
We use C code to extract the wait status so that we can easily be
|
|
OS-independent. */
|
|
|
|
#include <stdint.h>
|
|
#include <sys/wait.h>
|
|
|
|
#include "runtime.h"
|
|
|
|
#ifndef WCOREDUMP
|
|
#define WCOREDUMP(status) (((status) & 0200) != 0)
|
|
#endif
|
|
|
|
extern _Bool Exited (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.Exited");
|
|
|
|
_Bool
|
|
Exited (uint32_t *w)
|
|
{
|
|
return WIFEXITED (*w) != 0;
|
|
}
|
|
|
|
extern _Bool Signaled (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.Signaled");
|
|
|
|
_Bool
|
|
Signaled (uint32_t *w)
|
|
{
|
|
return WIFSIGNALED (*w) != 0;
|
|
}
|
|
|
|
extern _Bool Stopped (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.Stopped");
|
|
|
|
_Bool
|
|
Stopped (uint32_t *w)
|
|
{
|
|
return WIFSTOPPED (*w) != 0;
|
|
}
|
|
|
|
extern _Bool Continued (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.Continued");
|
|
|
|
_Bool
|
|
Continued (uint32_t *w)
|
|
{
|
|
return WIFCONTINUED (*w) != 0;
|
|
}
|
|
|
|
extern _Bool CoreDump (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.CoreDump");
|
|
|
|
_Bool
|
|
CoreDump (uint32_t *w)
|
|
{
|
|
return WCOREDUMP (*w) != 0;
|
|
}
|
|
|
|
extern int ExitStatus (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.ExitStatus");
|
|
|
|
int
|
|
ExitStatus (uint32_t *w)
|
|
{
|
|
if (!WIFEXITED (*w))
|
|
return -1;
|
|
return WEXITSTATUS (*w);
|
|
}
|
|
|
|
extern int Signal (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.Signal");
|
|
|
|
int
|
|
Signal (uint32_t *w)
|
|
{
|
|
if (!WIFSIGNALED (*w))
|
|
return -1;
|
|
return WTERMSIG (*w);
|
|
}
|
|
|
|
extern int StopSignal (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.StopSignal");
|
|
|
|
int
|
|
StopSignal (uint32_t *w)
|
|
{
|
|
if (!WIFSTOPPED (*w))
|
|
return -1;
|
|
return WSTOPSIG (*w);
|
|
}
|
|
|
|
extern int TrapCause (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.TrapCause");
|
|
|
|
int
|
|
TrapCause (uint32_t *w __attribute__ ((unused)))
|
|
{
|
|
#ifndef __linux__
|
|
return -1;
|
|
#else
|
|
if (!WIFSTOPPED (*w) || WSTOPSIG (*w) != SIGTRAP)
|
|
return -1;
|
|
return *w >> 16;
|
|
#endif
|
|
}
|