154737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata/*
254737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * This file is part of ltrace.
3693dfad9c1b121cf079a3082866daa2225df1797Petr Machata * Copyright (C) 2010,2012,2013 Petr Machata, Red Hat Inc.
454737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * Copyright (C) 2011 Andreas Schwab
554737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * Copyright (C) 2002,2004,2008,2009 Juan Cespedes
654737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * Copyright (C) 2008 Luis Machado, IBM Corporation
754737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * Copyright (C) 2006 Ian Wienand
854737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata *
954737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * This program is free software; you can redistribute it and/or
1054737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * modify it under the terms of the GNU General Public License as
1154737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * published by the Free Software Foundation; either version 2 of the
1254737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * License, or (at your option) any later version.
1354737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata *
1454737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * This program is distributed in the hope that it will be useful, but
1554737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of
1654737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1754737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * General Public License for more details.
1854737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata *
1954737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * You should have received a copy of the GNU General Public License
2054737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * along with this program; if not, write to the Free Software
2154737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
2254737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * 02110-1301 USA
2354737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata */
2454737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata
25f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#include "config.h"
26f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes
27d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata#include <assert.h>
289a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#include <elf.h>
2955c5feba87bbb8d9190a71ec5ddc38380a384bf7Luis Machado#include <errno.h>
30d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata#include <signal.h>
31fac99be277bd370852faadc7fdd8754e2efa26f6Petr Machata#include <string.h>
32c1990eb670b2786ffabe712fdb9bf3512dd1501cGustavo Zacarias#include <sys/types.h>
33c1990eb670b2786ffabe712fdb9bf3512dd1501cGustavo Zacarias#include <sys/wait.h>
34f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes
35d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata#include "backend.h"
36d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata#include "breakpoint.h"
37f728123bd75a65a6a1536e198c3c30719e494e71Juan Cespedes#include "common.h"
38305945b2523ea87907952eefd7300cfb9f1a0235Petr Machata#include "insn.h"
39d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata#include "proc.h"
40fac99be277bd370852faadc7fdd8754e2efa26f6Petr Machata#include "ptrace.h"
41000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#include "type.h"
42f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes
43f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#if (!defined(PTRACE_PEEKUSER) && defined(PTRACE_PEEKUSR))
44f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes# define PTRACE_PEEKUSER PTRACE_PEEKUSR
45f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#endif
46f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes
47f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#if (!defined(PTRACE_POKEUSER) && defined(PTRACE_POKEUSR))
48f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes# define PTRACE_POKEUSER PTRACE_POKEUSR
49f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#endif
50f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes
51f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesvoid
52929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataget_arch_dep(struct process *proc)
53929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata{
549a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#ifdef __powerpc64__
55d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata	proc->mask_32bit = (proc->e_machine == EM_PPC);
569a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#endif
575c3fe0697b202cc7d95e90459de0fb312b297b27Juan Cespedes}
585c3fe0697b202cc7d95e90459de0fb312b297b27Juan Cespedes
59f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#define SYSCALL_INSN   0x44000002
6055c5feba87bbb8d9190a71ec5ddc38380a384bf7Luis Machado
61fac99be277bd370852faadc7fdd8754e2efa26f6Petr Machata/* Returns 1 if syscall, 2 if sysret, 0 otherwise. */
62f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesint
63929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatasyscall_p(struct process *proc, int status, int *sysnum)
64929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata{
652d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand	if (WIFSTOPPED(status)
662d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand	    && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
679a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		long pc = (long)get_instruction_pointer(proc);
682d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand		int insn =
692d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand		    (int)ptrace(PTRACE_PEEKTEXT, proc->pid, pc - sizeof(long),
702d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand				0);
71f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes
72f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes		if (insn == SYSCALL_INSN) {
732d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand			*sysnum =
742d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand			    (int)ptrace(PTRACE_PEEKUSER, proc->pid,
752d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand					sizeof(long) * PT_R0, 0);
763e94cbf0d388a5b5b49f8dbc60f4b24900de89aeJuan Cespedes			if (proc->callstack_depth > 0 &&
773e94cbf0d388a5b5b49f8dbc60f4b24900de89aeJuan Cespedes					proc->callstack[proc->callstack_depth - 1].is_syscall &&
783e94cbf0d388a5b5b49f8dbc60f4b24900de89aeJuan Cespedes					proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
79f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes				return 2;
80f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes			}
815bfb061c4c7cfac6e1882a586cf36c849d95fceaJuan Cespedes			return 1;
82f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes		}
83f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes	}
84f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes	return 0;
85f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes}
86f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes
87a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata/* The atomic skip code is mostly taken from GDB.  */
88a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata
89693dfad9c1b121cf079a3082866daa2225df1797Petr Machataenum sw_singlestep_status
90693dfad9c1b121cf079a3082866daa2225df1797Petr Machataarch_sw_singlestep(struct process *proc, struct breakpoint *sbp,
91693dfad9c1b121cf079a3082866daa2225df1797Petr Machata		   int (*add_cb)(arch_addr_t, struct sw_singlestep_data *),
92693dfad9c1b121cf079a3082866daa2225df1797Petr Machata		   struct sw_singlestep_data *add_cb_data)
93a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata{
94bac2da505ee174b7fb984b975c5938f88f0dbab2Petr Machata	arch_addr_t ip = get_instruction_pointer(proc);
9542748aca73359c83881556c8b28f6cda4f1c143bPetr Machata	struct breakpoint *other = address2bpstruct(proc->leader, ip);
9642748aca73359c83881556c8b28f6cda4f1c143bPetr Machata
97693dfad9c1b121cf079a3082866daa2225df1797Petr Machata	debug(1, "arch_sw_singlestep pid=%d addr=%p %s(%p)",
9842748aca73359c83881556c8b28f6cda4f1c143bPetr Machata	      proc->pid, ip, breakpoint_name(sbp), sbp->addr);
99a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata
100a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	/* If the original instruction was lwarx/ldarx, we can't
101a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	 * single-step over it, instead we have to execute the whole
102a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	 * atomic block at once.  */
103a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	union {
104a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		uint32_t insn;
10542748aca73359c83881556c8b28f6cda4f1c143bPetr Machata		char buf[BREAKPOINT_LENGTH];
106a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	} u;
10742748aca73359c83881556c8b28f6cda4f1c143bPetr Machata	if (other != NULL) {
10842748aca73359c83881556c8b28f6cda4f1c143bPetr Machata		memcpy(u.buf, sbp->orig_value, BREAKPOINT_LENGTH);
109653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata	} else if (proc_read_32(proc, ip, &u.insn) < 0) {
11042748aca73359c83881556c8b28f6cda4f1c143bPetr Machata		fprintf(stderr, "couldn't read instruction at IP %p\n", ip);
11142748aca73359c83881556c8b28f6cda4f1c143bPetr Machata		/* Do the normal singlestep.  */
112693dfad9c1b121cf079a3082866daa2225df1797Petr Machata		return SWS_HW;
11342748aca73359c83881556c8b28f6cda4f1c143bPetr Machata	}
114a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata
115a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	if ((u.insn & LWARX_MASK) != LWARX_INSTRUCTION
116a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	    && (u.insn & LWARX_MASK) != LDARX_INSTRUCTION)
117693dfad9c1b121cf079a3082866daa2225df1797Petr Machata		return SWS_HW;
118a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata
11942748aca73359c83881556c8b28f6cda4f1c143bPetr Machata	debug(1, "singlestep over atomic block at %p", ip);
12042748aca73359c83881556c8b28f6cda4f1c143bPetr Machata
121a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	int insn_count;
122bac2da505ee174b7fb984b975c5938f88f0dbab2Petr Machata	arch_addr_t addr = ip;
123a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	for (insn_count = 0; ; ++insn_count) {
124a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		addr += 4;
125a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		unsigned long l = ptrace(PTRACE_PEEKTEXT, proc->pid, addr, 0);
126a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		if (l == (unsigned long)-1 && errno)
127693dfad9c1b121cf079a3082866daa2225df1797Petr Machata			return SWS_FAIL;
128a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		uint32_t insn;
129a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata#ifdef __powerpc64__
130a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		insn = l >> 32;
131a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata#else
132a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		insn = l;
133a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata#endif
134a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata
13542748aca73359c83881556c8b28f6cda4f1c143bPetr Machata		/* If a conditional branch is found, put a breakpoint
13642748aca73359c83881556c8b28f6cda4f1c143bPetr Machata		 * in its destination address.  */
13742748aca73359c83881556c8b28f6cda4f1c143bPetr Machata		if ((insn & BRANCH_MASK) == BC_INSN) {
138305945b2523ea87907952eefd7300cfb9f1a0235Petr Machata			arch_addr_t branch_addr = ppc_branch_dest(addr, insn);
13942748aca73359c83881556c8b28f6cda4f1c143bPetr Machata			debug(1, "pid=%d, branch in atomic block from %p to %p",
14042748aca73359c83881556c8b28f6cda4f1c143bPetr Machata			      proc->pid, addr, branch_addr);
14142748aca73359c83881556c8b28f6cda4f1c143bPetr Machata			if (add_cb(branch_addr, add_cb_data) < 0)
142693dfad9c1b121cf079a3082866daa2225df1797Petr Machata				return SWS_FAIL;
143a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		}
144a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata
14542748aca73359c83881556c8b28f6cda4f1c143bPetr Machata		/* Assume that the atomic sequence ends with a
14642748aca73359c83881556c8b28f6cda4f1c143bPetr Machata		 * stwcx/stdcx instruction.  */
147a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		if ((insn & STWCX_MASK) == STWCX_INSTRUCTION
148a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		    || (insn & STWCX_MASK) == STDCX_INSTRUCTION) {
14942748aca73359c83881556c8b28f6cda4f1c143bPetr Machata			debug(1, "pid=%d, found end of atomic block %p at %p",
15042748aca73359c83881556c8b28f6cda4f1c143bPetr Machata			      proc->pid, ip, addr);
151a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata			break;
152a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		}
153a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata
154a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		/* Arbitrary cut-off.  If we didn't find the
155a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		 * terminating instruction by now, just give up.  */
156a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		if (insn_count > 16) {
15742748aca73359c83881556c8b28f6cda4f1c143bPetr Machata			fprintf(stderr, "[%d] couldn't find end of atomic block"
15842748aca73359c83881556c8b28f6cda4f1c143bPetr Machata				" at %p\n", proc->pid, ip);
159693dfad9c1b121cf079a3082866daa2225df1797Petr Machata			return SWS_FAIL;
160a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata		}
161a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	}
162a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata
163a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	/* Put the breakpoint to the next instruction.  */
164a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	addr += 4;
165a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	if (add_cb(addr, add_cb_data) < 0)
166693dfad9c1b121cf079a3082866daa2225df1797Petr Machata		return SWS_FAIL;
167a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata
168a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	debug(1, "PTRACE_CONT");
169a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata	ptrace(PTRACE_CONT, proc->pid, 0, 0);
170693dfad9c1b121cf079a3082866daa2225df1797Petr Machata	return SWS_OK;
171a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata}
172af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
173af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machatasize_t
174929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataarch_type_sizeof(struct process *proc, struct arg_type_info *info)
175af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata{
176af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	if (proc == NULL)
177af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return (size_t)-2;
178af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
179af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	switch (info->type) {
180af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_VOID:
181af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return 0;
182af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
183af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_CHAR:
184af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return 1;
185af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
186af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_SHORT:
187af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_USHORT:
188af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return 2;
189af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
190af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_INT:
191af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_UINT:
192af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return 4;
193af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
194af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_LONG:
195af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_ULONG:
196af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_POINTER:
197af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return proc->e_machine == EM_PPC64 ? 8 : 4;
198af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
199af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_FLOAT:
200af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return 4;
201af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_DOUBLE:
202af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return 8;
203af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
204af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_ARRAY:
205af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_STRUCT:
206af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		/* Use default value.  */
207af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return (size_t)-2;
2085b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias
2095b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias	default:
2105b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias		assert(info->type != info->type);
2115b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias		abort();
2125b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias		break;
213af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	}
214af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata}
215af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
216af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machatasize_t
217929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataarch_type_alignof(struct process *proc, struct arg_type_info *info)
218af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata{
219af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	if (proc == NULL)
220af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return (size_t)-2;
221af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
222af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	switch (info->type) {
2235b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias	default:
2245b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias		assert(info->type != info->type);
2255b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias		abort();
226af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		break;
227af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
228af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_CHAR:
229af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_SHORT:
230af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_USHORT:
231af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_INT:
232af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_UINT:
233af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_LONG:
234af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_ULONG:
235af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_POINTER:
236af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_FLOAT:
237af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_DOUBLE:
238af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		/* On both PPC and PPC64, fundamental types have the
239af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		 * same alignment as size.  */
240af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return arch_type_sizeof(proc, info);
241af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata
242af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_ARRAY:
243af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	case ARGTYPE_STRUCT:
244af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		/* Use default value.  */
245af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata		return (size_t)-2;
246af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata	}
247af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata}
248