Merge "Update documentation to work with gitiles."
diff --git a/libc/Android.bp b/libc/Android.bp
index c5a513c..5c79bb7 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -70,16 +70,6 @@
cppflags: [],
include_dirs: ["external/jemalloc/include"],
- arch: {
- // b/25291096, Clang/llvm compiled libc.so for mips/mips64 failed to boot.
- mips: {
- clang: false,
- },
- mips64: {
- clang: false,
- },
- },
-
stl: "none",
system_shared_libs: [],
sanitize: {
@@ -195,7 +185,6 @@
cflags: [
"-DANDROID_CHANGES",
"-DINET6",
- "-fvisibility=hidden",
"-Wno-unused-parameter",
"-include netbsd-compat.h",
],
@@ -1306,6 +1295,7 @@
"bionic/lockf.cpp",
"bionic/lstat.cpp",
"bionic/malloc_info.cpp",
+ "bionic/mblen.cpp",
"bionic/mbrtoc16.cpp",
"bionic/mbrtoc32.cpp",
"bionic/mbstate.cpp",
diff --git a/libc/Android.mk b/libc/Android.mk
index 02682af..a8581ac 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -133,6 +133,7 @@
bionic/lockf.cpp \
bionic/lstat.cpp \
bionic/malloc_info.cpp \
+ bionic/mblen.cpp \
bionic/mbrtoc16.cpp \
bionic/mbrtoc32.cpp \
bionic/mbstate.cpp \
@@ -589,11 +590,6 @@
use_clang := true
-# b/25291096, Clang/llvm compiled libc.so for mips/mips64 failed to boot.
-ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),mips mips64))
- use_clang := false
-endif
-
# Try to catch typical 32-bit assumptions that break with 64-bit pointers.
libc_common_cflags += \
-Werror=pointer-to-int-cast \
@@ -755,7 +751,6 @@
$(libc_common_cflags) \
-DANDROID_CHANGES \
-DINET6 \
- -fvisibility=hidden \
-Wno-unused-parameter \
-include netbsd-compat.h \
diff --git a/libc/arch-arm/syscalls/___clock_nanosleep.S b/libc/arch-arm/syscalls/___clock_nanosleep.S
index 31420bb..ef8f065 100644
--- a/libc/arch-arm/syscalls/___clock_nanosleep.S
+++ b/libc/arch-arm/syscalls/___clock_nanosleep.S
@@ -4,9 +4,11 @@
ENTRY(___clock_nanosleep)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_clock_nanosleep
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___close.S b/libc/arch-arm/syscalls/___close.S
index db8a230..05d3352 100644
--- a/libc/arch-arm/syscalls/___close.S
+++ b/libc/arch-arm/syscalls/___close.S
@@ -4,9 +4,11 @@
ENTRY(___close)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_close
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___faccessat.S b/libc/arch-arm/syscalls/___faccessat.S
index 1d09cf7..8bb4cf8 100644
--- a/libc/arch-arm/syscalls/___faccessat.S
+++ b/libc/arch-arm/syscalls/___faccessat.S
@@ -4,9 +4,11 @@
ENTRY(___faccessat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_faccessat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___fchmod.S b/libc/arch-arm/syscalls/___fchmod.S
index c6da4f8..b2312cb 100644
--- a/libc/arch-arm/syscalls/___fchmod.S
+++ b/libc/arch-arm/syscalls/___fchmod.S
@@ -4,9 +4,11 @@
ENTRY(___fchmod)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fchmod
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___fchmodat.S b/libc/arch-arm/syscalls/___fchmodat.S
index 91bbda5..4773610 100644
--- a/libc/arch-arm/syscalls/___fchmodat.S
+++ b/libc/arch-arm/syscalls/___fchmodat.S
@@ -4,9 +4,11 @@
ENTRY(___fchmodat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fchmodat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___fgetxattr.S b/libc/arch-arm/syscalls/___fgetxattr.S
index e776cd6..25be039 100644
--- a/libc/arch-arm/syscalls/___fgetxattr.S
+++ b/libc/arch-arm/syscalls/___fgetxattr.S
@@ -4,9 +4,11 @@
ENTRY(___fgetxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fgetxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___flistxattr.S b/libc/arch-arm/syscalls/___flistxattr.S
index 8ae8b7e..904e4ca 100644
--- a/libc/arch-arm/syscalls/___flistxattr.S
+++ b/libc/arch-arm/syscalls/___flistxattr.S
@@ -4,9 +4,11 @@
ENTRY(___flistxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_flistxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___rt_sigqueueinfo.S b/libc/arch-arm/syscalls/___rt_sigqueueinfo.S
index 25b0d57..1367e56 100644
--- a/libc/arch-arm/syscalls/___rt_sigqueueinfo.S
+++ b/libc/arch-arm/syscalls/___rt_sigqueueinfo.S
@@ -4,9 +4,11 @@
ENTRY(___rt_sigqueueinfo)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigqueueinfo
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__accept4.S b/libc/arch-arm/syscalls/__accept4.S
index dca5699..42aa47c 100644
--- a/libc/arch-arm/syscalls/__accept4.S
+++ b/libc/arch-arm/syscalls/__accept4.S
@@ -4,9 +4,11 @@
ENTRY(__accept4)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_accept4
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__brk.S b/libc/arch-arm/syscalls/__brk.S
index be304da..246924c 100644
--- a/libc/arch-arm/syscalls/__brk.S
+++ b/libc/arch-arm/syscalls/__brk.S
@@ -4,9 +4,11 @@
ENTRY(__brk)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_brk
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__connect.S b/libc/arch-arm/syscalls/__connect.S
index a2a997e..873b14d 100644
--- a/libc/arch-arm/syscalls/__connect.S
+++ b/libc/arch-arm/syscalls/__connect.S
@@ -4,9 +4,11 @@
ENTRY(__connect)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_connect
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__exit.S b/libc/arch-arm/syscalls/__exit.S
index 6ebd5b3..4ed31b0 100644
--- a/libc/arch-arm/syscalls/__exit.S
+++ b/libc/arch-arm/syscalls/__exit.S
@@ -4,9 +4,11 @@
ENTRY(__exit)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_exit
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__fcntl64.S b/libc/arch-arm/syscalls/__fcntl64.S
index 229c5c6..0afdbee 100644
--- a/libc/arch-arm/syscalls/__fcntl64.S
+++ b/libc/arch-arm/syscalls/__fcntl64.S
@@ -4,9 +4,11 @@
ENTRY(__fcntl64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fcntl64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__fstatfs64.S b/libc/arch-arm/syscalls/__fstatfs64.S
index 9c0c439..9117313 100644
--- a/libc/arch-arm/syscalls/__fstatfs64.S
+++ b/libc/arch-arm/syscalls/__fstatfs64.S
@@ -4,9 +4,11 @@
ENTRY(__fstatfs64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fstatfs64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__getcpu.S b/libc/arch-arm/syscalls/__getcpu.S
index d523d8e..430acb3 100644
--- a/libc/arch-arm/syscalls/__getcpu.S
+++ b/libc/arch-arm/syscalls/__getcpu.S
@@ -4,9 +4,11 @@
ENTRY(__getcpu)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getcpu
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__getcwd.S b/libc/arch-arm/syscalls/__getcwd.S
index 4ff6667..53000b8 100644
--- a/libc/arch-arm/syscalls/__getcwd.S
+++ b/libc/arch-arm/syscalls/__getcwd.S
@@ -4,9 +4,11 @@
ENTRY(__getcwd)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getcwd
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__getdents64.S b/libc/arch-arm/syscalls/__getdents64.S
index dac3bfc..0ea61b8 100644
--- a/libc/arch-arm/syscalls/__getdents64.S
+++ b/libc/arch-arm/syscalls/__getdents64.S
@@ -4,9 +4,11 @@
ENTRY(__getdents64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getdents64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__getpid.S b/libc/arch-arm/syscalls/__getpid.S
index dbb192e..b555385 100644
--- a/libc/arch-arm/syscalls/__getpid.S
+++ b/libc/arch-arm/syscalls/__getpid.S
@@ -4,9 +4,11 @@
ENTRY(__getpid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getpid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__getpriority.S b/libc/arch-arm/syscalls/__getpriority.S
index e637d6f..34f4bea 100644
--- a/libc/arch-arm/syscalls/__getpriority.S
+++ b/libc/arch-arm/syscalls/__getpriority.S
@@ -4,9 +4,11 @@
ENTRY(__getpriority)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getpriority
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__ioctl.S b/libc/arch-arm/syscalls/__ioctl.S
index fcd1157..5871e58 100644
--- a/libc/arch-arm/syscalls/__ioctl.S
+++ b/libc/arch-arm/syscalls/__ioctl.S
@@ -4,9 +4,11 @@
ENTRY(__ioctl)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_ioctl
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__openat.S b/libc/arch-arm/syscalls/__openat.S
index 9b774db..403d9b5 100644
--- a/libc/arch-arm/syscalls/__openat.S
+++ b/libc/arch-arm/syscalls/__openat.S
@@ -4,9 +4,11 @@
ENTRY(__openat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_openat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__ptrace.S b/libc/arch-arm/syscalls/__ptrace.S
index 975ab0f..8ad554d 100644
--- a/libc/arch-arm/syscalls/__ptrace.S
+++ b/libc/arch-arm/syscalls/__ptrace.S
@@ -4,9 +4,11 @@
ENTRY(__ptrace)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_ptrace
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__reboot.S b/libc/arch-arm/syscalls/__reboot.S
index 03f8c89..15ca814 100644
--- a/libc/arch-arm/syscalls/__reboot.S
+++ b/libc/arch-arm/syscalls/__reboot.S
@@ -4,9 +4,11 @@
ENTRY(__reboot)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_reboot
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__rt_sigaction.S b/libc/arch-arm/syscalls/__rt_sigaction.S
index 2c21012..21d9977 100644
--- a/libc/arch-arm/syscalls/__rt_sigaction.S
+++ b/libc/arch-arm/syscalls/__rt_sigaction.S
@@ -4,9 +4,11 @@
ENTRY(__rt_sigaction)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigaction
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__rt_sigpending.S b/libc/arch-arm/syscalls/__rt_sigpending.S
index 6a32e50..b726b85 100644
--- a/libc/arch-arm/syscalls/__rt_sigpending.S
+++ b/libc/arch-arm/syscalls/__rt_sigpending.S
@@ -4,9 +4,11 @@
ENTRY(__rt_sigpending)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigpending
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__rt_sigprocmask.S b/libc/arch-arm/syscalls/__rt_sigprocmask.S
index 136dc79..11b326f 100644
--- a/libc/arch-arm/syscalls/__rt_sigprocmask.S
+++ b/libc/arch-arm/syscalls/__rt_sigprocmask.S
@@ -4,9 +4,11 @@
ENTRY(__rt_sigprocmask)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigprocmask
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__rt_sigsuspend.S b/libc/arch-arm/syscalls/__rt_sigsuspend.S
index 2cef4a4..5d06418 100644
--- a/libc/arch-arm/syscalls/__rt_sigsuspend.S
+++ b/libc/arch-arm/syscalls/__rt_sigsuspend.S
@@ -4,9 +4,11 @@
ENTRY(__rt_sigsuspend)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigsuspend
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__rt_sigtimedwait.S b/libc/arch-arm/syscalls/__rt_sigtimedwait.S
index cb43ad1..dc7c3e7 100644
--- a/libc/arch-arm/syscalls/__rt_sigtimedwait.S
+++ b/libc/arch-arm/syscalls/__rt_sigtimedwait.S
@@ -4,9 +4,11 @@
ENTRY(__rt_sigtimedwait)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigtimedwait
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__sched_getaffinity.S b/libc/arch-arm/syscalls/__sched_getaffinity.S
index 6613ea5..21f8330 100644
--- a/libc/arch-arm/syscalls/__sched_getaffinity.S
+++ b/libc/arch-arm/syscalls/__sched_getaffinity.S
@@ -4,9 +4,11 @@
ENTRY(__sched_getaffinity)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_getaffinity
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__set_tid_address.S b/libc/arch-arm/syscalls/__set_tid_address.S
index d3558f5..79dfd7f 100644
--- a/libc/arch-arm/syscalls/__set_tid_address.S
+++ b/libc/arch-arm/syscalls/__set_tid_address.S
@@ -4,9 +4,11 @@
ENTRY(__set_tid_address)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_set_tid_address
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__set_tls.S b/libc/arch-arm/syscalls/__set_tls.S
index 4d5d963..a9a4b9a 100644
--- a/libc/arch-arm/syscalls/__set_tls.S
+++ b/libc/arch-arm/syscalls/__set_tls.S
@@ -4,9 +4,11 @@
ENTRY(__set_tls)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__ARM_NR_set_tls
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__sigaction.S b/libc/arch-arm/syscalls/__sigaction.S
index 600593d..8f3f143 100644
--- a/libc/arch-arm/syscalls/__sigaction.S
+++ b/libc/arch-arm/syscalls/__sigaction.S
@@ -4,9 +4,11 @@
ENTRY(__sigaction)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sigaction
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__signalfd4.S b/libc/arch-arm/syscalls/__signalfd4.S
index 630a71f..51a27c8 100644
--- a/libc/arch-arm/syscalls/__signalfd4.S
+++ b/libc/arch-arm/syscalls/__signalfd4.S
@@ -4,9 +4,11 @@
ENTRY(__signalfd4)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_signalfd4
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__socket.S b/libc/arch-arm/syscalls/__socket.S
index fffe0cc..c50cd6f 100644
--- a/libc/arch-arm/syscalls/__socket.S
+++ b/libc/arch-arm/syscalls/__socket.S
@@ -4,9 +4,11 @@
ENTRY(__socket)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_socket
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__statfs64.S b/libc/arch-arm/syscalls/__statfs64.S
index ec43218..320b0ee 100644
--- a/libc/arch-arm/syscalls/__statfs64.S
+++ b/libc/arch-arm/syscalls/__statfs64.S
@@ -4,9 +4,11 @@
ENTRY(__statfs64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_statfs64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__timer_create.S b/libc/arch-arm/syscalls/__timer_create.S
index 2e4c634..fd7567b 100644
--- a/libc/arch-arm/syscalls/__timer_create.S
+++ b/libc/arch-arm/syscalls/__timer_create.S
@@ -4,9 +4,11 @@
ENTRY(__timer_create)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timer_create
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__timer_delete.S b/libc/arch-arm/syscalls/__timer_delete.S
index 237024c..6761abb 100644
--- a/libc/arch-arm/syscalls/__timer_delete.S
+++ b/libc/arch-arm/syscalls/__timer_delete.S
@@ -4,9 +4,11 @@
ENTRY(__timer_delete)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timer_delete
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__timer_getoverrun.S b/libc/arch-arm/syscalls/__timer_getoverrun.S
index f29d5b3..a925d83 100644
--- a/libc/arch-arm/syscalls/__timer_getoverrun.S
+++ b/libc/arch-arm/syscalls/__timer_getoverrun.S
@@ -4,9 +4,11 @@
ENTRY(__timer_getoverrun)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timer_getoverrun
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__timer_gettime.S b/libc/arch-arm/syscalls/__timer_gettime.S
index e6dc2ed..c0da770 100644
--- a/libc/arch-arm/syscalls/__timer_gettime.S
+++ b/libc/arch-arm/syscalls/__timer_gettime.S
@@ -4,9 +4,11 @@
ENTRY(__timer_gettime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timer_gettime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__timer_settime.S b/libc/arch-arm/syscalls/__timer_settime.S
index 4aea279..de4e7e6 100644
--- a/libc/arch-arm/syscalls/__timer_settime.S
+++ b/libc/arch-arm/syscalls/__timer_settime.S
@@ -4,9 +4,11 @@
ENTRY(__timer_settime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timer_settime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/_exit.S b/libc/arch-arm/syscalls/_exit.S
index 77da743..1c3d174 100644
--- a/libc/arch-arm/syscalls/_exit.S
+++ b/libc/arch-arm/syscalls/_exit.S
@@ -4,9 +4,11 @@
ENTRY(_exit)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_exit_group
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/acct.S b/libc/arch-arm/syscalls/acct.S
index dbc5d58..cdf1099 100644
--- a/libc/arch-arm/syscalls/acct.S
+++ b/libc/arch-arm/syscalls/acct.S
@@ -4,9 +4,11 @@
ENTRY(acct)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_acct
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/adjtimex.S b/libc/arch-arm/syscalls/adjtimex.S
index 614036e..6ebae7e 100644
--- a/libc/arch-arm/syscalls/adjtimex.S
+++ b/libc/arch-arm/syscalls/adjtimex.S
@@ -4,9 +4,11 @@
ENTRY(adjtimex)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_adjtimex
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/bind.S b/libc/arch-arm/syscalls/bind.S
index c901417..af518d8 100644
--- a/libc/arch-arm/syscalls/bind.S
+++ b/libc/arch-arm/syscalls/bind.S
@@ -4,9 +4,11 @@
ENTRY(bind)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_bind
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/cacheflush.S b/libc/arch-arm/syscalls/cacheflush.S
index 76f4623..752749a 100644
--- a/libc/arch-arm/syscalls/cacheflush.S
+++ b/libc/arch-arm/syscalls/cacheflush.S
@@ -4,9 +4,11 @@
ENTRY(cacheflush)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__ARM_NR_cacheflush
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/capget.S b/libc/arch-arm/syscalls/capget.S
index 59a5a3c..9be110b 100644
--- a/libc/arch-arm/syscalls/capget.S
+++ b/libc/arch-arm/syscalls/capget.S
@@ -4,9 +4,11 @@
ENTRY(capget)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_capget
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/capset.S b/libc/arch-arm/syscalls/capset.S
index af284ab..0bd5009 100644
--- a/libc/arch-arm/syscalls/capset.S
+++ b/libc/arch-arm/syscalls/capset.S
@@ -4,9 +4,11 @@
ENTRY(capset)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_capset
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/chdir.S b/libc/arch-arm/syscalls/chdir.S
index 25f27ba..c75f5e2 100644
--- a/libc/arch-arm/syscalls/chdir.S
+++ b/libc/arch-arm/syscalls/chdir.S
@@ -4,9 +4,11 @@
ENTRY(chdir)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_chdir
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/chroot.S b/libc/arch-arm/syscalls/chroot.S
index 6f829a6..d197d42 100644
--- a/libc/arch-arm/syscalls/chroot.S
+++ b/libc/arch-arm/syscalls/chroot.S
@@ -4,9 +4,11 @@
ENTRY(chroot)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_chroot
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/clock_adjtime.S b/libc/arch-arm/syscalls/clock_adjtime.S
index fa778e1..e59a240 100644
--- a/libc/arch-arm/syscalls/clock_adjtime.S
+++ b/libc/arch-arm/syscalls/clock_adjtime.S
@@ -4,9 +4,11 @@
ENTRY(clock_adjtime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_clock_adjtime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/clock_getres.S b/libc/arch-arm/syscalls/clock_getres.S
index 48fa07c..e101127 100644
--- a/libc/arch-arm/syscalls/clock_getres.S
+++ b/libc/arch-arm/syscalls/clock_getres.S
@@ -4,9 +4,11 @@
ENTRY(clock_getres)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_clock_getres
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/clock_gettime.S b/libc/arch-arm/syscalls/clock_gettime.S
index 317481d..61a95dd 100644
--- a/libc/arch-arm/syscalls/clock_gettime.S
+++ b/libc/arch-arm/syscalls/clock_gettime.S
@@ -4,9 +4,11 @@
ENTRY(clock_gettime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_clock_gettime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/clock_settime.S b/libc/arch-arm/syscalls/clock_settime.S
index bf54702..f00a072 100644
--- a/libc/arch-arm/syscalls/clock_settime.S
+++ b/libc/arch-arm/syscalls/clock_settime.S
@@ -4,9 +4,11 @@
ENTRY(clock_settime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_clock_settime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/delete_module.S b/libc/arch-arm/syscalls/delete_module.S
index 57580c9..80dd0f5 100644
--- a/libc/arch-arm/syscalls/delete_module.S
+++ b/libc/arch-arm/syscalls/delete_module.S
@@ -4,9 +4,11 @@
ENTRY(delete_module)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_delete_module
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/dup.S b/libc/arch-arm/syscalls/dup.S
index 2cd69d7..0d06bdc 100644
--- a/libc/arch-arm/syscalls/dup.S
+++ b/libc/arch-arm/syscalls/dup.S
@@ -4,9 +4,11 @@
ENTRY(dup)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_dup
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/dup3.S b/libc/arch-arm/syscalls/dup3.S
index 4613d63..7dea858 100644
--- a/libc/arch-arm/syscalls/dup3.S
+++ b/libc/arch-arm/syscalls/dup3.S
@@ -4,9 +4,11 @@
ENTRY(dup3)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_dup3
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/epoll_create1.S b/libc/arch-arm/syscalls/epoll_create1.S
index 108c24f..8b413d9 100644
--- a/libc/arch-arm/syscalls/epoll_create1.S
+++ b/libc/arch-arm/syscalls/epoll_create1.S
@@ -4,9 +4,11 @@
ENTRY(epoll_create1)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_epoll_create1
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/epoll_ctl.S b/libc/arch-arm/syscalls/epoll_ctl.S
index 473af6a..807dd69 100644
--- a/libc/arch-arm/syscalls/epoll_ctl.S
+++ b/libc/arch-arm/syscalls/epoll_ctl.S
@@ -4,9 +4,11 @@
ENTRY(epoll_ctl)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_epoll_ctl
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/eventfd.S b/libc/arch-arm/syscalls/eventfd.S
index ca6bcee..51f4a49 100644
--- a/libc/arch-arm/syscalls/eventfd.S
+++ b/libc/arch-arm/syscalls/eventfd.S
@@ -4,9 +4,11 @@
ENTRY(eventfd)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_eventfd2
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/execve.S b/libc/arch-arm/syscalls/execve.S
index 3eca810..1b72f0e 100644
--- a/libc/arch-arm/syscalls/execve.S
+++ b/libc/arch-arm/syscalls/execve.S
@@ -4,9 +4,11 @@
ENTRY(execve)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_execve
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fchdir.S b/libc/arch-arm/syscalls/fchdir.S
index 705ad32..dca18c4 100644
--- a/libc/arch-arm/syscalls/fchdir.S
+++ b/libc/arch-arm/syscalls/fchdir.S
@@ -4,9 +4,11 @@
ENTRY(fchdir)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fchdir
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fchown.S b/libc/arch-arm/syscalls/fchown.S
index 45ad9bf..51ee60c 100644
--- a/libc/arch-arm/syscalls/fchown.S
+++ b/libc/arch-arm/syscalls/fchown.S
@@ -4,9 +4,11 @@
ENTRY(fchown)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fchown32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fdatasync.S b/libc/arch-arm/syscalls/fdatasync.S
index 7fefd22..f97adc6 100644
--- a/libc/arch-arm/syscalls/fdatasync.S
+++ b/libc/arch-arm/syscalls/fdatasync.S
@@ -4,9 +4,11 @@
ENTRY(fdatasync)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fdatasync
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/flock.S b/libc/arch-arm/syscalls/flock.S
index c946fe9..e2874f6 100644
--- a/libc/arch-arm/syscalls/flock.S
+++ b/libc/arch-arm/syscalls/flock.S
@@ -4,9 +4,11 @@
ENTRY(flock)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_flock
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fremovexattr.S b/libc/arch-arm/syscalls/fremovexattr.S
index f4e950b..89be704 100644
--- a/libc/arch-arm/syscalls/fremovexattr.S
+++ b/libc/arch-arm/syscalls/fremovexattr.S
@@ -4,9 +4,11 @@
ENTRY(fremovexattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fremovexattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fstat64.S b/libc/arch-arm/syscalls/fstat64.S
index 798bba7..c2c7101 100644
--- a/libc/arch-arm/syscalls/fstat64.S
+++ b/libc/arch-arm/syscalls/fstat64.S
@@ -4,9 +4,11 @@
ENTRY(fstat64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fstat64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fstatat64.S b/libc/arch-arm/syscalls/fstatat64.S
index 03e0052..545dc16 100644
--- a/libc/arch-arm/syscalls/fstatat64.S
+++ b/libc/arch-arm/syscalls/fstatat64.S
@@ -4,9 +4,11 @@
ENTRY(fstatat64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fstatat64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fsync.S b/libc/arch-arm/syscalls/fsync.S
index 1dfff05..24b9a87 100644
--- a/libc/arch-arm/syscalls/fsync.S
+++ b/libc/arch-arm/syscalls/fsync.S
@@ -4,9 +4,11 @@
ENTRY(fsync)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fsync
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/ftruncate64.S b/libc/arch-arm/syscalls/ftruncate64.S
index ac0caa8..ee1a2a6 100644
--- a/libc/arch-arm/syscalls/ftruncate64.S
+++ b/libc/arch-arm/syscalls/ftruncate64.S
@@ -4,9 +4,11 @@
ENTRY(ftruncate64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_ftruncate64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getegid.S b/libc/arch-arm/syscalls/getegid.S
index afa9cc8..f4e17b5 100644
--- a/libc/arch-arm/syscalls/getegid.S
+++ b/libc/arch-arm/syscalls/getegid.S
@@ -4,9 +4,11 @@
ENTRY(getegid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getegid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/geteuid.S b/libc/arch-arm/syscalls/geteuid.S
index 10c8a25..01898f8 100644
--- a/libc/arch-arm/syscalls/geteuid.S
+++ b/libc/arch-arm/syscalls/geteuid.S
@@ -4,9 +4,11 @@
ENTRY(geteuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_geteuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getgid.S b/libc/arch-arm/syscalls/getgid.S
index 8772762..ee124a6 100644
--- a/libc/arch-arm/syscalls/getgid.S
+++ b/libc/arch-arm/syscalls/getgid.S
@@ -4,9 +4,11 @@
ENTRY(getgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getgid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getgroups.S b/libc/arch-arm/syscalls/getgroups.S
index 366299b..4c1bfdb 100644
--- a/libc/arch-arm/syscalls/getgroups.S
+++ b/libc/arch-arm/syscalls/getgroups.S
@@ -4,9 +4,11 @@
ENTRY(getgroups)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getgroups32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getitimer.S b/libc/arch-arm/syscalls/getitimer.S
index 80fb0f2..b9773ad 100644
--- a/libc/arch-arm/syscalls/getitimer.S
+++ b/libc/arch-arm/syscalls/getitimer.S
@@ -4,9 +4,11 @@
ENTRY(getitimer)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getitimer
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getpeername.S b/libc/arch-arm/syscalls/getpeername.S
index 25f0026..6bf6002 100644
--- a/libc/arch-arm/syscalls/getpeername.S
+++ b/libc/arch-arm/syscalls/getpeername.S
@@ -4,9 +4,11 @@
ENTRY(getpeername)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getpeername
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getpgid.S b/libc/arch-arm/syscalls/getpgid.S
index 36c4c19..d5c9c8a 100644
--- a/libc/arch-arm/syscalls/getpgid.S
+++ b/libc/arch-arm/syscalls/getpgid.S
@@ -4,9 +4,11 @@
ENTRY(getpgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getpgid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getppid.S b/libc/arch-arm/syscalls/getppid.S
index 606b2e0..91db24e 100644
--- a/libc/arch-arm/syscalls/getppid.S
+++ b/libc/arch-arm/syscalls/getppid.S
@@ -4,9 +4,11 @@
ENTRY(getppid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getppid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getresgid.S b/libc/arch-arm/syscalls/getresgid.S
index a5e4689..8fb7f28 100644
--- a/libc/arch-arm/syscalls/getresgid.S
+++ b/libc/arch-arm/syscalls/getresgid.S
@@ -4,9 +4,11 @@
ENTRY(getresgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getresgid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getresuid.S b/libc/arch-arm/syscalls/getresuid.S
index 74c26a7..ebec6e1 100644
--- a/libc/arch-arm/syscalls/getresuid.S
+++ b/libc/arch-arm/syscalls/getresuid.S
@@ -4,9 +4,11 @@
ENTRY(getresuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getresuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getrlimit.S b/libc/arch-arm/syscalls/getrlimit.S
index 166da63..0c9e662 100644
--- a/libc/arch-arm/syscalls/getrlimit.S
+++ b/libc/arch-arm/syscalls/getrlimit.S
@@ -4,9 +4,11 @@
ENTRY(getrlimit)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_ugetrlimit
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getrusage.S b/libc/arch-arm/syscalls/getrusage.S
index 93979c6..e74a4ad 100644
--- a/libc/arch-arm/syscalls/getrusage.S
+++ b/libc/arch-arm/syscalls/getrusage.S
@@ -4,9 +4,11 @@
ENTRY(getrusage)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getrusage
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getsid.S b/libc/arch-arm/syscalls/getsid.S
index 87d38fb..c918820 100644
--- a/libc/arch-arm/syscalls/getsid.S
+++ b/libc/arch-arm/syscalls/getsid.S
@@ -4,9 +4,11 @@
ENTRY(getsid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getsid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getsockname.S b/libc/arch-arm/syscalls/getsockname.S
index 5dc4eab..a30a291 100644
--- a/libc/arch-arm/syscalls/getsockname.S
+++ b/libc/arch-arm/syscalls/getsockname.S
@@ -4,9 +4,11 @@
ENTRY(getsockname)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getsockname
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/gettimeofday.S b/libc/arch-arm/syscalls/gettimeofday.S
index 174f94b..f5ed674 100644
--- a/libc/arch-arm/syscalls/gettimeofday.S
+++ b/libc/arch-arm/syscalls/gettimeofday.S
@@ -4,9 +4,11 @@
ENTRY(gettimeofday)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_gettimeofday
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getuid.S b/libc/arch-arm/syscalls/getuid.S
index 3d07d3c..cdc86bc 100644
--- a/libc/arch-arm/syscalls/getuid.S
+++ b/libc/arch-arm/syscalls/getuid.S
@@ -4,9 +4,11 @@
ENTRY(getuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getxattr.S b/libc/arch-arm/syscalls/getxattr.S
index 6661aaf..116d917 100644
--- a/libc/arch-arm/syscalls/getxattr.S
+++ b/libc/arch-arm/syscalls/getxattr.S
@@ -4,9 +4,11 @@
ENTRY(getxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/init_module.S b/libc/arch-arm/syscalls/init_module.S
index 8251533..8fecf68 100644
--- a/libc/arch-arm/syscalls/init_module.S
+++ b/libc/arch-arm/syscalls/init_module.S
@@ -4,9 +4,11 @@
ENTRY(init_module)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_init_module
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/inotify_add_watch.S b/libc/arch-arm/syscalls/inotify_add_watch.S
index b945bd1..61e666c 100644
--- a/libc/arch-arm/syscalls/inotify_add_watch.S
+++ b/libc/arch-arm/syscalls/inotify_add_watch.S
@@ -4,9 +4,11 @@
ENTRY(inotify_add_watch)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_inotify_add_watch
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/inotify_init1.S b/libc/arch-arm/syscalls/inotify_init1.S
index 32090de..6cf066e 100644
--- a/libc/arch-arm/syscalls/inotify_init1.S
+++ b/libc/arch-arm/syscalls/inotify_init1.S
@@ -4,9 +4,11 @@
ENTRY(inotify_init1)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_inotify_init1
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/inotify_rm_watch.S b/libc/arch-arm/syscalls/inotify_rm_watch.S
index e8230e2..1455da1 100644
--- a/libc/arch-arm/syscalls/inotify_rm_watch.S
+++ b/libc/arch-arm/syscalls/inotify_rm_watch.S
@@ -4,9 +4,11 @@
ENTRY(inotify_rm_watch)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_inotify_rm_watch
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/kill.S b/libc/arch-arm/syscalls/kill.S
index 0b5f4a4..82df861 100644
--- a/libc/arch-arm/syscalls/kill.S
+++ b/libc/arch-arm/syscalls/kill.S
@@ -4,9 +4,11 @@
ENTRY(kill)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_kill
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/klogctl.S b/libc/arch-arm/syscalls/klogctl.S
index b76b2b5..47a03c6 100644
--- a/libc/arch-arm/syscalls/klogctl.S
+++ b/libc/arch-arm/syscalls/klogctl.S
@@ -4,9 +4,11 @@
ENTRY(klogctl)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_syslog
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/lgetxattr.S b/libc/arch-arm/syscalls/lgetxattr.S
index b033a9a..157271c 100644
--- a/libc/arch-arm/syscalls/lgetxattr.S
+++ b/libc/arch-arm/syscalls/lgetxattr.S
@@ -4,9 +4,11 @@
ENTRY(lgetxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_lgetxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/listen.S b/libc/arch-arm/syscalls/listen.S
index 3aaa801..5ad75c0 100644
--- a/libc/arch-arm/syscalls/listen.S
+++ b/libc/arch-arm/syscalls/listen.S
@@ -4,9 +4,11 @@
ENTRY(listen)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_listen
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/listxattr.S b/libc/arch-arm/syscalls/listxattr.S
index 51ff267..093927d 100644
--- a/libc/arch-arm/syscalls/listxattr.S
+++ b/libc/arch-arm/syscalls/listxattr.S
@@ -4,9 +4,11 @@
ENTRY(listxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_listxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/llistxattr.S b/libc/arch-arm/syscalls/llistxattr.S
index 46e8116..5d0e7c8 100644
--- a/libc/arch-arm/syscalls/llistxattr.S
+++ b/libc/arch-arm/syscalls/llistxattr.S
@@ -4,9 +4,11 @@
ENTRY(llistxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_llistxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/lremovexattr.S b/libc/arch-arm/syscalls/lremovexattr.S
index a945062..4e0bcec 100644
--- a/libc/arch-arm/syscalls/lremovexattr.S
+++ b/libc/arch-arm/syscalls/lremovexattr.S
@@ -4,9 +4,11 @@
ENTRY(lremovexattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_lremovexattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/lseek.S b/libc/arch-arm/syscalls/lseek.S
index 00aeab3..cbdc441 100644
--- a/libc/arch-arm/syscalls/lseek.S
+++ b/libc/arch-arm/syscalls/lseek.S
@@ -4,9 +4,11 @@
ENTRY(lseek)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_lseek
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/madvise.S b/libc/arch-arm/syscalls/madvise.S
index 4d3cdcd..c2d7d20 100644
--- a/libc/arch-arm/syscalls/madvise.S
+++ b/libc/arch-arm/syscalls/madvise.S
@@ -4,9 +4,11 @@
ENTRY(madvise)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_madvise
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mincore.S b/libc/arch-arm/syscalls/mincore.S
index f1154d0..c93fe94 100644
--- a/libc/arch-arm/syscalls/mincore.S
+++ b/libc/arch-arm/syscalls/mincore.S
@@ -4,9 +4,11 @@
ENTRY(mincore)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mincore
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mkdirat.S b/libc/arch-arm/syscalls/mkdirat.S
index 1f8957b..4f93c61 100644
--- a/libc/arch-arm/syscalls/mkdirat.S
+++ b/libc/arch-arm/syscalls/mkdirat.S
@@ -4,9 +4,11 @@
ENTRY(mkdirat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mkdirat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mknodat.S b/libc/arch-arm/syscalls/mknodat.S
index 1a2bf6f..91baae8 100644
--- a/libc/arch-arm/syscalls/mknodat.S
+++ b/libc/arch-arm/syscalls/mknodat.S
@@ -4,9 +4,11 @@
ENTRY(mknodat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mknodat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mlock.S b/libc/arch-arm/syscalls/mlock.S
index 8a4fc7a..eb72f6f 100644
--- a/libc/arch-arm/syscalls/mlock.S
+++ b/libc/arch-arm/syscalls/mlock.S
@@ -4,9 +4,11 @@
ENTRY(mlock)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mlock
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mlockall.S b/libc/arch-arm/syscalls/mlockall.S
index b49ca05..2984087 100644
--- a/libc/arch-arm/syscalls/mlockall.S
+++ b/libc/arch-arm/syscalls/mlockall.S
@@ -4,9 +4,11 @@
ENTRY(mlockall)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mlockall
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mprotect.S b/libc/arch-arm/syscalls/mprotect.S
index cb51306..9bb1282 100644
--- a/libc/arch-arm/syscalls/mprotect.S
+++ b/libc/arch-arm/syscalls/mprotect.S
@@ -4,9 +4,11 @@
ENTRY(mprotect)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mprotect
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/msync.S b/libc/arch-arm/syscalls/msync.S
index 220fb4d..bcbab04 100644
--- a/libc/arch-arm/syscalls/msync.S
+++ b/libc/arch-arm/syscalls/msync.S
@@ -4,9 +4,11 @@
ENTRY(msync)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_msync
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/munlock.S b/libc/arch-arm/syscalls/munlock.S
index 05bf941..bf1b814 100644
--- a/libc/arch-arm/syscalls/munlock.S
+++ b/libc/arch-arm/syscalls/munlock.S
@@ -4,9 +4,11 @@
ENTRY(munlock)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_munlock
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/munlockall.S b/libc/arch-arm/syscalls/munlockall.S
index e2c5dd5..b45a5a2 100644
--- a/libc/arch-arm/syscalls/munlockall.S
+++ b/libc/arch-arm/syscalls/munlockall.S
@@ -4,9 +4,11 @@
ENTRY(munlockall)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_munlockall
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/munmap.S b/libc/arch-arm/syscalls/munmap.S
index 740c360..2b7a121 100644
--- a/libc/arch-arm/syscalls/munmap.S
+++ b/libc/arch-arm/syscalls/munmap.S
@@ -4,9 +4,11 @@
ENTRY(munmap)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_munmap
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/nanosleep.S b/libc/arch-arm/syscalls/nanosleep.S
index fcd6e90..83fd323 100644
--- a/libc/arch-arm/syscalls/nanosleep.S
+++ b/libc/arch-arm/syscalls/nanosleep.S
@@ -4,9 +4,11 @@
ENTRY(nanosleep)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_nanosleep
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/personality.S b/libc/arch-arm/syscalls/personality.S
index d43d763..5ad6132 100644
--- a/libc/arch-arm/syscalls/personality.S
+++ b/libc/arch-arm/syscalls/personality.S
@@ -4,9 +4,11 @@
ENTRY(personality)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_personality
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/pipe2.S b/libc/arch-arm/syscalls/pipe2.S
index 1cbdfb2..f543f9d 100644
--- a/libc/arch-arm/syscalls/pipe2.S
+++ b/libc/arch-arm/syscalls/pipe2.S
@@ -4,9 +4,11 @@
ENTRY(pipe2)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_pipe2
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/prlimit64.S b/libc/arch-arm/syscalls/prlimit64.S
index 3ae9e1b..0f04aaa 100644
--- a/libc/arch-arm/syscalls/prlimit64.S
+++ b/libc/arch-arm/syscalls/prlimit64.S
@@ -4,9 +4,11 @@
ENTRY(prlimit64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_prlimit64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/quotactl.S b/libc/arch-arm/syscalls/quotactl.S
index 831d229..fde17f4 100644
--- a/libc/arch-arm/syscalls/quotactl.S
+++ b/libc/arch-arm/syscalls/quotactl.S
@@ -4,9 +4,11 @@
ENTRY(quotactl)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_quotactl
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/read.S b/libc/arch-arm/syscalls/read.S
index 1c3b395..5051358 100644
--- a/libc/arch-arm/syscalls/read.S
+++ b/libc/arch-arm/syscalls/read.S
@@ -4,9 +4,11 @@
ENTRY(read)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_read
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/readlinkat.S b/libc/arch-arm/syscalls/readlinkat.S
index e7cc8ff..36d46fa 100644
--- a/libc/arch-arm/syscalls/readlinkat.S
+++ b/libc/arch-arm/syscalls/readlinkat.S
@@ -4,9 +4,11 @@
ENTRY(readlinkat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_readlinkat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/readv.S b/libc/arch-arm/syscalls/readv.S
index c7807bd..565af6a 100644
--- a/libc/arch-arm/syscalls/readv.S
+++ b/libc/arch-arm/syscalls/readv.S
@@ -4,9 +4,11 @@
ENTRY(readv)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_readv
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/recvmsg.S b/libc/arch-arm/syscalls/recvmsg.S
index 995a9e3..19a9fca 100644
--- a/libc/arch-arm/syscalls/recvmsg.S
+++ b/libc/arch-arm/syscalls/recvmsg.S
@@ -4,9 +4,11 @@
ENTRY(recvmsg)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_recvmsg
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/removexattr.S b/libc/arch-arm/syscalls/removexattr.S
index 3a32e5c..46f847d 100644
--- a/libc/arch-arm/syscalls/removexattr.S
+++ b/libc/arch-arm/syscalls/removexattr.S
@@ -4,9 +4,11 @@
ENTRY(removexattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_removexattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/renameat.S b/libc/arch-arm/syscalls/renameat.S
index 98e86dc..89fc513 100644
--- a/libc/arch-arm/syscalls/renameat.S
+++ b/libc/arch-arm/syscalls/renameat.S
@@ -4,9 +4,11 @@
ENTRY(renameat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_renameat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_get_priority_max.S b/libc/arch-arm/syscalls/sched_get_priority_max.S
index 187e680..23b1d62 100644
--- a/libc/arch-arm/syscalls/sched_get_priority_max.S
+++ b/libc/arch-arm/syscalls/sched_get_priority_max.S
@@ -4,9 +4,11 @@
ENTRY(sched_get_priority_max)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_get_priority_max
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_get_priority_min.S b/libc/arch-arm/syscalls/sched_get_priority_min.S
index 68bf7df..65a967c 100644
--- a/libc/arch-arm/syscalls/sched_get_priority_min.S
+++ b/libc/arch-arm/syscalls/sched_get_priority_min.S
@@ -4,9 +4,11 @@
ENTRY(sched_get_priority_min)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_get_priority_min
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_getparam.S b/libc/arch-arm/syscalls/sched_getparam.S
index 32b97b8..700041e 100644
--- a/libc/arch-arm/syscalls/sched_getparam.S
+++ b/libc/arch-arm/syscalls/sched_getparam.S
@@ -4,9 +4,11 @@
ENTRY(sched_getparam)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_getparam
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_getscheduler.S b/libc/arch-arm/syscalls/sched_getscheduler.S
index 330c208..b4f5d13 100644
--- a/libc/arch-arm/syscalls/sched_getscheduler.S
+++ b/libc/arch-arm/syscalls/sched_getscheduler.S
@@ -4,9 +4,11 @@
ENTRY(sched_getscheduler)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_getscheduler
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_rr_get_interval.S b/libc/arch-arm/syscalls/sched_rr_get_interval.S
index 5d176ac..ea30b62 100644
--- a/libc/arch-arm/syscalls/sched_rr_get_interval.S
+++ b/libc/arch-arm/syscalls/sched_rr_get_interval.S
@@ -4,9 +4,11 @@
ENTRY(sched_rr_get_interval)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_rr_get_interval
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_setaffinity.S b/libc/arch-arm/syscalls/sched_setaffinity.S
index 6653471..636845b 100644
--- a/libc/arch-arm/syscalls/sched_setaffinity.S
+++ b/libc/arch-arm/syscalls/sched_setaffinity.S
@@ -4,9 +4,11 @@
ENTRY(sched_setaffinity)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_setaffinity
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_setparam.S b/libc/arch-arm/syscalls/sched_setparam.S
index 16e1997..f24b96e 100644
--- a/libc/arch-arm/syscalls/sched_setparam.S
+++ b/libc/arch-arm/syscalls/sched_setparam.S
@@ -4,9 +4,11 @@
ENTRY(sched_setparam)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_setparam
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_setscheduler.S b/libc/arch-arm/syscalls/sched_setscheduler.S
index 2ec9fec..5bfa202 100644
--- a/libc/arch-arm/syscalls/sched_setscheduler.S
+++ b/libc/arch-arm/syscalls/sched_setscheduler.S
@@ -4,9 +4,11 @@
ENTRY(sched_setscheduler)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_setscheduler
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_yield.S b/libc/arch-arm/syscalls/sched_yield.S
index 1ec328f..7b93a6e 100644
--- a/libc/arch-arm/syscalls/sched_yield.S
+++ b/libc/arch-arm/syscalls/sched_yield.S
@@ -4,9 +4,11 @@
ENTRY(sched_yield)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_yield
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sendfile.S b/libc/arch-arm/syscalls/sendfile.S
index afae021..52e78d0 100644
--- a/libc/arch-arm/syscalls/sendfile.S
+++ b/libc/arch-arm/syscalls/sendfile.S
@@ -4,9 +4,11 @@
ENTRY(sendfile)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sendfile
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sendfile64.S b/libc/arch-arm/syscalls/sendfile64.S
index d0ad0b8..416e9d2 100644
--- a/libc/arch-arm/syscalls/sendfile64.S
+++ b/libc/arch-arm/syscalls/sendfile64.S
@@ -4,9 +4,11 @@
ENTRY(sendfile64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sendfile64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sendmmsg.S b/libc/arch-arm/syscalls/sendmmsg.S
index 8bb5f80..f97d264 100644
--- a/libc/arch-arm/syscalls/sendmmsg.S
+++ b/libc/arch-arm/syscalls/sendmmsg.S
@@ -4,9 +4,11 @@
ENTRY(sendmmsg)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sendmmsg
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sendmsg.S b/libc/arch-arm/syscalls/sendmsg.S
index fd38140..215219a 100644
--- a/libc/arch-arm/syscalls/sendmsg.S
+++ b/libc/arch-arm/syscalls/sendmsg.S
@@ -4,9 +4,11 @@
ENTRY(sendmsg)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sendmsg
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setdomainname.S b/libc/arch-arm/syscalls/setdomainname.S
index 20f1f6f..4014a48 100644
--- a/libc/arch-arm/syscalls/setdomainname.S
+++ b/libc/arch-arm/syscalls/setdomainname.S
@@ -4,9 +4,11 @@
ENTRY(setdomainname)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setdomainname
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setfsgid.S b/libc/arch-arm/syscalls/setfsgid.S
index f677a94..2f0f08c 100644
--- a/libc/arch-arm/syscalls/setfsgid.S
+++ b/libc/arch-arm/syscalls/setfsgid.S
@@ -4,9 +4,11 @@
ENTRY(setfsgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setfsgid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setfsuid.S b/libc/arch-arm/syscalls/setfsuid.S
index 5d27a4d..ce663e0 100644
--- a/libc/arch-arm/syscalls/setfsuid.S
+++ b/libc/arch-arm/syscalls/setfsuid.S
@@ -4,9 +4,11 @@
ENTRY(setfsuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setfsuid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setgid.S b/libc/arch-arm/syscalls/setgid.S
index d9b2b88..6f1cbed 100644
--- a/libc/arch-arm/syscalls/setgid.S
+++ b/libc/arch-arm/syscalls/setgid.S
@@ -4,9 +4,11 @@
ENTRY(setgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setgid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setgroups.S b/libc/arch-arm/syscalls/setgroups.S
index 169de73..1fb494c 100644
--- a/libc/arch-arm/syscalls/setgroups.S
+++ b/libc/arch-arm/syscalls/setgroups.S
@@ -4,9 +4,11 @@
ENTRY(setgroups)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setgroups32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sethostname.S b/libc/arch-arm/syscalls/sethostname.S
index 0a98fd3..c4c2db5 100644
--- a/libc/arch-arm/syscalls/sethostname.S
+++ b/libc/arch-arm/syscalls/sethostname.S
@@ -4,9 +4,11 @@
ENTRY(sethostname)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sethostname
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setitimer.S b/libc/arch-arm/syscalls/setitimer.S
index 31b277b..511a5d1 100644
--- a/libc/arch-arm/syscalls/setitimer.S
+++ b/libc/arch-arm/syscalls/setitimer.S
@@ -4,9 +4,11 @@
ENTRY(setitimer)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setitimer
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setns.S b/libc/arch-arm/syscalls/setns.S
index 59203ef..b1902dc 100644
--- a/libc/arch-arm/syscalls/setns.S
+++ b/libc/arch-arm/syscalls/setns.S
@@ -4,9 +4,11 @@
ENTRY(setns)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setns
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setpgid.S b/libc/arch-arm/syscalls/setpgid.S
index 4a91520..fe05fc9 100644
--- a/libc/arch-arm/syscalls/setpgid.S
+++ b/libc/arch-arm/syscalls/setpgid.S
@@ -4,9 +4,11 @@
ENTRY(setpgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setpgid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setpriority.S b/libc/arch-arm/syscalls/setpriority.S
index 2053ce1..960eee0 100644
--- a/libc/arch-arm/syscalls/setpriority.S
+++ b/libc/arch-arm/syscalls/setpriority.S
@@ -4,9 +4,11 @@
ENTRY(setpriority)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setpriority
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setregid.S b/libc/arch-arm/syscalls/setregid.S
index f1bdc60..0b5f444 100644
--- a/libc/arch-arm/syscalls/setregid.S
+++ b/libc/arch-arm/syscalls/setregid.S
@@ -4,9 +4,11 @@
ENTRY(setregid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setregid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setresgid.S b/libc/arch-arm/syscalls/setresgid.S
index 9b8968a..64677d3 100644
--- a/libc/arch-arm/syscalls/setresgid.S
+++ b/libc/arch-arm/syscalls/setresgid.S
@@ -4,9 +4,11 @@
ENTRY(setresgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setresgid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setresuid.S b/libc/arch-arm/syscalls/setresuid.S
index c26a955..e3888f6 100644
--- a/libc/arch-arm/syscalls/setresuid.S
+++ b/libc/arch-arm/syscalls/setresuid.S
@@ -4,9 +4,11 @@
ENTRY(setresuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setresuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setreuid.S b/libc/arch-arm/syscalls/setreuid.S
index 796191a..15c2665 100644
--- a/libc/arch-arm/syscalls/setreuid.S
+++ b/libc/arch-arm/syscalls/setreuid.S
@@ -4,9 +4,11 @@
ENTRY(setreuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setreuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setrlimit.S b/libc/arch-arm/syscalls/setrlimit.S
index c87b21b..b9014eb 100644
--- a/libc/arch-arm/syscalls/setrlimit.S
+++ b/libc/arch-arm/syscalls/setrlimit.S
@@ -4,9 +4,11 @@
ENTRY(setrlimit)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setrlimit
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setsid.S b/libc/arch-arm/syscalls/setsid.S
index 83bda1b..fb71474 100644
--- a/libc/arch-arm/syscalls/setsid.S
+++ b/libc/arch-arm/syscalls/setsid.S
@@ -4,9 +4,11 @@
ENTRY(setsid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setsid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/settimeofday.S b/libc/arch-arm/syscalls/settimeofday.S
index 5763f40..00dfdeb 100644
--- a/libc/arch-arm/syscalls/settimeofday.S
+++ b/libc/arch-arm/syscalls/settimeofday.S
@@ -4,9 +4,11 @@
ENTRY(settimeofday)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_settimeofday
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setuid.S b/libc/arch-arm/syscalls/setuid.S
index 55b349c..447ed1b 100644
--- a/libc/arch-arm/syscalls/setuid.S
+++ b/libc/arch-arm/syscalls/setuid.S
@@ -4,9 +4,11 @@
ENTRY(setuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/shutdown.S b/libc/arch-arm/syscalls/shutdown.S
index 889934a..51ed0cf 100644
--- a/libc/arch-arm/syscalls/shutdown.S
+++ b/libc/arch-arm/syscalls/shutdown.S
@@ -4,9 +4,11 @@
ENTRY(shutdown)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_shutdown
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sigaltstack.S b/libc/arch-arm/syscalls/sigaltstack.S
index b61b25d..2f97800 100644
--- a/libc/arch-arm/syscalls/sigaltstack.S
+++ b/libc/arch-arm/syscalls/sigaltstack.S
@@ -4,9 +4,11 @@
ENTRY(sigaltstack)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sigaltstack
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/socketpair.S b/libc/arch-arm/syscalls/socketpair.S
index f3c8a4b..e537235 100644
--- a/libc/arch-arm/syscalls/socketpair.S
+++ b/libc/arch-arm/syscalls/socketpair.S
@@ -4,9 +4,11 @@
ENTRY(socketpair)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_socketpair
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/swapoff.S b/libc/arch-arm/syscalls/swapoff.S
index a7aaa82..25832ef 100644
--- a/libc/arch-arm/syscalls/swapoff.S
+++ b/libc/arch-arm/syscalls/swapoff.S
@@ -4,9 +4,11 @@
ENTRY(swapoff)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_swapoff
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/swapon.S b/libc/arch-arm/syscalls/swapon.S
index 6ea93c3..df4c71e 100644
--- a/libc/arch-arm/syscalls/swapon.S
+++ b/libc/arch-arm/syscalls/swapon.S
@@ -4,9 +4,11 @@
ENTRY(swapon)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_swapon
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/symlinkat.S b/libc/arch-arm/syscalls/symlinkat.S
index d330a54..ec2ee4f 100644
--- a/libc/arch-arm/syscalls/symlinkat.S
+++ b/libc/arch-arm/syscalls/symlinkat.S
@@ -4,9 +4,11 @@
ENTRY(symlinkat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_symlinkat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sync.S b/libc/arch-arm/syscalls/sync.S
index 48ecfc0..b73dcaa 100644
--- a/libc/arch-arm/syscalls/sync.S
+++ b/libc/arch-arm/syscalls/sync.S
@@ -4,9 +4,11 @@
ENTRY(sync)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sync
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sysinfo.S b/libc/arch-arm/syscalls/sysinfo.S
index 709478e..1584ea4 100644
--- a/libc/arch-arm/syscalls/sysinfo.S
+++ b/libc/arch-arm/syscalls/sysinfo.S
@@ -4,9 +4,11 @@
ENTRY(sysinfo)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sysinfo
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/tee.S b/libc/arch-arm/syscalls/tee.S
index a019c00..efd12ca 100644
--- a/libc/arch-arm/syscalls/tee.S
+++ b/libc/arch-arm/syscalls/tee.S
@@ -4,9 +4,11 @@
ENTRY(tee)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_tee
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/tgkill.S b/libc/arch-arm/syscalls/tgkill.S
index 2068465..43fe62c 100644
--- a/libc/arch-arm/syscalls/tgkill.S
+++ b/libc/arch-arm/syscalls/tgkill.S
@@ -4,9 +4,11 @@
ENTRY(tgkill)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_tgkill
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/timerfd_create.S b/libc/arch-arm/syscalls/timerfd_create.S
index 89a80cd..4aa3107 100644
--- a/libc/arch-arm/syscalls/timerfd_create.S
+++ b/libc/arch-arm/syscalls/timerfd_create.S
@@ -4,9 +4,11 @@
ENTRY(timerfd_create)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timerfd_create
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/timerfd_gettime.S b/libc/arch-arm/syscalls/timerfd_gettime.S
index 4a7df76..6ae93e4 100644
--- a/libc/arch-arm/syscalls/timerfd_gettime.S
+++ b/libc/arch-arm/syscalls/timerfd_gettime.S
@@ -4,9 +4,11 @@
ENTRY(timerfd_gettime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timerfd_gettime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/timerfd_settime.S b/libc/arch-arm/syscalls/timerfd_settime.S
index 2e0fe93..2dd4aac 100644
--- a/libc/arch-arm/syscalls/timerfd_settime.S
+++ b/libc/arch-arm/syscalls/timerfd_settime.S
@@ -4,9 +4,11 @@
ENTRY(timerfd_settime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timerfd_settime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/times.S b/libc/arch-arm/syscalls/times.S
index 289c185..1ff636d 100644
--- a/libc/arch-arm/syscalls/times.S
+++ b/libc/arch-arm/syscalls/times.S
@@ -4,9 +4,11 @@
ENTRY(times)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_times
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/truncate.S b/libc/arch-arm/syscalls/truncate.S
index bb33beb..0bee4d2 100644
--- a/libc/arch-arm/syscalls/truncate.S
+++ b/libc/arch-arm/syscalls/truncate.S
@@ -4,9 +4,11 @@
ENTRY(truncate)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_truncate
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/truncate64.S b/libc/arch-arm/syscalls/truncate64.S
index 9cafbb5..74e9eb2 100644
--- a/libc/arch-arm/syscalls/truncate64.S
+++ b/libc/arch-arm/syscalls/truncate64.S
@@ -4,9 +4,11 @@
ENTRY(truncate64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_truncate64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/umask.S b/libc/arch-arm/syscalls/umask.S
index 5dc4461..ca3e058 100644
--- a/libc/arch-arm/syscalls/umask.S
+++ b/libc/arch-arm/syscalls/umask.S
@@ -4,9 +4,11 @@
ENTRY(umask)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_umask
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/umount2.S b/libc/arch-arm/syscalls/umount2.S
index 435eda4..6e1ba32 100644
--- a/libc/arch-arm/syscalls/umount2.S
+++ b/libc/arch-arm/syscalls/umount2.S
@@ -4,9 +4,11 @@
ENTRY(umount2)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_umount2
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/uname.S b/libc/arch-arm/syscalls/uname.S
index 8af6123..4f2b8a20 100644
--- a/libc/arch-arm/syscalls/uname.S
+++ b/libc/arch-arm/syscalls/uname.S
@@ -4,9 +4,11 @@
ENTRY(uname)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_uname
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/unlinkat.S b/libc/arch-arm/syscalls/unlinkat.S
index 96257e6..ac7bfae 100644
--- a/libc/arch-arm/syscalls/unlinkat.S
+++ b/libc/arch-arm/syscalls/unlinkat.S
@@ -4,9 +4,11 @@
ENTRY(unlinkat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_unlinkat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/unshare.S b/libc/arch-arm/syscalls/unshare.S
index 8054171..4558a60 100644
--- a/libc/arch-arm/syscalls/unshare.S
+++ b/libc/arch-arm/syscalls/unshare.S
@@ -4,9 +4,11 @@
ENTRY(unshare)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_unshare
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/utimensat.S b/libc/arch-arm/syscalls/utimensat.S
index f3c2fa2..9524507 100644
--- a/libc/arch-arm/syscalls/utimensat.S
+++ b/libc/arch-arm/syscalls/utimensat.S
@@ -4,9 +4,11 @@
ENTRY(utimensat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_utimensat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/vmsplice.S b/libc/arch-arm/syscalls/vmsplice.S
index cc12ca5..90ab8b4 100644
--- a/libc/arch-arm/syscalls/vmsplice.S
+++ b/libc/arch-arm/syscalls/vmsplice.S
@@ -4,9 +4,11 @@
ENTRY(vmsplice)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_vmsplice
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/wait4.S b/libc/arch-arm/syscalls/wait4.S
index 26a4929..40bb5a5 100644
--- a/libc/arch-arm/syscalls/wait4.S
+++ b/libc/arch-arm/syscalls/wait4.S
@@ -4,9 +4,11 @@
ENTRY(wait4)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_wait4
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/write.S b/libc/arch-arm/syscalls/write.S
index bf89d7f..4abbe6b 100644
--- a/libc/arch-arm/syscalls/write.S
+++ b/libc/arch-arm/syscalls/write.S
@@ -4,9 +4,11 @@
ENTRY(write)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_write
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/writev.S b/libc/arch-arm/syscalls/writev.S
index 15b5275..3103237 100644
--- a/libc/arch-arm/syscalls/writev.S
+++ b/libc/arch-arm/syscalls/writev.S
@@ -4,9 +4,11 @@
ENTRY(writev)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_writev
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-mips/string/memset.S b/libc/arch-mips/string/memset.S
index 6344af1..7ea6753 100644
--- a/libc/arch-mips/string/memset.S
+++ b/libc/arch-mips/string/memset.S
@@ -209,11 +209,14 @@
LEAF(__memset_chk)
#endif
.set noreorder
- bgtu a2, a3, __memset_chk_fail
- la t9, __memset_chk_fail
- .set reorder
-
- // Fall through to memset...
+ sltu t2, a3, a2
+ beq t2, zero, memset
+ nop
+ .cpsetup t9, t8, __memset_chk
+ LA t9, __memset_chk_fail
+ jr t9
+ nop
+ .set reorder
END(__memset_chk)
#ifdef __ANDROID__
diff --git a/libc/bionic/fpclassify.cpp b/libc/bionic/fpclassify.cpp
index 21ff946..f8cea80 100644
--- a/libc/bionic/fpclassify.cpp
+++ b/libc/bionic/fpclassify.cpp
@@ -29,7 +29,8 @@
#include <sys/types.h>
#include <math.h>
-#include <machine/ieee.h>
+
+#include "private/bionic_ieee.h"
// These aren't declared in our <math.h>.
extern "C" int __isinf(double);
diff --git a/libc/include/sys/utime.h b/libc/bionic/mblen.cpp
similarity index 87%
rename from libc/include/sys/utime.h
rename to libc/bionic/mblen.cpp
index 9f8810e..7def6f1 100644
--- a/libc/include/sys/utime.h
+++ b/libc/bionic/mblen.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -25,9 +25,11 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
-#ifndef _SYS_UTIME_H_
-#define _SYS_UTIME_H_
-#include <linux/utime.h>
+#include <stdlib.h>
+#include <wchar.h>
-#endif /* _SYS_UTIME_H_ */
+int mblen(const char* s, size_t n) {
+ mbstate_t state = {};
+ return mbrlen(s, n, &state);
+}
diff --git a/libc/bionic/wctype.cpp b/libc/bionic/wctype.cpp
index f2d7861..05e9c90 100644
--- a/libc/bionic/wctype.cpp
+++ b/libc/bionic/wctype.cpp
@@ -26,11 +26,13 @@
* SUCH DAMAGE.
*/
+#include <wctype.h>
+
#include <ctype.h>
+#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
-#include <wctype.h>
// TODO: these only work for the ASCII range; rewrite to dlsym icu4c? http://b/14499654
@@ -85,8 +87,8 @@
wint_t towlower(wint_t wc) { return tolower(wc); }
wint_t towupper(wint_t wc) { return toupper(wc); }
-int towupper_l(int c, locale_t) { return towupper(c); }
-int towlower_l(int c, locale_t) { return towlower(c); }
+wint_t towupper_l(int c, locale_t) { return towupper(c); }
+wint_t towlower_l(int c, locale_t) { return towlower(c); }
wctype_t wctype(const char* property) {
static const char* const properties[WC_TYPE_MAX] = {
@@ -109,3 +111,27 @@
int wcwidth(wchar_t wc) {
return (wc > 0);
}
+
+static wctrans_t wctrans_tolower = wctrans_t(1);
+static wctrans_t wctrans_toupper = wctrans_t(2);
+
+wctrans_t wctrans(const char* name) {
+ if (strcmp(name, "tolower") == 0) return wctrans_tolower;
+ if (strcmp(name, "toupper") == 0) return wctrans_toupper;
+ return 0;
+}
+
+wctrans_t wctrans_l(const char* name, locale_t) {
+ return wctrans(name);
+}
+
+wint_t towctrans(wint_t c, wctrans_t t) {
+ if (t == wctrans_tolower) return towlower(c);
+ if (t == wctrans_toupper) return towupper(c);
+ errno = EINVAL;
+ return 0;
+}
+
+wint_t towctrans_l(wint_t c, wctrans_t t, locale_t) {
+ return towctrans(c, t);
+}
diff --git a/libc/include/nsswitch.h b/libc/dns/include/nsswitch.h
similarity index 93%
rename from libc/include/nsswitch.h
rename to libc/dns/include/nsswitch.h
index af88433..addbfc8 100644
--- a/libc/include/nsswitch.h
+++ b/libc/dns/include/nsswitch.h
@@ -144,19 +144,6 @@
/*
- * Default sourcelists (if nsswitch.conf is missing, corrupt,
- * or the requested database doesn't have an entry)
- */
-extern const ns_src __nsdefaultsrc[];
-extern const ns_src __nsdefaultcompat[];
-extern const ns_src __nsdefaultcompat_forceall[];
-extern const ns_src __nsdefaultfiles[];
-extern const ns_src __nsdefaultfiles_forceall[];
-extern const ns_src __nsdefaultnis[];
-extern const ns_src __nsdefaultnis_forceall[];
-
-
-/*
* ns_mtab - `nsswitch method table'
* An nsswitch module provides a mapping from (database name, method name)
* tuples to the nss_method and associated callback data. Effectively,
diff --git a/libc/dns/include/resolv_private.h b/libc/dns/include/resolv_private.h
index 3ab8ea6..8dad926 100644
--- a/libc/dns/include/resolv_private.h
+++ b/libc/dns/include/resolv_private.h
@@ -536,6 +536,15 @@
#undef __socketcall
+// Symbols that are supposed to be in resolv.h, but that we aren't exporting.
+int ns_parserr2(ns_msg*, ns_sect, int, ns_rr2*);
+int ns_name_pton2(const char*, u_char*, size_t, size_t*);
+int ns_name_unpack2(const u_char*, const u_char*, const u_char*, u_char*, size_t, size_t*);
+int ns_name_eq(ns_nname_ct, size_t, ns_nname_ct, size_t);
+int ns_name_owned(ns_namemap_ct, int, ns_namemap_ct, int);
+int ns_name_map(ns_nname_ct, size_t, ns_namemap_t, int);
+int ns_name_labels(ns_nname_ct, size_t);
+
__END_DECLS
#pragma GCC visibility pop
diff --git a/libc/dns/nameser/ns_parse.c b/libc/dns/nameser/ns_parse.c
index 2d6d530..3a1901a 100644
--- a/libc/dns/nameser/ns_parse.c
+++ b/libc/dns/nameser/ns_parse.c
@@ -52,6 +52,8 @@
/* Public. */
+struct _ns_flagdata { int mask, shift; };
+
/* These need to be in the same order as the nres.h:ns_flag enum. */
const struct _ns_flagdata _ns_flagdata[16] = {
{ 0x8000, 15 }, /* qr. */
diff --git a/libc/dns/net/getnameinfo.c b/libc/dns/net/getnameinfo.c
index 893e982..abd1a66 100644
--- a/libc/dns/net/getnameinfo.c
+++ b/libc/dns/net/getnameinfo.c
@@ -54,7 +54,6 @@
#include <sys/socket.h>
#include <sys/un.h>
#include <net/if.h>
-#include <net/if_ieee1394.h>
#include <net/if_types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
diff --git a/libc/dns/resolv/res_cache.c b/libc/dns/resolv/res_cache.c
index 02887f2..212ee0a 100644
--- a/libc/dns/resolv/res_cache.c
+++ b/libc/dns/resolv/res_cache.c
@@ -2230,10 +2230,16 @@
stats[i] = info->nsstats[i];
}
for (i = 0; i < MAXDNSRCH; i++) {
- if (info->dnsrch_offset[i] == -1) {
+ const char* cur_domain = info->defdname + info->dnsrch_offset[i];
+ // dnsrch_offset[i] can either be -1 or point to an empty string to indicate the end
+ // of the search offsets. Checking for < 0 is not strictly necessary, but safer.
+ // TODO: Pass in a search domain array instead of a string to
+ // _resolv_set_nameservers_for_net() and make this double check unnecessary.
+ if (info->dnsrch_offset[i] < 0 ||
+ ((size_t)info->dnsrch_offset[i]) >= sizeof(info->defdname) || !cur_domain[0]) {
break;
}
- strlcpy(domains[i], info->defdname + info->dnsrch_offset[i], MAXDNSRCHPATH);
+ strlcpy(domains[i], cur_domain, MAXDNSRCHPATH);
}
*dcount = i;
*params = info->params;
diff --git a/libc/dns/resolv/res_send.c b/libc/dns/resolv/res_send.c
index 0e30b28..4c4b953 100644
--- a/libc/dns/resolv/res_send.c
+++ b/libc/dns/resolv/res_send.c
@@ -552,10 +552,17 @@
n = send_vc(statp, buf, buflen, ans, anssiz, &terrno,
ns, &now, &rcode, &delay);
- struct __res_sample sample;
- _res_stats_set_sample(&sample, now, rcode, delay);
- _resolv_cache_add_resolver_stats_sample(statp->netid, revision_id, ns,
- &sample, params.max_samples);
+ /*
+ * Only record stats the first time we try a query. This ensures that
+ * queries that deterministically fail (e.g., a name that always returns
+ * SERVFAIL or times out) do not unduly affect the stats.
+ */
+ if (try == 0) {
+ struct __res_sample sample;
+ _res_stats_set_sample(&sample, now, rcode, delay);
+ _resolv_cache_add_resolver_stats_sample(statp->netid, revision_id,
+ ns, &sample, params.max_samples);
+ }
if (DBG) {
__libc_format_log(ANDROID_LOG_DEBUG, "libc",
@@ -576,10 +583,13 @@
n = send_dg(statp, buf, buflen, ans, anssiz, &terrno,
ns, &v_circuit, &gotsomewhere, &now, &rcode, &delay);
- struct __res_sample sample;
- _res_stats_set_sample(&sample, now, rcode, delay);
- _resolv_cache_add_resolver_stats_sample(statp->netid, revision_id, ns,
- &sample, params.max_samples);
+ /* Only record stats the first time we try a query. See above. */
+ if (try == 0) {
+ struct __res_sample sample;
+ _res_stats_set_sample(&sample, now, rcode, delay);
+ _resolv_cache_add_resolver_stats_sample(statp->netid, revision_id,
+ ns, &sample, params.max_samples);
+ }
if (DBG) {
__libc_format_log(ANDROID_LOG_DEBUG, "libc", "used send_dg %d\n",n);
@@ -741,7 +751,7 @@
const u_char *buf, int buflen, u_char *ans, int anssiz,
int *terrno, int ns, time_t* at, int* rcode, int* delay)
{
- *at = 0;
+ *at = time(NULL);
*rcode = RCODE_INTERNAL_ERROR;
*delay = 0;
const HEADER *hp = (const HEADER *)(const void *)buf;
@@ -919,9 +929,6 @@
return (0);
}
- struct timespec done = evNowTime();
- *at = done.tv_sec;
-
if (truncating) {
/*
* Flush rest of answer so connection stays in synch.
@@ -959,6 +966,7 @@
* next nameserver ought not be tried.
*/
if (resplen > 0) {
+ struct timespec done = evNowTime();
*delay = _res_stats_calculate_rtt(&done, &now);
*rcode = anhp->rcode;
}
@@ -1074,7 +1082,7 @@
int *terrno, int ns, int *v_circuit, int *gotsomewhere,
time_t *at, int *rcode, int* delay)
{
- *at = 0;
+ *at = time(NULL);
*rcode = RCODE_INTERNAL_ERROR;
*delay = 0;
const HEADER *hp = (const HEADER *)(const void *)buf;
@@ -1261,7 +1269,6 @@
goto retry;;
}
done = evNowTime();
- *at = done.tv_sec;
*delay = _res_stats_calculate_rtt(&done, &now);
if (anhp->rcode == SERVFAIL ||
anhp->rcode == NOTIMP ||
diff --git a/libc/include/android/dlext.h b/libc/include/android/dlext.h
index 6e32b68..05a27f3 100644
--- a/libc/include/android/dlext.h
+++ b/libc/include/android/dlext.h
@@ -129,7 +129,8 @@
struct android_namespace_t* library_namespace;
} android_dlextinfo;
-extern void* android_dlopen_ext(const char* filename, int flag, const android_dlextinfo* extinfo);
+extern void* android_dlopen_ext(const char* filename, int flag, const android_dlextinfo* extinfo)
+ __INTRODUCED_IN(21);
/*
* Initializes public and anonymous namespaces. The public_ns_sonames is the list of sonames
diff --git a/libc/include/android/set_abort_message.h b/libc/include/android/set_abort_message.h
index 4b3d82b..aebedba 100644
--- a/libc/include/android/set_abort_message.h
+++ b/libc/include/android/set_abort_message.h
@@ -33,7 +33,7 @@
__BEGIN_DECLS
-void android_set_abort_message(const char* msg);
+void android_set_abort_message(const char* msg) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/arpa/inet.h b/libc/include/arpa/inet.h
index 86265bf..e4f94ef 100644
--- a/libc/include/arpa/inet.h
+++ b/libc/include/arpa/inet.h
@@ -37,10 +37,10 @@
in_addr_t inet_addr(const char*);
int inet_aton(const char*, struct in_addr*);
-in_addr_t inet_lnaof(struct in_addr);
-struct in_addr inet_makeaddr(in_addr_t, in_addr_t);
-in_addr_t inet_netof(struct in_addr);
-in_addr_t inet_network(const char*);
+in_addr_t inet_lnaof(struct in_addr) __INTRODUCED_IN(21);
+struct in_addr inet_makeaddr(in_addr_t, in_addr_t) __INTRODUCED_IN(21);
+in_addr_t inet_netof(struct in_addr) __INTRODUCED_IN(21);
+in_addr_t inet_network(const char*) __INTRODUCED_IN(21);
char* inet_ntoa(struct in_addr);
const char* inet_ntop(int, const void*, char*, socklen_t);
unsigned int inet_nsap_addr(const char*, unsigned char*, int);
diff --git a/libc/include/arpa/nameser.h b/libc/include/arpa/nameser.h
index 91561ce..a207eab 100644
--- a/libc/include/arpa/nameser.h
+++ b/libc/include/arpa/nameser.h
@@ -141,10 +141,6 @@
};
typedef struct ns_newmsg ns_newmsg;
-/* Private data structure - do not use from outside library. */
-struct _ns_flagdata { int mask, shift; };
-extern const struct _ns_flagdata _ns_flagdata[];
-
/* Accessor macros - this is part of the public interface. */
#define ns_msg_id(handle) ((handle)._id + 0)
@@ -566,70 +562,34 @@
#endif
__BEGIN_DECLS
-int ns_msg_getflag(ns_msg, int) __LIBC_ABI_PUBLIC__;
-uint16_t ns_get16(const u_char *) __LIBC_ABI_PUBLIC__;
-uint32_t ns_get32(const u_char *) __LIBC_ABI_PUBLIC__;
-void ns_put16(uint16_t, u_char *) __LIBC_ABI_PUBLIC__;
-void ns_put32(uint32_t, u_char *) __LIBC_ABI_PUBLIC__;
-int ns_initparse(const u_char *, int, ns_msg *) __LIBC_ABI_PUBLIC__;
-int ns_skiprr(const u_char *, const u_char *, ns_sect, int) __LIBC_ABI_PUBLIC__;
-int ns_parserr(ns_msg *, ns_sect, int, ns_rr *) __LIBC_ABI_PUBLIC__;
-int ns_parserr2(ns_msg *, ns_sect, int, ns_rr2 *) __LIBC_HIDDEN__;
-int ns_sprintrr(const ns_msg *, const ns_rr *,
- const char *, const char *, char *, size_t) __LIBC_ABI_PUBLIC__;
-int ns_sprintrrf(const u_char *, size_t, const char *,
- ns_class, ns_type, u_long, const u_char *,
- size_t, const char *, const char *,
- char *, size_t) __LIBC_ABI_PUBLIC__;
-int ns_format_ttl(u_long, char *, size_t) __LIBC_ABI_PUBLIC__;
-int ns_parse_ttl(const char *, u_long *) __LIBC_ABI_PUBLIC__;
-uint32_t ns_datetosecs(const char *cp, int *errp) __LIBC_ABI_PUBLIC__;
-int ns_name_ntol(const u_char *, u_char *, size_t) __LIBC_ABI_PUBLIC__;
-int ns_name_ntop(const u_char *, char *, size_t) __LIBC_ABI_PUBLIC__;
-int ns_name_pton(const char *, u_char *, size_t) __LIBC_ABI_PUBLIC__;
-int ns_name_pton2(const char *, u_char *, size_t, size_t *) __LIBC_HIDDEN__;
-int ns_name_unpack(const u_char *, const u_char *,
- const u_char *, u_char *, size_t) __LIBC_ABI_PUBLIC__;
-int ns_name_unpack2(const u_char *, const u_char *,
- const u_char *, u_char *, size_t,
- size_t *) __LIBC_HIDDEN__;
-int ns_name_pack(const u_char *, u_char *, int,
- const u_char **, const u_char **) __LIBC_ABI_PUBLIC__;
-int ns_name_uncompress(const u_char *, const u_char *,
- const u_char *, char *, size_t) __LIBC_ABI_PUBLIC__;
-int ns_name_compress(const char *, u_char *, size_t,
- const u_char **, const u_char **) __LIBC_ABI_PUBLIC__;
-int ns_name_skip(const u_char **, const u_char *) __LIBC_ABI_PUBLIC__;
-void ns_name_rollback(const u_char *, const u_char **,
- const u_char **) __LIBC_ABI_PUBLIC__;
-int ns_sign(u_char *, int *, int, int, void *,
- const u_char *, int, u_char *, int *, time_t) __LIBC_ABI_PUBLIC__;
-int ns_sign2(u_char *, int *, int, int, void *,
- const u_char *, int, u_char *, int *, time_t,
- u_char **, u_char **) __LIBC_ABI_PUBLIC__;
-ssize_t ns_name_length(ns_nname_ct, size_t) __LIBC_HIDDEN__;
-int ns_name_eq(ns_nname_ct, size_t, ns_nname_ct, size_t) __LIBC_HIDDEN__;
-int ns_name_owned(ns_namemap_ct, int, ns_namemap_ct, int) __LIBC_HIDDEN__;
-int ns_name_map(ns_nname_ct, size_t, ns_namemap_t, int) __LIBC_HIDDEN__;
-int ns_name_labels(ns_nname_ct, size_t) __LIBC_HIDDEN__;
-int ns_sign_tcp(u_char *, int *, int, int,
- ns_tcp_tsig_state *, int) __LIBC_ABI_PUBLIC__;
-int ns_sign_tcp2(u_char *, int *, int, int,
- ns_tcp_tsig_state *, int,
- u_char **, u_char **) __LIBC_ABI_PUBLIC__;
-int ns_sign_tcp_init(void *, const u_char *, int,
- ns_tcp_tsig_state *) __LIBC_ABI_PUBLIC__;
-u_char *ns_find_tsig(u_char *, u_char *) __LIBC_ABI_PUBLIC__;
-int ns_verify(u_char *, int *, void *,
- const u_char *, int, u_char *, int *,
- time_t *, int) __LIBC_ABI_PUBLIC__;
-int ns_verify_tcp(u_char *, int *, ns_tcp_tsig_state *, int);
-int ns_verify_tcp_init(void *, const u_char *, int,
- ns_tcp_tsig_state *) __LIBC_ABI_PUBLIC__;
-int ns_samedomain(const char *, const char *) __LIBC_ABI_PUBLIC__;
-int ns_subdomain(const char *, const char *) __LIBC_ABI_PUBLIC__;
-int ns_makecanon(const char *, char *, size_t) __LIBC_ABI_PUBLIC__;
-int ns_samename(const char *, const char *) __LIBC_ABI_PUBLIC__;
+int ns_msg_getflag(ns_msg, int) __INTRODUCED_IN_64(23);
+uint16_t ns_get16(const u_char*) __INTRODUCED_IN_64(23);
+uint32_t ns_get32(const u_char*) __INTRODUCED_IN_64(23);
+void ns_put16(uint16_t, u_char*) __INTRODUCED_IN_64(23);
+void ns_put32(uint32_t, u_char*) __INTRODUCED_IN_64(23);
+int ns_initparse(const u_char*, int, ns_msg*) __INTRODUCED_IN_64(23);
+int ns_skiprr(const u_char*, const u_char*, ns_sect, int) __INTRODUCED_IN_64(23);
+int ns_parserr(ns_msg*, ns_sect, int, ns_rr*) __INTRODUCED_IN_64(23);
+int ns_sprintrr(const ns_msg*, const ns_rr*, const char*, const char*, char*, size_t)
+ __INTRODUCED_IN_64(23);
+int ns_sprintrrf(const u_char*, size_t, const char*, ns_class, ns_type, u_long, const u_char*,
+ size_t, const char*, const char*, char*, size_t) __INTRODUCED_IN_64(23);
+int ns_format_ttl(u_long, char*, size_t) __INTRODUCED_IN_64(23);
+int ns_name_ntol(const u_char*, u_char*, size_t) __INTRODUCED_IN_64(23);
+int ns_name_ntop(const u_char*, char*, size_t) __INTRODUCED_IN_64(23);
+int ns_name_pton(const char*, u_char*, size_t) __INTRODUCED_IN_64(23);
+int ns_name_unpack(const u_char*, const u_char*, const u_char*, u_char*, size_t)
+ __INTRODUCED_IN_64(23);
+int ns_name_pack(const u_char*, u_char*, int, const u_char**, const u_char**) __INTRODUCED_IN_64(23);
+int ns_name_uncompress(const u_char*, const u_char*, const u_char*, char*, size_t)
+ __INTRODUCED_IN_64(23);
+int ns_name_compress(const char*, u_char*, size_t, const u_char**, const u_char**)
+ __INTRODUCED_IN_64(23);
+int ns_name_skip(const u_char**, const u_char*) __INTRODUCED_IN_64(23);
+void ns_name_rollback(const u_char*, const u_char**, const u_char**) __INTRODUCED_IN_64(23);
+
+int ns_makecanon(const char*, char*, size_t) __INTRODUCED_IN_64(23);
+int ns_samename(const char*, const char*) __INTRODUCED_IN_64(23);
__END_DECLS
#ifdef BIND_4_COMPAT
diff --git a/libc/include/arpa/telnet.h b/libc/include/arpa/telnet.h
index d318e08..b8212f8 100644
--- a/libc/include/arpa/telnet.h
+++ b/libc/include/arpa/telnet.h
@@ -64,8 +64,6 @@
"SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC",
"EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0,
};
-#else
-extern char *telcmds[];
#endif
#define TELCMD_FIRST xEOF
@@ -206,8 +204,6 @@
const char *slc_names[] = {
SLC_NAMELIST
};
-#else
-extern char *slc_names[];
#define SLC_NAMES SLC_NAMELIST
#endif
@@ -266,8 +262,6 @@
const char *authtype_names[] = {
"NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", 0,
};
-#else
-extern char *authtype_names[];
#endif
#define AUTHTYPE_NAME_OK(x) ((unsigned int)(x) < AUTHTYPE_CNT)
@@ -301,9 +295,6 @@
const char *enctype_names[] = {
"ANY", "DES_CFB64", "DES_OFB64", 0,
};
-#else
-extern const char *encrypt_names[];
-extern const char *enctype_names[];
#endif
diff --git a/libc/include/sys/glibc-syscalls.h b/libc/include/bits/glibc-syscalls.h
similarity index 100%
rename from libc/include/sys/glibc-syscalls.h
rename to libc/include/bits/glibc-syscalls.h
diff --git a/libc/include/bits/lockf.h b/libc/include/bits/lockf.h
index a0ba19d..655514d 100644
--- a/libc/include/bits/lockf.h
+++ b/libc/include/bits/lockf.h
@@ -42,9 +42,9 @@
#if defined(__USE_FILE_OFFSET64)
int lockf(int, int, off_t) __RENAME(lockf64);
#else
-int lockf(int, int, off_t);
+int lockf(int, int, off_t) __INTRODUCED_IN(24);
#endif
-int lockf64(int, int, off64_t);
+int lockf64(int, int, off64_t) __INTRODUCED_IN(24);
__END_DECLS
diff --git a/libc/include/bits/strcasecmp.h b/libc/include/bits/strcasecmp.h
index 124f5cd..7cb713e 100644
--- a/libc/include/bits/strcasecmp.h
+++ b/libc/include/bits/strcasecmp.h
@@ -36,9 +36,9 @@
__BEGIN_DECLS
int strcasecmp(const char*, const char*) __purefunc;
-int strcasecmp_l(const char*, const char*, locale_t) __purefunc;
+int strcasecmp_l(const char*, const char*, locale_t) __purefunc __INTRODUCED_IN(23);
int strncasecmp(const char*, const char*, size_t) __purefunc;
-int strncasecmp_l(const char*, const char*, size_t, locale_t) __purefunc;
+int strncasecmp_l(const char*, const char*, size_t, locale_t) __purefunc __INTRODUCED_IN(23);
__END_DECLS
diff --git a/libc/include/sys/utime.h b/libc/include/bits/wctype.h
similarity index 63%
copy from libc/include/sys/utime.h
copy to libc/include/bits/wctype.h
index 9f8810e..fe7c80e 100644
--- a/libc/include/sys/utime.h
+++ b/libc/include/bits/wctype.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -25,9 +25,40 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
-#ifndef _SYS_UTIME_H_
-#define _SYS_UTIME_H_
-#include <linux/utime.h>
+#ifndef _BITS_WCTYPE_H_
+#define _BITS_WCTYPE_H_
-#endif /* _SYS_UTIME_H_ */
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+
+typedef __WINT_TYPE__ wint_t;
+
+int iswalnum(wint_t);
+int iswalpha(wint_t);
+int iswblank(wint_t) __INTRODUCED_IN(21);
+int iswcntrl(wint_t);
+int iswdigit(wint_t);
+int iswgraph(wint_t);
+int iswlower(wint_t);
+int iswprint(wint_t);
+int iswpunct(wint_t);
+int iswspace(wint_t);
+int iswupper(wint_t);
+int iswxdigit(wint_t);
+
+wint_t towlower(wint_t);
+wint_t towupper(wint_t);
+
+typedef long wctype_t;
+wctype_t wctype(const char*);
+int iswctype(wint_t, wctype_t);
+
+typedef const void* wctrans_t;
+wint_t towctrans(wint_t, wctrans_t) __INTRODUCED_IN_FUTURE;
+wctrans_t wctrans(const char*) __INTRODUCED_IN_FUTURE;
+
+__END_DECLS
+
+#endif
diff --git a/libc/include/complex.h b/libc/include/complex.h
index b54d2fc..66ea97e 100644
--- a/libc/include/complex.h
+++ b/libc/include/complex.h
@@ -60,101 +60,101 @@
/* 7.3.5 Trigonometric functions */
/* 7.3.5.1 The cacos functions */
-double complex cacos(double complex);
-float complex cacosf(float complex);
-long double complex cacosl(long double complex);
+double complex cacos(double complex) __INTRODUCED_IN(23);
+float complex cacosf(float complex) __INTRODUCED_IN(23);
+long double complex cacosl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.5.2 The casin functions */
-double complex casin(double complex);
-float complex casinf(float complex);
-long double complex casinl(long double complex);
+double complex casin(double complex) __INTRODUCED_IN(23);
+float complex casinf(float complex) __INTRODUCED_IN(23);
+long double complex casinl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.5.1 The catan functions */
-double complex catan(double complex);
-float complex catanf(float complex);
-long double complex catanl(long double complex);
+double complex catan(double complex) __INTRODUCED_IN(23);
+float complex catanf(float complex) __INTRODUCED_IN(23);
+long double complex catanl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.5.1 The ccos functions */
-double complex ccos(double complex);
-float complex ccosf(float complex);
-long double complex ccosl(long double complex);
+double complex ccos(double complex) __INTRODUCED_IN(23);
+float complex ccosf(float complex) __INTRODUCED_IN(23);
+long double complex ccosl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.5.1 The csin functions */
-double complex csin(double complex);
-float complex csinf(float complex);
-long double complex csinl(long double complex);
+double complex csin(double complex) __INTRODUCED_IN(23);
+float complex csinf(float complex) __INTRODUCED_IN(23);
+long double complex csinl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.5.1 The ctan functions */
-double complex ctan(double complex);
-float complex ctanf(float complex);
-long double complex ctanl(long double complex);
+double complex ctan(double complex) __INTRODUCED_IN(23);
+float complex ctanf(float complex) __INTRODUCED_IN(23);
+long double complex ctanl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.6 Hyperbolic functions */
/* 7.3.6.1 The cacosh functions */
-double complex cacosh(double complex);
-float complex cacoshf(float complex);
-long double complex cacoshl(long double complex);
+double complex cacosh(double complex) __INTRODUCED_IN(23);
+float complex cacoshf(float complex) __INTRODUCED_IN(23);
+long double complex cacoshl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.6.2 The casinh functions */
-double complex casinh(double complex);
-float complex casinhf(float complex);
-long double complex casinhl(long double complex);
+double complex casinh(double complex) __INTRODUCED_IN(23);
+float complex casinhf(float complex) __INTRODUCED_IN(23);
+long double complex casinhl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.6.3 The catanh functions */
-double complex catanh(double complex);
-float complex catanhf(float complex);
-long double complex catanhl(long double complex);
+double complex catanh(double complex) __INTRODUCED_IN(23);
+float complex catanhf(float complex) __INTRODUCED_IN(23);
+long double complex catanhl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.6.4 The ccosh functions */
-double complex ccosh(double complex);
-float complex ccoshf(float complex);
-long double complex ccoshl(long double complex);
+double complex ccosh(double complex) __INTRODUCED_IN(23);
+float complex ccoshf(float complex) __INTRODUCED_IN(23);
+long double complex ccoshl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.6.5 The csinh functions */
-double complex csinh(double complex);
-float complex csinhf(float complex);
-long double complex csinhl(long double complex);
+double complex csinh(double complex) __INTRODUCED_IN(23);
+float complex csinhf(float complex) __INTRODUCED_IN(23);
+long double complex csinhl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.6.6 The ctanh functions */
-double complex ctanh(double complex);
-float complex ctanhf(float complex);
-long double complex ctanhl(long double complex);
+double complex ctanh(double complex) __INTRODUCED_IN(23);
+float complex ctanhf(float complex) __INTRODUCED_IN(23);
+long double complex ctanhl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.7 Exponential and logarithmic functions */
/* 7.3.7.1 The cexp functions */
-double complex cexp(double complex);
-float complex cexpf(float complex);
-long double complex cexpl(long double complex);
+double complex cexp(double complex) __INTRODUCED_IN(23);
+float complex cexpf(float complex) __INTRODUCED_IN(23);
+long double complex cexpl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.7.2 The clog functions */
-double complex clog(double complex);
-float complex clogf(float complex);
-long double complex clogl(long double complex);
+double complex clog(double complex) __INTRODUCED_IN_FUTURE;
+float complex clogf(float complex) __INTRODUCED_IN_FUTURE;
+long double complex clogl(long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.8 Power and absolute-value functions */
/* 7.3.8.1 The cabs functions */
-double cabs(double complex);
-float cabsf(float complex);
-long double cabsl(long double complex);
+double cabs(double complex) __INTRODUCED_IN(23);
+float cabsf(float complex) __INTRODUCED_IN(23);
+long double cabsl(long double complex) __INTRODUCED_IN_32(21) __INTRODUCED_IN_64(23);
/* 7.3.8.2 The cpow functions */
-double complex cpow(double complex, double complex);
-float complex cpowf(float complex, float complex);
-long double complex cpowl(long double complex, long double complex);
+double complex cpow(double complex, double complex) __INTRODUCED_IN_FUTURE;
+float complex cpowf(float complex, float complex) __INTRODUCED_IN_FUTURE;
+long double complex cpowl(long double complex, long double complex) __INTRODUCED_IN_FUTURE;
/* 7.3.8.3 The csqrt functions */
-double complex csqrt(double complex);
-float complex csqrtf(float complex);
-long double complex csqrtl(long double complex);
+double complex csqrt(double complex) __INTRODUCED_IN(23);
+float complex csqrtf(float complex) __INTRODUCED_IN(23);
+long double complex csqrtl(long double complex) __INTRODUCED_IN_32(21) __INTRODUCED_IN_64(23);
/* 7.3.9 Manipulation functions */
/* 7.3.9.1 The carg functions */
-double carg(double complex);
-float cargf(float complex);
-long double cargl(long double complex);
+double carg(double complex) __INTRODUCED_IN(23);
+float cargf(float complex) __INTRODUCED_IN(23);
+long double cargl(long double complex) __INTRODUCED_IN(23);
/* 7.3.9.2 The cimag functions */
-double cimag(double complex);
-float cimagf(float complex);
-long double cimagl(long double complex);
+double cimag(double complex) __INTRODUCED_IN(23);
+float cimagf(float complex) __INTRODUCED_IN(23);
+long double cimagl(long double complex) __INTRODUCED_IN(23);
/* 7.3.9.3 The conj functions */
-double complex conj(double complex);
-float complex conjf(float complex);
-long double complex conjl(long double complex);
+double complex conj(double complex) __INTRODUCED_IN(23);
+float complex conjf(float complex) __INTRODUCED_IN(23);
+long double complex conjl(long double complex) __INTRODUCED_IN(23);
/* 7.3.9.4 The cproj functions */
-double complex cproj(double complex);
-float complex cprojf(float complex);
-long double complex cprojl(long double complex);
+double complex cproj(double complex) __INTRODUCED_IN(23);
+float complex cprojf(float complex) __INTRODUCED_IN(23);
+long double complex cprojl(long double complex) __INTRODUCED_IN_32(21) __INTRODUCED_IN_64(23);
/* 7.3.9.5 The creal functions */
-double creal(double complex);
-float crealf(float complex);
-long double creall(long double complex);
+double creal(double complex) __INTRODUCED_IN(23);
+float crealf(float complex) __INTRODUCED_IN(23);
+long double creall(long double complex) __INTRODUCED_IN(23);
#pragma GCC visibility pop
__END_DECLS
diff --git a/libc/include/ctype.h b/libc/include/ctype.h
index 83b5ba7..199f810 100644
--- a/libc/include/ctype.h
+++ b/libc/include/ctype.h
@@ -73,22 +73,20 @@
int tolower(int);
int toupper(int);
-#if __ANDROID_API__ >= 21
-int isalnum_l(int, locale_t);
-int isalpha_l(int, locale_t);
-int isblank_l(int, locale_t);
-int iscntrl_l(int, locale_t);
-int isdigit_l(int, locale_t);
-int isgraph_l(int, locale_t);
-int islower_l(int, locale_t);
-int isprint_l(int, locale_t);
-int ispunct_l(int, locale_t);
-int isspace_l(int, locale_t);
-int isupper_l(int, locale_t);
-int isxdigit_l(int, locale_t);
-int tolower_l(int, locale_t);
-int toupper_l(int, locale_t);
-#endif /* __ANDROID_API__ >= 21 */
+int isalnum_l(int, locale_t) __INTRODUCED_IN(21);
+int isalpha_l(int, locale_t) __INTRODUCED_IN(21);
+int isblank_l(int, locale_t) __INTRODUCED_IN(21);
+int iscntrl_l(int, locale_t) __INTRODUCED_IN(21);
+int isdigit_l(int, locale_t) __INTRODUCED_IN(21);
+int isgraph_l(int, locale_t) __INTRODUCED_IN(21);
+int islower_l(int, locale_t) __INTRODUCED_IN(21);
+int isprint_l(int, locale_t) __INTRODUCED_IN(21);
+int ispunct_l(int, locale_t) __INTRODUCED_IN(21);
+int isspace_l(int, locale_t) __INTRODUCED_IN(21);
+int isupper_l(int, locale_t) __INTRODUCED_IN(21);
+int isxdigit_l(int, locale_t) __INTRODUCED_IN(21);
+int tolower_l(int, locale_t) __INTRODUCED_IN(21);
+int toupper_l(int, locale_t) __INTRODUCED_IN(21);
#if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __POSIX_VISIBLE > 200112 \
|| __XPG_VISIBLE > 600
@@ -98,8 +96,8 @@
#if __BSD_VISIBLE || __XPG_VISIBLE
int isascii(int);
int toascii(int);
-int _tolower(int);
-int _toupper(int);
+int _tolower(int) __INTRODUCED_IN(21);
+int _toupper(int) __INTRODUCED_IN(21);
#endif /* __BSD_VISIBLE || __XPG_VISIBLE */
#endif /* __GNUC__ || _ANSI_LIBRARY || lint */
diff --git a/libc/include/dirent.h b/libc/include/dirent.h
index 3cdfa68..db8a520 100644
--- a/libc/include/dirent.h
+++ b/libc/include/dirent.h
@@ -71,22 +71,25 @@
extern DIR* opendir(const char*);
extern DIR* fdopendir(int);
extern struct dirent* readdir(DIR*);
-extern struct dirent64* readdir64(DIR*);
+extern struct dirent64* readdir64(DIR*) __INTRODUCED_IN(21);
extern int readdir_r(DIR*, struct dirent*, struct dirent**);
-extern int readdir64_r(DIR*, struct dirent64*, struct dirent64**);
+extern int readdir64_r(DIR*, struct dirent64*, struct dirent64**) __INTRODUCED_IN(21);
extern int closedir(DIR*);
extern void rewinddir(DIR*);
-extern void seekdir(DIR*, long);
-extern long telldir(DIR*);
+extern void seekdir(DIR*, long) __INTRODUCED_IN(23);
+extern long telldir(DIR*) __INTRODUCED_IN(23);
extern int dirfd(DIR*);
extern int alphasort(const struct dirent**, const struct dirent**);
-extern int alphasort64(const struct dirent64**, const struct dirent64**);
-extern int scandir64(const char*, struct dirent64***, int (*)(const struct dirent64*), int (*)(const struct dirent64**, const struct dirent64**));
+extern int alphasort64(const struct dirent64**, const struct dirent64**) __INTRODUCED_IN(21);
+extern int scandir64(const char*, struct dirent64***, int (*)(const struct dirent64*),
+ int (*)(const struct dirent64**, const struct dirent64**)) __INTRODUCED_IN(21);
extern int scandir(const char*, struct dirent***, int (*)(const struct dirent*), int (*)(const struct dirent**, const struct dirent**));
#if defined(__USE_GNU)
-int scandirat64(int, const char*, struct dirent64***, int (*)(const struct dirent64*), int (*)(const struct dirent64**, const struct dirent64**));
-int scandirat(int, const char*, struct dirent***, int (*)(const struct dirent*), int (*)(const struct dirent**, const struct dirent**));
+int scandirat64(int, const char*, struct dirent64***, int (*)(const struct dirent64*),
+ int (*)(const struct dirent64**, const struct dirent64**)) __INTRODUCED_IN(24);
+int scandirat(int, const char*, struct dirent***, int (*)(const struct dirent*),
+ int (*)(const struct dirent**, const struct dirent**)) __INTRODUCED_IN(24);
#endif
__END_DECLS
diff --git a/libc/include/dlfcn.h b/libc/include/dlfcn.h
index c2e8980..25a302f 100644
--- a/libc/include/dlfcn.h
+++ b/libc/include/dlfcn.h
@@ -47,7 +47,8 @@
extern int dlclose(void* handle);
extern const char* dlerror(void);
extern void* dlsym(void* handle, const char* symbol) __nonnull((2));
-extern void* dlvsym(void* handle, const char* symbol, const char* version) __nonnull((2, 3));
+extern void* dlvsym(void* handle, const char* symbol, const char* version) __nonnull((2, 3))
+ __INTRODUCED_IN(24);
extern int dladdr(const void* addr, Dl_info *info);
enum {
diff --git a/libc/include/error.h b/libc/include/error.h
index dd12884..205890f 100644
--- a/libc/include/error.h
+++ b/libc/include/error.h
@@ -33,12 +33,13 @@
__BEGIN_DECLS
-void error(int, int, const char*, ...) __printflike(3, 4);
-void error_at_line(int, int, const char*, unsigned int, const char*, ...) __printflike(5, 6);
+void error(int, int, const char*, ...) __printflike(3, 4) __INTRODUCED_IN(23);
+void error_at_line(int, int, const char*, unsigned int, const char*, ...) __printflike(5, 6)
+ __INTRODUCED_IN(23);
-extern void (*error_print_progname)(void);
-extern unsigned int error_message_count;
-extern int error_one_per_line;
+extern void (*error_print_progname)(void) __INTRODUCED_IN(23);
+extern unsigned int error_message_count __INTRODUCED_IN(23);
+extern int error_one_per_line __INTRODUCED_IN(23);
__END_DECLS
diff --git a/libc/include/fcntl.h b/libc/include/fcntl.h
index 013d72c..c8030f1 100644
--- a/libc/include/fcntl.h
+++ b/libc/include/fcntl.h
@@ -64,36 +64,36 @@
#define SYNC_FILE_RANGE_WAIT_AFTER 4
extern int creat(const char*, mode_t);
-extern int creat64(const char*, mode_t);
+extern int creat64(const char*, mode_t) __INTRODUCED_IN(21);
extern int openat(int, const char*, int, ...);
-extern int openat64(int, const char*, int, ...);
+extern int openat64(int, const char*, int, ...) __INTRODUCED_IN(21);
extern int open(const char*, int, ...);
-extern int open64(const char*, int, ...);
-extern ssize_t splice(int, off64_t*, int, off64_t*, size_t, unsigned int);
-extern ssize_t tee(int, int, size_t, unsigned int);
-extern ssize_t vmsplice(int, const struct iovec*, size_t, unsigned int);
+extern int open64(const char*, int, ...) __INTRODUCED_IN(21);
+extern ssize_t splice(int, off64_t*, int, off64_t*, size_t, unsigned int) __INTRODUCED_IN(21);
+extern ssize_t tee(int, int, size_t, unsigned int) __INTRODUCED_IN(21);
+extern ssize_t vmsplice(int, const struct iovec*, size_t, unsigned int) __INTRODUCED_IN(21);
#if defined(__USE_FILE_OFFSET64)
-extern int fallocate(int, int, off_t, off_t) __RENAME(fallocate64);
-extern int posix_fadvise(int, off_t, off_t, int) __RENAME(posix_fadvise64);
-extern int posix_fallocate(int, off_t, off_t) __RENAME(posix_fallocate);
+extern int fallocate(int, int, off_t, off_t) __RENAME(fallocate64) __INTRODUCED_IN(21);
+extern int posix_fadvise(int, off_t, off_t, int) __RENAME(posix_fadvise64) __INTRODUCED_IN(21);
+extern int posix_fallocate(int, off_t, off_t) __RENAME(posix_fallocate) __INTRODUCED_IN(21);
#else
-extern int fallocate(int, int, off_t, off_t);
-extern int posix_fadvise(int, off_t, off_t, int);
-extern int posix_fallocate(int, off_t, off_t);
+extern int fallocate(int, int, off_t, off_t) __INTRODUCED_IN(21);
+extern int posix_fadvise(int, off_t, off_t, int) __INTRODUCED_IN(21);
+extern int posix_fallocate(int, off_t, off_t) __INTRODUCED_IN(21);
#endif
-extern int fallocate64(int, int, off64_t, off64_t);
-extern int posix_fadvise64(int, off64_t, off64_t, int);
-extern int posix_fallocate64(int, off64_t, off64_t);
+extern int fallocate64(int, int, off64_t, off64_t) __INTRODUCED_IN(21);
+extern int posix_fadvise64(int, off64_t, off64_t, int) __INTRODUCED_IN(21);
+extern int posix_fallocate64(int, off64_t, off64_t) __INTRODUCED_IN(21);
#if defined(__USE_GNU)
-ssize_t readahead(int, off64_t, size_t);
-int sync_file_range(int, off64_t, off64_t, unsigned int);
+ssize_t readahead(int, off64_t, size_t) __INTRODUCED_IN(21);
+int sync_file_range(int, off64_t, off64_t, unsigned int) __INTRODUCED_IN_FUTURE;
#endif
-extern int __open_2(const char*, int);
+extern int __open_2(const char*, int) __INTRODUCED_IN(21);
extern int __open_real(const char*, int, ...) __RENAME(open);
-extern int __openat_2(int, const char*, int);
+extern int __openat_2(int, const char*, int) __INTRODUCED_IN(21);
extern int __openat_real(int, const char*, int, ...) __RENAME(openat);
__errordecl(__creat_missing_mode, "called with O_CREAT, but missing mode");
__errordecl(__creat_too_many_args, "too many arguments");
diff --git a/libc/include/fenv.h b/libc/include/fenv.h
index 73ecc80..e51f9b6 100644
--- a/libc/include/fenv.h
+++ b/libc/include/fenv.h
@@ -36,23 +36,23 @@
__BEGIN_DECLS
#pragma GCC visibility push(default)
-int feclearexcept(int);
-int fegetexceptflag(fexcept_t *, int);
-int feraiseexcept(int);
-int fesetexceptflag(const fexcept_t *, int);
-int fetestexcept(int);
+int feclearexcept(int) __INTRODUCED_IN(21);
+int fegetexceptflag(fexcept_t*, int) __INTRODUCED_IN(21);
+int feraiseexcept(int) __INTRODUCED_IN(21);
+int fesetexceptflag(const fexcept_t*, int) __INTRODUCED_IN(21);
+int fetestexcept(int) __INTRODUCED_IN(21);
-int fegetround(void);
-int fesetround(int);
+int fegetround(void) __INTRODUCED_IN(21);
+int fesetround(int) __INTRODUCED_IN(21);
-int fegetenv(fenv_t *);
-int feholdexcept(fenv_t *);
-int fesetenv(const fenv_t *);
-int feupdateenv(const fenv_t *);
+int fegetenv(fenv_t*) __INTRODUCED_IN(21);
+int feholdexcept(fenv_t*) __INTRODUCED_IN(21);
+int fesetenv(const fenv_t*) __INTRODUCED_IN(21);
+int feupdateenv(const fenv_t*) __INTRODUCED_IN(21);
-int feenableexcept(int);
-int fedisableexcept(int);
-int fegetexcept(void);
+int feenableexcept(int) __INTRODUCED_IN(21);
+int fedisableexcept(int) __INTRODUCED_IN(21);
+int fegetexcept(void) __INTRODUCED_IN(21);
/*
* The following constant represents the default floating-point environment
diff --git a/libc/include/ftw.h b/libc/include/ftw.h
index af524d0..ebd59f5 100644
--- a/libc/include/ftw.h
+++ b/libc/include/ftw.h
@@ -54,12 +54,12 @@
};
__BEGIN_DECLS
-int ftw(const char *, int (*)(const char *, const struct stat *, int), int);
-int nftw(const char *, int (*)(const char *, const struct stat *, int,
- struct FTW *), int, int);
-int ftw64(const char *, int (*)(const char *, const struct stat64 *, int), int);
-int nftw64(const char *, int (*)(const char *, const struct stat64 *, int,
- struct FTW *), int, int);
+int ftw(const char*, int (*)(const char*, const struct stat*, int), int) __INTRODUCED_IN(21);
+int nftw(const char*, int (*)(const char*, const struct stat*, int, struct FTW*), int, int)
+ __INTRODUCED_IN(21);
+int ftw64(const char*, int (*)(const char*, const struct stat64*, int), int) __INTRODUCED_IN(21);
+int nftw64(const char*, int (*)(const char*, const struct stat64*, int, struct FTW*), int, int)
+ __INTRODUCED_IN(21);
__END_DECLS
#endif /* !_FTW_H */
diff --git a/libc/include/grp.h b/libc/include/grp.h
index 3ae0d6e..42cf223 100644
--- a/libc/include/grp.h
+++ b/libc/include/grp.h
@@ -55,11 +55,12 @@
struct group* getgrnam(const char *);
#if __POSIX_VISIBLE >= 200112 || __XPG_VISIBLE
/* Android has thousands and thousands of ids to iterate through */
-struct group* getgrent(void) __attribute__((warning("getgrent is inefficient on Android")));
-void setgrent(void);
-void endgrent(void);
-int getgrgid_r(gid_t, struct group *, char *, size_t, struct group **);
-int getgrnam_r(const char *, struct group *, char *, size_t, struct group **);
+struct group* getgrent(void)
+ __attribute__((warning("getgrent is inefficient on Android"))) __INTRODUCED_IN_FUTURE;
+void setgrent(void) __INTRODUCED_IN_FUTURE;
+void endgrent(void) __INTRODUCED_IN_FUTURE;
+int getgrgid_r(gid_t, struct group*, char*, size_t, struct group**) __INTRODUCED_IN(24);
+int getgrnam_r(const char*, struct group*, char*, size_t, struct group**) __INTRODUCED_IN(24);
#endif
int getgrouplist (const char *user, gid_t group, gid_t *groups, int *ngroups);
diff --git a/libc/include/ifaddrs.h b/libc/include/ifaddrs.h
index 54a5a2c..083b27a 100644
--- a/libc/include/ifaddrs.h
+++ b/libc/include/ifaddrs.h
@@ -51,8 +51,8 @@
#define ifa_broadaddr ifa_ifu.ifu_broadaddr
#define ifa_dstaddr ifa_ifu.ifu_dstaddr
-void freeifaddrs(struct ifaddrs*);
-int getifaddrs(struct ifaddrs**);
+void freeifaddrs(struct ifaddrs*) __INTRODUCED_IN(24);
+int getifaddrs(struct ifaddrs**) __INTRODUCED_IN(24);
__END_DECLS
diff --git a/libc/include/inttypes.h b/libc/include/inttypes.h
index 8853c08..4752c52 100644
--- a/libc/include/inttypes.h
+++ b/libc/include/inttypes.h
@@ -254,14 +254,12 @@
} imaxdiv_t;
__BEGIN_DECLS
-intmax_t imaxabs(intmax_t) __pure2;
-imaxdiv_t imaxdiv(intmax_t, intmax_t) __pure2;
+intmax_t imaxabs(intmax_t) __pure2 __INTRODUCED_IN(21);
+imaxdiv_t imaxdiv(intmax_t, intmax_t) __pure2 __INTRODUCED_IN(21);
intmax_t strtoimax(const char *, char **, int);
uintmax_t strtoumax(const char *, char **, int);
-intmax_t wcstoimax(const wchar_t * __restrict,
- wchar_t ** __restrict, int);
-uintmax_t wcstoumax(const wchar_t * __restrict,
- wchar_t ** __restrict, int);
+intmax_t wcstoimax(const wchar_t* __restrict, wchar_t** __restrict, int) __INTRODUCED_IN(21);
+uintmax_t wcstoumax(const wchar_t* __restrict, wchar_t** __restrict, int) __INTRODUCED_IN(21);
__END_DECLS
#endif /* _INTTYPES_H_ */
diff --git a/libc/include/lastlog.h b/libc/include/lastlog.h
index e69de29..4f46106 100644
--- a/libc/include/lastlog.h
+++ b/libc/include/lastlog.h
@@ -0,0 +1,2 @@
+/* This is a BSD synonym for <utmp.h> that's also provided by glibc. */
+#include <utmp.h>
diff --git a/libc/include/limits.h b/libc/include/limits.h
index 342217b..01b7a49 100644
--- a/libc/include/limits.h
+++ b/libc/include/limits.h
@@ -52,10 +52,6 @@
#include <sys/limits.h>
-#if __POSIX_VISIBLE
-#include <sys/syslimits.h>
-#endif
-
/* GLibc compatibility definitions.
Note that these are defined by GCC's <limits.h>
only when __GNU_LIBRARY__ is defined, i.e. when
diff --git a/libc/include/link.h b/libc/include/link.h
index cb8e139..2d189f6 100644
--- a/libc/include/link.h
+++ b/libc/include/link.h
@@ -46,7 +46,11 @@
ElfW(Half) dlpi_phnum;
};
+#if defined(__arm__)
+int dl_iterate_phdr(int (*)(struct dl_phdr_info*, size_t, void*), void*) __INTRODUCED_IN(21);
+#else
int dl_iterate_phdr(int (*)(struct dl_phdr_info*, size_t, void*), void*);
+#endif
#ifdef __arm__
typedef long unsigned int* _Unwind_Ptr;
diff --git a/libc/include/locale.h b/libc/include/locale.h
index 7fd8c2c..daef18f 100644
--- a/libc/include/locale.h
+++ b/libc/include/locale.h
@@ -92,13 +92,13 @@
char int_n_sign_posn;
};
-struct lconv* localeconv(void);
+struct lconv* localeconv(void) __INTRODUCED_IN(21);
-locale_t duplocale(locale_t);
-void freelocale(locale_t);
-locale_t newlocale(int, const char*, locale_t);
+locale_t duplocale(locale_t) __INTRODUCED_IN(21);
+void freelocale(locale_t) __INTRODUCED_IN(21);
+locale_t newlocale(int, const char*, locale_t) __INTRODUCED_IN(21);
char* setlocale(int, const char*);
-locale_t uselocale(locale_t);
+locale_t uselocale(locale_t) __INTRODUCED_IN(21);
#define LC_GLOBAL_LOCALE ((locale_t) -1L)
diff --git a/libc/include/machine/endian.h b/libc/include/machine/endian.h
deleted file mode 100644
index ac89519..0000000
--- a/libc/include/machine/endian.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _MACHINE_ENDIAN_H_
-#define _MACHINE_ENDIAN_H_
-
-/* This file is for BSD source compatibility only. Use <endian.h> or <sys/endian.h> instead. */
-#include <sys/endian.h>
-
-#endif /* _MACHINE_ENDIAN_H_ */
diff --git a/libc/include/malloc.h b/libc/include/malloc.h
index 87555a9..02e2da7 100644
--- a/libc/include/malloc.h
+++ b/libc/include/malloc.h
@@ -29,7 +29,7 @@
extern void free(void* p);
extern void* memalign(size_t alignment, size_t byte_count) __mallocfunc __wur __attribute__((alloc_size(2)));
-extern size_t malloc_usable_size(const void* p);
+extern size_t malloc_usable_size(const void* p) __INTRODUCED_IN(21);
#ifndef STRUCT_MALLINFO_DECLARED
#define STRUCT_MALLINFO_DECLARED 1
@@ -68,7 +68,7 @@
* <!-- more heaps -->
* </malloc>
*/
-extern int malloc_info(int, FILE *);
+extern int malloc_info(int, FILE*) __INTRODUCED_IN(23);
__END_DECLS
diff --git a/libc/include/math.h b/libc/include/math.h
index 203968a..97539d7 100644
--- a/libc/include/math.h
+++ b/libc/include/math.h
@@ -127,6 +127,13 @@
#endif
#endif /* __BSD_VISIBLE */
+/* scalbln, scalbnf, and scalblnl were unavailable on x86 until API level 18 */
+#if defined(__i386__)
+#define __INTRODUCED_IN_X86 __INTRODUCED_IN
+#else
+#define __INTRODUCED_IN_X86(x)
+#endif
+
/*
* Most of these functions depend on the rounding mode and have the side
* effect of raising floating-point exceptions, so they are not declared
@@ -144,7 +151,7 @@
int __isfinitel(long double) __pure2;
int __isinff(float) __pure2;
int __isinfl(long double) __pure2;
-int __isnanf(float) __pure2;
+int __isnanf(float) __pure2 __INTRODUCED_IN(21);
int __isnanl(long double) __pure2;
int __isnormalf(float) __pure2;
int __isnormal(double) __pure2;
@@ -195,17 +202,17 @@
double fma(double, double, double);
double hypot(double, double);
int ilogb(double) __pure2;
-int (isinf)(double) __pure2;
+int(isinf)(double) __pure2 __INTRODUCED_IN(21);
int (isnan)(double) __pure2;
double lgamma(double);
long long llrint(double);
long long llround(double);
double log1p(double);
-double log2(double);
+double log2(double) __INTRODUCED_IN(18);
double logb(double);
long lrint(double);
long lround(double);
-double nan(const char *) __pure2;
+double nan(const char*) __pure2 __INTRODUCED_IN(13);
double nextafter(double, double);
double remainder(double, double);
double remquo(double, double, int *);
@@ -237,7 +244,7 @@
double nearbyint(double);
double round(double);
double scalbln(double, long);
-double scalbn(double, int);
+double scalbn(double, int) __INTRODUCED_IN_X86(18);
double tgamma(double);
double trunc(double);
#endif
@@ -249,7 +256,7 @@
double drem(double, double);
int finite(double) __pure2;
int isnanf(float) __pure2;
-long double significandl(long double);
+long double significandl(long double) __INTRODUCED_IN(21);
/*
* Reentrant version of gamma & lgamma; passes signgam back by reference
@@ -286,7 +293,7 @@
float ldexpf(float, int);
float log10f(float);
float log1pf(float);
-float log2f(float);
+float log2f(float) __INTRODUCED_IN(18);
float logf(float);
float modff(float, float *); /* fundamentally !__pure2 */
@@ -303,7 +310,7 @@
float erfcf(float);
float hypotf(float, float);
float lgammaf(float);
-float tgammaf(float);
+float tgammaf(float) __INTRODUCED_IN(13);
float acoshf(float);
float asinhf(float);
@@ -315,14 +322,14 @@
long long llroundf(float);
long lrintf(float);
long lroundf(float);
-float nanf(const char *) __pure2;
+float nanf(const char*) __pure2 __INTRODUCED_IN(13);
float nearbyintf(float);
float nextafterf(float, float);
float remainderf(float, float);
float remquof(float, float, int *);
float rintf(float);
float scalblnf(float, long);
-float scalbnf(float, int);
+float scalbnf(float, int) __INTRODUCED_IN_X86(18);
float truncf(float);
float fdimf(float, float);
@@ -364,69 +371,69 @@
* long double versions of ISO/POSIX math functions
*/
#if __ISO_C_VISIBLE >= 1999
-long double acoshl(long double);
-long double acosl(long double);
-long double asinhl(long double);
-long double asinl(long double);
-long double atan2l(long double, long double);
-long double atanhl(long double);
-long double atanl(long double);
-long double cbrtl(long double);
+long double acoshl(long double) __INTRODUCED_IN(21);
+long double acosl(long double) __INTRODUCED_IN(21);
+long double asinhl(long double) __INTRODUCED_IN(21);
+long double asinl(long double) __INTRODUCED_IN(21);
+long double atan2l(long double, long double) __INTRODUCED_IN(21);
+long double atanhl(long double) __INTRODUCED_IN(21);
+long double atanl(long double) __INTRODUCED_IN(21);
+long double cbrtl(long double) __INTRODUCED_IN(21);
long double ceill(long double);
long double copysignl(long double, long double) __pure2;
-long double coshl(long double);
-long double cosl(long double);
-long double erfcl(long double);
-long double erfl(long double);
-long double exp2l(long double);
-long double expl(long double);
-long double expm1l(long double);
+long double coshl(long double) __INTRODUCED_IN(21);
+long double cosl(long double) __INTRODUCED_IN(21);
+long double erfcl(long double) __INTRODUCED_IN(21);
+long double erfl(long double) __INTRODUCED_IN(21);
+long double exp2l(long double) __INTRODUCED_IN(21);
+long double expl(long double) __INTRODUCED_IN(21);
+long double expm1l(long double) __INTRODUCED_IN(21);
long double fabsl(long double) __pure2;
long double fdiml(long double, long double);
long double floorl(long double);
-long double fmal(long double, long double, long double);
+long double fmal(long double, long double, long double) __INTRODUCED_IN(21);
long double fmaxl(long double, long double) __pure2;
long double fminl(long double, long double) __pure2;
-long double fmodl(long double, long double);
-long double frexpl(long double value, int *); /* fundamentally !__pure2 */
-long double hypotl(long double, long double);
+long double fmodl(long double, long double) __INTRODUCED_IN(21);
+long double frexpl(long double value, int*) __INTRODUCED_IN(21); /* fundamentally !__pure2 */
+long double hypotl(long double, long double) __INTRODUCED_IN(21);
int ilogbl(long double) __pure2;
long double ldexpl(long double, int);
-long double lgammal(long double);
-long long llrintl(long double);
+long double lgammal(long double) __INTRODUCED_IN(21);
+long long llrintl(long double) __INTRODUCED_IN(21);
long long llroundl(long double);
-long double log10l(long double);
-long double log1pl(long double);
-long double log2l(long double);
-long double logbl(long double);
-long double logl(long double);
-long lrintl(long double);
+long double log10l(long double) __INTRODUCED_IN(21);
+long double log1pl(long double) __INTRODUCED_IN(21);
+long double log2l(long double) __INTRODUCED_IN(18);
+long double logbl(long double) __INTRODUCED_IN(18);
+long double logl(long double) __INTRODUCED_IN(21);
+long lrintl(long double) __INTRODUCED_IN(21);
long lroundl(long double);
-long double modfl(long double, long double *); /* fundamentally !__pure2 */
-long double nanl(const char *) __pure2;
-long double nearbyintl(long double);
-long double nextafterl(long double, long double);
-double nexttoward(double, long double);
+long double modfl(long double, long double*) __INTRODUCED_IN(21); /* fundamentally !__pure2 */
+long double nanl(const char*) __pure2 __INTRODUCED_IN(13);
+long double nearbyintl(long double) __INTRODUCED_IN(21);
+long double nextafterl(long double, long double) __INTRODUCED_IN(21);
+double nexttoward(double, long double) __INTRODUCED_IN(18);
float nexttowardf(float, long double);
-long double nexttowardl(long double, long double);
-long double powl(long double, long double);
-long double remainderl(long double, long double);
-long double remquol(long double, long double, int *);
-long double rintl(long double);
+long double nexttowardl(long double, long double) __INTRODUCED_IN(18);
+long double powl(long double, long double) __INTRODUCED_IN(21);
+long double remainderl(long double, long double) __INTRODUCED_IN(21);
+long double remquol(long double, long double, int*) __INTRODUCED_IN(21);
+long double rintl(long double) __INTRODUCED_IN(21);
long double roundl(long double);
long double scalblnl(long double, long);
-long double scalbnl(long double, int);
-long double sinhl(long double);
-long double sinl(long double);
-long double sqrtl(long double);
-long double tanhl(long double);
-long double tanl(long double);
-long double tgammal(long double);
+long double scalbnl(long double, int) __INTRODUCED_IN_X86(18);
+long double sinhl(long double) __INTRODUCED_IN(21);
+long double sinl(long double) __INTRODUCED_IN(21);
+long double sqrtl(long double) __INTRODUCED_IN(21);
+long double tanhl(long double) __INTRODUCED_IN(21);
+long double tanl(long double) __INTRODUCED_IN(21);
+long double tgammal(long double) __INTRODUCED_IN(21);
long double truncl(long double);
#endif /* __ISO_C_VISIBLE >= 1999 */
#if __BSD_VISIBLE
-long double lgammal_r(long double, int *);
+long double lgammal_r(long double, int*) __INTRODUCED_IN(23);
#endif
#if defined(__USE_GNU)
diff --git a/libc/include/mntent.h b/libc/include/mntent.h
index ab40079..ad9d72f 100644
--- a/libc/include/mntent.h
+++ b/libc/include/mntent.h
@@ -57,11 +57,11 @@
__BEGIN_DECLS
-int endmntent(FILE*);
+int endmntent(FILE*) __INTRODUCED_IN(21);
struct mntent* getmntent(FILE*);
-struct mntent* getmntent_r(FILE*, struct mntent*, char*, int);
-FILE* setmntent(const char*, const char*);
-char* hasmntopt(const struct mntent*, const char*);
+struct mntent* getmntent_r(FILE*, struct mntent*, char*, int) __INTRODUCED_IN(21);
+FILE* setmntent(const char*, const char*) __INTRODUCED_IN(21);
+char* hasmntopt(const struct mntent*, const char*) __INTRODUCED_IN_FUTURE;
__END_DECLS
diff --git a/libc/include/net/if.h b/libc/include/net/if.h
index aa4c19e..eac7699 100644
--- a/libc/include/net/if.h
+++ b/libc/include/net/if.h
@@ -46,8 +46,8 @@
char* if_indextoname(unsigned, char*);
unsigned if_nametoindex(const char*);
-struct if_nameindex* if_nameindex(void);
-void if_freenameindex(struct if_nameindex*);
+struct if_nameindex* if_nameindex(void) __INTRODUCED_IN(24);
+void if_freenameindex(struct if_nameindex*) __INTRODUCED_IN(24);
__END_DECLS
diff --git a/libc/include/net/if_ether.h b/libc/include/net/if_ether.h
index 8daa16b..06cceb1 100644
--- a/libc/include/net/if_ether.h
+++ b/libc/include/net/if_ether.h
@@ -205,12 +205,8 @@
*/
#include <sys/cdefs.h>
__BEGIN_DECLS
-char * ether_ntoa __P((const struct ether_addr *));
-struct ether_addr *
- ether_aton __P((const char *));
-int ether_ntohost __P((char *, const struct ether_addr *));
-int ether_hostton __P((const char *, struct ether_addr *));
-int ether_line __P((const char *, struct ether_addr *, char *));
+char* ether_ntoa __P((const struct ether_addr*)) __INTRODUCED_IN(21);
+struct ether_addr* ether_aton __P((const char*)) __INTRODUCED_IN(21);
__END_DECLS
#endif
diff --git a/libc/include/net/if_ieee1394.h b/libc/include/net/if_ieee1394.h
deleted file mode 100644
index 2f8a7c3..0000000
--- a/libc/include/net/if_ieee1394.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/* $NetBSD: if_ieee1394.h,v 1.6 2005/12/10 23:21:38 elad Exp $ */
-
-/*
- * Copyright (c) 2000 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Atsushi Onoe.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _NET_IF_IEEE1394_H_
-#define _NET_IF_IEEE1394_H_
-
-#include <sys/types.h>
-
-/* hardware address information for arp / nd */
-struct ieee1394_hwaddr {
- u_int8_t iha_uid[8]; /* node unique ID */
- u_int8_t iha_maxrec; /* max_rec in the config ROM */
- u_int8_t iha_speed; /* min of link/PHY speed */
- u_int8_t iha_offset[6]; /* unicast FIFO address */
-};
-
-/*
- * BPF wants to see one of these.
- */
-struct ieee1394_bpfhdr {
- uint8_t ibh_dhost[8];
- uint8_t ibh_shost[8];
- uint16_t ibh_type;
-};
-
-#ifdef _KERNEL
-
-/* pseudo header */
-struct ieee1394_header {
- u_int8_t ih_uid[8]; /* dst/src uid */
- u_int8_t ih_maxrec; /* dst maxrec for tx */
- u_int8_t ih_speed; /* speed */
- u_int8_t ih_offset[6]; /* dst offset */
-};
-
-/* unfragment encapsulation header */
-struct ieee1394_unfraghdr {
- u_int16_t iuh_ft; /* fragment type == 0 */
- u_int16_t iuh_etype; /* ether_type */
-};
-
-/* fragmented encapsulation header */
-struct ieee1394_fraghdr {
- u_int16_t ifh_ft_size; /* fragment type, data size-1 */
- u_int16_t ifh_etype_off; /* etype for first fragment */
- /* offset for subseq frag */
- u_int16_t ifh_dgl; /* datagram label */
- u_int16_t ifh_reserved;
-};
-
-#define IEEE1394_FT_SUBSEQ 0x8000
-#define IEEE1394_FT_MORE 0x4000
-
-#define IEEE1394MTU 1500
-
-#define IEEE1394_GASP_LEN 8 /* GASP header for Stream */
-#define IEEE1394_ADDR_LEN 8
-#define IEEE1394_CRC_LEN 4
-
-struct ieee1394_reass_pkt {
- LIST_ENTRY(ieee1394_reass_pkt) rp_next;
- struct mbuf *rp_m;
- u_int16_t rp_size;
- u_int16_t rp_etype;
- u_int16_t rp_off;
- u_int16_t rp_dgl;
- u_int16_t rp_len;
- u_int16_t rp_ttl;
-};
-
-struct ieee1394_reassq {
- LIST_ENTRY(ieee1394_reassq) rq_node;
- LIST_HEAD(, ieee1394_reass_pkt) rq_pkt;
- u_int32_t fr_id;
-};
-
-struct ieee1394com {
- struct ifnet fc_if;
- struct ieee1394_hwaddr ic_hwaddr;
- u_int16_t ic_dgl;
- LIST_HEAD(, ieee1394_reassq) ic_reassq;
-};
-
-const char *ieee1394_sprintf(const u_int8_t *);
-void ieee1394_input(struct ifnet *, struct mbuf *, u_int16_t);
-void ieee1394_ifattach(struct ifnet *, const struct ieee1394_hwaddr *);
-void ieee1394_ifdetach(struct ifnet *);
-int ieee1394_ioctl(struct ifnet *, u_long, caddr_t);
-struct mbuf * ieee1394_fragment(struct ifnet *, struct mbuf *, int, u_int16_t);
-void ieee1394_drain(struct ifnet *);
-void ieee1394_watchdog(struct ifnet *);
-#endif /* _KERNEL */
-
-#endif /* !_NET_IF_IEEE1394_H_ */
diff --git a/libc/include/netdb.h b/libc/include/netdb.h
index 3bb973c..6bcfdcd 100644
--- a/libc/include/netdb.h
+++ b/libc/include/netdb.h
@@ -199,49 +199,30 @@
#define h_errno (*__get_h_errno())
int* __get_h_errno(void);
/* BIONIC-END */
-void endhostent(void);
-void endnetent(void);
-void endnetgrent(void);
-void endprotoent(void);
void endservent(void);
-void freehostent(struct hostent *);
-struct hostent *gethostbyaddr(const void *, socklen_t, int);
-int gethostbyaddr_r(const void *, socklen_t, int, struct hostent *, char *, size_t, struct hostent **, int *);
-struct hostent *gethostbyname(const char *);
-int gethostbyname_r(const char *, struct hostent *, char *, size_t, struct hostent **, int *);
-struct hostent *gethostbyname2(const char *, int);
-int gethostbyname2_r(const char *, int, struct hostent *, char *, size_t, struct hostent **, int *);
-struct hostent *gethostent(void);
-int gethostent_r(struct hostent *, char *, size_t, struct hostent **, int *);
-struct hostent *getipnodebyaddr(const void *, size_t, int, int *);
-struct hostent *getipnodebyname(const char *, int, int, int *);
-struct netent *getnetbyaddr(uint32_t, int);
-int getnetbyaddr_r(uint32_t, int, struct netent *, char *, size_t, struct netent**, int *);
-struct netent *getnetbyname(const char *);
-int getnetbyname_r(const char *, struct netent *, char *, size_t, struct netent **, int *);
-struct netent *getnetent(void);
-int getnetent_r(struct netent *, char *, size_t, struct netent **, int *);
-int getnetgrent(char **, char **, char **);
-struct protoent *getprotobyname(const char *);
-int getprotobyname_r(const char *, struct protoent *, char *, size_t, struct protoent **);
-struct protoent *getprotobynumber(int);
-int getprotobynumber_r(int, struct protoent *, char *, size_t, struct protoent **);
-struct protoent *getprotoent(void);
-int getprotoent_r(struct protoent *, char *, size_t, struct protoent **);
-struct servent *getservbyname(const char *, const char *);
-struct servent *getservbyport(int, const char *);
-struct servent *getservent(void);
-void herror(const char *);
-const char *hstrerror(int);
-int innetgr(const char *, const char *, const char *, const char *);
-void sethostent(int);
-void setnetent(int);
-void setprotoent(int);
+struct hostent* gethostbyaddr(const void*, socklen_t, int);
+int gethostbyaddr_r(const void*, socklen_t, int, struct hostent*, char*, size_t, struct hostent**,
+ int*) __INTRODUCED_IN(23);
+struct hostent* gethostbyname(const char*);
+int gethostbyname_r(const char*, struct hostent*, char*, size_t, struct hostent**, int*);
+struct hostent* gethostbyname2(const char*, int);
+int gethostbyname2_r(const char*, int, struct hostent*, char*, size_t, struct hostent**, int*)
+ __INTRODUCED_IN(23);
+struct hostent* gethostent(void);
+struct netent* getnetbyaddr(uint32_t, int);
+struct netent* getnetbyname(const char*);
+struct protoent* getprotobyname(const char*);
+struct protoent* getprotobynumber(int);
+struct servent* getservbyname(const char*, const char*);
+struct servent* getservbyport(int, const char*);
+struct servent* getservent(void);
+void herror(const char*);
+const char* hstrerror(int);
+
int getaddrinfo(const char *, const char *, const struct addrinfo *, struct addrinfo **);
int getnameinfo(const struct sockaddr *, socklen_t, char *, size_t, char *, size_t, int);
void freeaddrinfo(struct addrinfo *);
const char *gai_strerror(int);
-void setnetgrent(const char *);
void setservent(int);
#pragma GCC visibility pop
diff --git a/libc/include/netinet/in.h b/libc/include/netinet/in.h
index 5f3d11f..b524b05 100644
--- a/libc/include/netinet/in.h
+++ b/libc/include/netinet/in.h
@@ -49,8 +49,8 @@
int bindresvport(int, struct sockaddr_in*);
-extern const struct in6_addr in6addr_any;
-extern const struct in6_addr in6addr_loopback;
+extern const struct in6_addr in6addr_any __INTRODUCED_IN(24);
+extern const struct in6_addr in6addr_loopback __INTRODUCED_IN(24);
__END_DECLS
diff --git a/libc/include/nl_types.h b/libc/include/nl_types.h
index 84227bd..bcaab06 100644
--- a/libc/include/nl_types.h
+++ b/libc/include/nl_types.h
@@ -39,9 +39,9 @@
typedef void* nl_catd;
typedef int nl_item;
-nl_catd catopen(const char*, int);
-char* catgets(nl_catd, int, int, const char*);
-int catclose(nl_catd);
+nl_catd catopen(const char*, int) __INTRODUCED_IN_FUTURE;
+char* catgets(nl_catd, int, int, const char*) __INTRODUCED_IN_FUTURE;
+int catclose(nl_catd) __INTRODUCED_IN_FUTURE;
__END_DECLS
diff --git a/libc/include/poll.h b/libc/include/poll.h
index 7c16d81..d75c2d0 100644
--- a/libc/include/poll.h
+++ b/libc/include/poll.h
@@ -39,14 +39,16 @@
typedef unsigned int nfds_t;
int poll(struct pollfd*, nfds_t, int);
-int ppoll(struct pollfd*, nfds_t, const struct timespec*, const sigset_t*);
+int ppoll(struct pollfd*, nfds_t, const struct timespec*, const sigset_t*) __INTRODUCED_IN(21);
-int __poll_chk(struct pollfd*, nfds_t, int, size_t);
+int __poll_chk(struct pollfd*, nfds_t, int, size_t) __INTRODUCED_IN(23);
int __poll_real(struct pollfd*, nfds_t, int) __RENAME(poll);
__errordecl(__poll_too_small_error, "poll: pollfd array smaller than fd count");
-int __ppoll_chk(struct pollfd*, nfds_t, const struct timespec*, const sigset_t*, size_t);
-int __ppoll_real(struct pollfd*, nfds_t, const struct timespec*, const sigset_t*) __RENAME(ppoll);
+int __ppoll_chk(struct pollfd*, nfds_t, const struct timespec*, const sigset_t*, size_t)
+ __INTRODUCED_IN(23);
+int __ppoll_real(struct pollfd*, nfds_t, const struct timespec*, const sigset_t*) __RENAME(ppoll)
+ __INTRODUCED_IN(21);
__errordecl(__ppoll_too_small_error, "ppoll: pollfd array smaller than fd count");
#if defined(__BIONIC_FORTIFY)
diff --git a/libc/include/pthread.h b/libc/include/pthread.h
index b409ff2..2df9b74 100644
--- a/libc/include/pthread.h
+++ b/libc/include/pthread.h
@@ -133,7 +133,7 @@
__BEGIN_DECLS
-int pthread_atfork(void (*)(void), void (*)(void), void(*)(void));
+int pthread_atfork(void (*)(void), void (*)(void), void (*)(void)) __INTRODUCED_IN(21);
int pthread_attr_destroy(pthread_attr_t*) __nonnull((1));
int pthread_attr_getdetachstate(const pthread_attr_t*, int*) __nonnull((1, 2));
@@ -153,10 +153,11 @@
int pthread_attr_setstacksize(pthread_attr_t*, size_t) __nonnull((1));
int pthread_condattr_destroy(pthread_condattr_t*) __nonnull((1));
-int pthread_condattr_getclock(const pthread_condattr_t*, clockid_t*) __nonnull((1, 2));
+int pthread_condattr_getclock(const pthread_condattr_t*, clockid_t*) __nonnull((1, 2))
+ __INTRODUCED_IN(21);
int pthread_condattr_getpshared(const pthread_condattr_t*, int*) __nonnull((1, 2));
int pthread_condattr_init(pthread_condattr_t*) __nonnull((1));
-int pthread_condattr_setclock(pthread_condattr_t*, clockid_t) __nonnull((1));
+int pthread_condattr_setclock(pthread_condattr_t*, clockid_t) __nonnull((1)) __INTRODUCED_IN(21);
int pthread_condattr_setpshared(pthread_condattr_t*, int) __nonnull((1));
int pthread_cond_broadcast(pthread_cond_t*) __nonnull((1));
@@ -180,7 +181,7 @@
void* pthread_getspecific(pthread_key_t);
-pid_t pthread_gettid_np(pthread_t);
+pid_t pthread_gettid_np(pthread_t) __INTRODUCED_IN(21);
int pthread_join(pthread_t, void**);
@@ -201,7 +202,8 @@
#else
int pthread_mutex_lock(pthread_mutex_t*) __nonnull((1));
#endif
-int pthread_mutex_timedlock(pthread_mutex_t*, const struct timespec*) __nonnull((1, 2));
+int pthread_mutex_timedlock(pthread_mutex_t*, const struct timespec*) __nonnull((1, 2))
+ __INTRODUCED_IN(21);
int pthread_mutex_trylock(pthread_mutex_t*) __nonnull((1));
#if !defined(__LP4__)
int pthread_mutex_unlock(pthread_mutex_t*) /* __nonnull((1)) */;
@@ -215,8 +217,9 @@
int pthread_rwlockattr_destroy(pthread_rwlockattr_t*) __nonnull((1));
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t*, int*) __nonnull((1, 2));
int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int) __nonnull((1));
-int pthread_rwlockattr_getkind_np(const pthread_rwlockattr_t*, int*) __nonnull((1, 2));
-int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t*, int) __nonnull((1));
+int pthread_rwlockattr_getkind_np(const pthread_rwlockattr_t*, int*) __nonnull((1, 2))
+ __INTRODUCED_IN(23);
+int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t*, int) __nonnull((1)) __INTRODUCED_IN(23);
int pthread_rwlock_destroy(pthread_rwlock_t*) __nonnull((1));
int pthread_rwlock_init(pthread_rwlock_t*, const pthread_rwlockattr_t*) __nonnull((1));
@@ -228,25 +231,28 @@
int pthread_rwlock_unlock(pthread_rwlock_t *) __nonnull((1));
int pthread_rwlock_wrlock(pthread_rwlock_t*) __nonnull((1));
-int pthread_barrierattr_init(pthread_barrierattr_t* attr) __nonnull((1));
-int pthread_barrierattr_destroy(pthread_barrierattr_t* attr) __nonnull((1));
-int pthread_barrierattr_getpshared(pthread_barrierattr_t* attr, int* pshared) __nonnull((1, 2));
-int pthread_barrierattr_setpshared(pthread_barrierattr_t* attr, int pshared) __nonnull((1));
+int pthread_barrierattr_init(pthread_barrierattr_t* attr) __nonnull((1)) __INTRODUCED_IN(24);
+int pthread_barrierattr_destroy(pthread_barrierattr_t* attr) __nonnull((1)) __INTRODUCED_IN(24);
+int pthread_barrierattr_getpshared(pthread_barrierattr_t* attr, int* pshared) __nonnull((1, 2))
+ __INTRODUCED_IN(24);
+int pthread_barrierattr_setpshared(pthread_barrierattr_t* attr, int pshared) __nonnull((1))
+ __INTRODUCED_IN(24);
-int pthread_barrier_init(pthread_barrier_t*, const pthread_barrierattr_t*, unsigned) __nonnull((1));
-int pthread_barrier_destroy(pthread_barrier_t*) __nonnull((1));
-int pthread_barrier_wait(pthread_barrier_t*) __nonnull((1));
+int pthread_barrier_init(pthread_barrier_t*, const pthread_barrierattr_t*, unsigned) __nonnull((1))
+ __INTRODUCED_IN(24);
+int pthread_barrier_destroy(pthread_barrier_t*) __nonnull((1)) __INTRODUCED_IN(24);
+int pthread_barrier_wait(pthread_barrier_t*) __nonnull((1)) __INTRODUCED_IN(24);
-int pthread_spin_destroy(pthread_spinlock_t*) __nonnull((1));
-int pthread_spin_init(pthread_spinlock_t*, int) __nonnull((1));
-int pthread_spin_lock(pthread_spinlock_t*) __nonnull((1));
-int pthread_spin_trylock(pthread_spinlock_t*) __nonnull((1));
-int pthread_spin_unlock(pthread_spinlock_t*) __nonnull((1));
+int pthread_spin_destroy(pthread_spinlock_t*) __nonnull((1)) __INTRODUCED_IN(24);
+int pthread_spin_init(pthread_spinlock_t*, int) __nonnull((1)) __INTRODUCED_IN(24);
+int pthread_spin_lock(pthread_spinlock_t*) __nonnull((1)) __INTRODUCED_IN(24);
+int pthread_spin_trylock(pthread_spinlock_t*) __nonnull((1)) __INTRODUCED_IN(24);
+int pthread_spin_unlock(pthread_spinlock_t*) __nonnull((1)) __INTRODUCED_IN(24);
pthread_t pthread_self(void) __pure2;
#if defined(__USE_GNU)
-int pthread_getname_np(pthread_t, char*, size_t) __nonnull((2));
+int pthread_getname_np(pthread_t, char*, size_t) __nonnull((2)) __INTRODUCED_IN_FUTURE;
#endif
/* TODO: this should be __USE_GNU too. */
int pthread_setname_np(pthread_t, const char*) __nonnull((2));
@@ -286,7 +292,6 @@
// Bionic additions that are deprecated even in the 32-bit ABI.
int pthread_cond_timedwait_relative_np(pthread_cond_t*, pthread_mutex_t*, const struct timespec*) __attribute__((deprecated("use pthread_cond_timedwait instead")));
-int pthread_cond_timeout_np(pthread_cond_t*, pthread_mutex_t*, unsigned) __attribute__((deprecated("use pthread_cond_timedwait instead")));
int pthread_mutex_lock_timeout_np(pthread_mutex_t*, unsigned) __attribute__((deprecated("use pthread_mutex_timedlock instead")));
diff --git a/libc/include/pty.h b/libc/include/pty.h
index bca1137..ec257a5 100644
--- a/libc/include/pty.h
+++ b/libc/include/pty.h
@@ -36,8 +36,8 @@
__BEGIN_DECLS
-int openpty(int*, int*, char*, const struct termios*, const struct winsize*);
-int forkpty(int*, char*, const struct termios*, const struct winsize*);
+int openpty(int*, int*, char*, const struct termios*, const struct winsize*) __INTRODUCED_IN(23);
+int forkpty(int*, char*, const struct termios*, const struct winsize*) __INTRODUCED_IN(23);
__END_DECLS
diff --git a/libc/include/pwd.h b/libc/include/pwd.h
index e32825e..96a1cd4 100644
--- a/libc/include/pwd.h
+++ b/libc/include/pwd.h
@@ -119,12 +119,13 @@
struct passwd* getpwnam(const char*);
struct passwd* getpwuid(uid_t);
/* Android has thousands and thousands of ids to iterate through */
-struct passwd* getpwent(void) __attribute__((warning("getpwent is inefficient on Android")));
-void setpwent(void);
-void endpwent(void);
+struct passwd* getpwent(void)
+ __attribute__((warning("getpwent is inefficient on Android"))) __INTRODUCED_IN_FUTURE;
+void setpwent(void) __INTRODUCED_IN_FUTURE;
+void endpwent(void) __INTRODUCED_IN_FUTURE;
-int getpwnam_r(const char*, struct passwd*, char*, size_t, struct passwd**);
-int getpwuid_r(uid_t, struct passwd*, char*, size_t, struct passwd**);
+int getpwnam_r(const char*, struct passwd*, char*, size_t, struct passwd**) __INTRODUCED_IN(21);
+int getpwuid_r(uid_t, struct passwd*, char*, size_t, struct passwd**) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/resolv.h b/libc/include/resolv.h
index c8899ed..b10aaf4 100644
--- a/libc/include/resolv.h
+++ b/libc/include/resolv.h
@@ -39,11 +39,6 @@
__BEGIN_DECLS
#pragma GCC visibility push(default)
-struct res_state;
-
-extern struct __res_state *__res_state(void);
-#define _res (*__res_state())
-
#define b64_ntop __b64_ntop
#define b64_pton __b64_pton
extern int b64_ntop(u_char const*, size_t, char*, size_t);
diff --git a/libc/include/sched.h b/libc/include/sched.h
index 0b9235b..a1f1dfa 100644
--- a/libc/include/sched.h
+++ b/libc/include/sched.h
@@ -53,9 +53,9 @@
#if defined(__USE_GNU)
extern int clone(int (*)(void*), void*, int, void*, ...);
-extern int unshare(int);
-extern int sched_getcpu(void);
-extern int setns(int, int);
+extern int unshare(int) __INTRODUCED_IN(21);
+extern int sched_getcpu(void) __INTRODUCED_IN(21);
+extern int setns(int, int) __INTRODUCED_IN(21);
#ifdef __LP64__
#define CPU_SETSIZE 1024
@@ -72,9 +72,9 @@
__CPU_BITTYPE __bits[ CPU_SETSIZE / __CPU_BITS ];
} cpu_set_t;
-extern int sched_setaffinity(pid_t pid, size_t setsize, const cpu_set_t* set);
+extern int sched_setaffinity(pid_t pid, size_t setsize, const cpu_set_t* set) __INTRODUCED_IN(21);
-extern int sched_getaffinity(pid_t pid, size_t setsize, cpu_set_t* set);
+extern int sched_getaffinity(pid_t pid, size_t setsize, cpu_set_t* set) __INTRODUCED_IN(21);
#define CPU_ZERO(set) CPU_ZERO_S(sizeof(cpu_set_t), set)
#define CPU_SET(cpu, set) CPU_SET_S(cpu, sizeof(cpu_set_t), set)
@@ -97,8 +97,8 @@
#define CPU_ALLOC(count) __sched_cpualloc((count))
#define CPU_FREE(set) __sched_cpufree((set))
-extern cpu_set_t* __sched_cpualloc(size_t count);
-extern void __sched_cpufree(cpu_set_t* set);
+extern cpu_set_t* __sched_cpualloc(size_t count) __INTRODUCED_IN(21);
+extern void __sched_cpufree(cpu_set_t* set) __INTRODUCED_IN(21);
#define CPU_ZERO_S(setsize, set) __builtin_memset(set, 0, setsize)
@@ -142,7 +142,7 @@
#define CPU_COUNT_S(setsize, set) __sched_cpucount((setsize), (set))
-extern int __sched_cpucount(size_t setsize, cpu_set_t* set);
+extern int __sched_cpucount(size_t setsize, cpu_set_t* set) __INTRODUCED_IN(21);
#endif /* __USE_GNU */
diff --git a/libc/include/search.h b/libc/include/search.h
index 9b01e12..1ac6d21 100644
--- a/libc/include/search.h
+++ b/libc/include/search.h
@@ -29,17 +29,20 @@
__BEGIN_DECLS
-void insque(void*, void*);
-void remque(void*);
+void insque(void*, void*) __INTRODUCED_IN(21);
+void remque(void*) __INTRODUCED_IN(21);
-void* lfind(const void*, const void*, size_t*, size_t, int (*)(const void*, const void*));
-void* lsearch(const void*, void*, size_t*, size_t, int (*)(const void*, const void*));
+void* lfind(const void*, const void*, size_t*, size_t, int (*)(const void*, const void*))
+ __INTRODUCED_IN(21);
+void* lsearch(const void*, void*, size_t*, size_t, int (*)(const void*, const void*))
+ __INTRODUCED_IN(21);
-void* tdelete(const void* __restrict, void** __restrict, int (*)(const void*, const void*));
-void tdestroy(void*, void (*)(void*));
-void* tfind(const void*, void* const*, int (*)(const void*, const void*));
-void* tsearch(const void*, void**, int (*)(const void*, const void*));
-void twalk(const void*, void (*)(const void*, VISIT, int));
+void* tdelete(const void* __restrict, void** __restrict, int (*)(const void*, const void*))
+ __INTRODUCED_IN(21);
+void tdestroy(void*, void (*)(void*)) __INTRODUCED_IN(21);
+void* tfind(const void*, void* const*, int (*)(const void*, const void*)) __INTRODUCED_IN(21);
+void* tsearch(const void*, void**, int (*)(const void*, const void*)) __INTRODUCED_IN(21);
+void twalk(const void*, void (*)(const void*, VISIT, int)) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sgtty.h b/libc/include/sgtty.h
deleted file mode 100644
index 1ac3100..0000000
--- a/libc/include/sgtty.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* $NetBSD: sgtty.h,v 1.8 2005/02/03 04:39:32 perry Exp $ */
-
-/*
- * Copyright (c) 1985, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)sgtty.h 8.1 (Berkeley) 6/2/93
- */
-
-#ifndef _SGTTY_H_
-#define _SGTTY_H_
-
-#ifndef USE_OLD_TTY
-#define USE_OLD_TTY
-#endif
-#include <sys/ioctl.h>
-#include <sys/cdefs.h>
-
-__BEGIN_DECLS
-int gtty(int, struct sgttyb *);
-int stty(int, struct sgttyb *);
-__END_DECLS
-
-#endif /* _SGTTY_H_ */
diff --git a/libc/include/signal.h b/libc/include/signal.h
index 5679402..4b5e4ac 100644
--- a/libc/include/signal.h
+++ b/libc/include/signal.h
@@ -72,8 +72,8 @@
/* We take a few real-time signals for ourselves. May as well use the same names as glibc. */
#define SIGRTMIN (__libc_current_sigrtmin())
#define SIGRTMAX (__libc_current_sigrtmax())
-extern int __libc_current_sigrtmin(void);
-extern int __libc_current_sigrtmax(void);
+extern int __libc_current_sigrtmin(void) __INTRODUCED_IN(21);
+extern int __libc_current_sigrtmax(void) __INTRODUCED_IN(21);
extern const char* const sys_siglist[];
extern const char* const sys_signame[]; /* BSD compatibility. */
@@ -125,11 +125,18 @@
extern int sigsuspend(const sigset_t*) __nonnull((1));
extern int sigwait(const sigset_t*, int*) __nonnull((1, 2));
-extern int sighold(int) __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead")));
-extern int sigignore(int) __attribute__((deprecated("use sigaction() instead")));
-extern int sigpause(int) __attribute__((deprecated("use sigsuspend() instead")));
-extern int sigrelse(int) __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead")));
-extern sighandler_t sigset(int, sighandler_t) __attribute__((deprecated("use sigaction() instead")));
+extern int sighold(int)
+ __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead")))
+ __INTRODUCED_IN_FUTURE;
+extern int sigignore(int)
+ __attribute__((deprecated("use sigaction() instead"))) __INTRODUCED_IN_FUTURE;
+extern int sigpause(int)
+ __attribute__((deprecated("use sigsuspend() instead"))) __INTRODUCED_IN_FUTURE;
+extern int sigrelse(int)
+ __attribute__((deprecated("use sigprocmask() or pthread_sigmask() instead")))
+ __INTRODUCED_IN_FUTURE;
+extern sighandler_t sigset(int, sighandler_t)
+ __attribute__((deprecated("use sigaction() instead"))) __INTRODUCED_IN_FUTURE;
extern int raise(int);
extern int kill(pid_t, int);
@@ -137,15 +144,15 @@
extern int sigaltstack(const stack_t*, stack_t*);
-extern void psiginfo(const siginfo_t*, const char*);
-extern void psignal(int, const char*);
+extern void psiginfo(const siginfo_t*, const char*) __INTRODUCED_IN(21);
+extern void psignal(int, const char*) __INTRODUCED_IN(21);
extern int pthread_kill(pthread_t, int);
extern int pthread_sigmask(int, const sigset_t*, sigset_t*);
-extern int sigqueue(pid_t, int, const union sigval);
-extern int sigtimedwait(const sigset_t*, siginfo_t*, const struct timespec*);
-extern int sigwaitinfo(const sigset_t*, siginfo_t*);
+extern int sigqueue(pid_t, int, const union sigval) __INTRODUCED_IN(23);
+extern int sigtimedwait(const sigset_t*, siginfo_t*, const struct timespec*) __INTRODUCED_IN(23);
+extern int sigwaitinfo(const sigset_t*, siginfo_t*) __INTRODUCED_IN(23);
__END_DECLS
diff --git a/libc/include/stdio.h b/libc/include/stdio.h
index 623995b..05f2d98 100644
--- a/libc/include/stdio.h
+++ b/libc/include/stdio.h
@@ -55,9 +55,9 @@
struct __sFILE;
typedef struct __sFILE FILE;
-extern FILE* stdin;
-extern FILE* stdout;
-extern FILE* stderr;
+extern FILE* stdin __INTRODUCED_IN(23);
+extern FILE* stdout __INTRODUCED_IN(23);
+extern FILE* stderr __INTRODUCED_IN(23);
/* C99 and earlier plus current C++ standards say these must be macros. */
#define stdin stdin
#define stdout stdout
@@ -119,9 +119,8 @@
size_t fwrite(const void * __restrict, size_t, size_t, FILE * __restrict);
int getc(FILE *);
int getchar(void);
-ssize_t getdelim(char ** __restrict, size_t * __restrict, int,
- FILE * __restrict);
-ssize_t getline(char ** __restrict, size_t * __restrict, FILE * __restrict);
+ssize_t getdelim(char** __restrict, size_t* __restrict, int, FILE* __restrict) __INTRODUCED_IN(21);
+ssize_t getline(char** __restrict, size_t* __restrict, FILE* __restrict) __INTRODUCED_IN(21);
void perror(const char *);
int printf(const char * __restrict, ...)
@@ -143,8 +142,8 @@
int vprintf(const char * __restrict, __va_list)
__printflike(1, 0);
-int dprintf(int, const char * __restrict, ...) __printflike(2, 3);
-int vdprintf(int, const char * __restrict, __va_list) __printflike(2, 0);
+int dprintf(int, const char* __restrict, ...) __printflike(2, 3) __INTRODUCED_IN(21);
+int vdprintf(int, const char* __restrict, __va_list) __printflike(2, 0) __INTRODUCED_IN(21);
#ifndef __AUDIT__
#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L
@@ -192,24 +191,22 @@
int (*)(void*));
# endif
#endif
-int fgetpos64(FILE*, fpos64_t*);
-int fsetpos64(FILE*, const fpos64_t*);
-int fseeko64(FILE*, off64_t, int);
-off64_t ftello64(FILE*);
+int fgetpos64(FILE*, fpos64_t*) __INTRODUCED_IN(24);
+int fsetpos64(FILE*, const fpos64_t*) __INTRODUCED_IN(24);
+int fseeko64(FILE*, off64_t, int) __INTRODUCED_IN(24);
+off64_t ftello64(FILE*) __INTRODUCED_IN(24);
#if defined(__USE_BSD)
-FILE* funopen64(const void*,
- int (*)(void*, char*, int),
- int (*)(void*, const char*, int),
- fpos64_t (*)(void*, fpos64_t, int),
- int (*)(void*));
+FILE* funopen64(const void*, int (*)(void*, char*, int), int (*)(void*, const char*, int),
+ fpos64_t (*)(void*, fpos64_t, int), int (*)(void*)) __INTRODUCED_IN(24);
#endif
FILE* fopen(const char* __restrict, const char* __restrict);
-FILE* fopen64(const char* __restrict, const char* __restrict);
+FILE* fopen64(const char* __restrict, const char* __restrict) __INTRODUCED_IN(24);
FILE* freopen(const char* __restrict, const char* __restrict, FILE* __restrict);
-FILE* freopen64(const char* __restrict, const char* __restrict, FILE* __restrict);
+FILE* freopen64(const char* __restrict, const char* __restrict, FILE* __restrict)
+ __INTRODUCED_IN(24);
FILE* tmpfile(void);
-FILE* tmpfile64(void);
+FILE* tmpfile64(void) __INTRODUCED_IN(24);
#if __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE
int snprintf(char * __restrict, size_t, const char * __restrict, ...)
@@ -254,8 +251,8 @@
#endif /* __POSIX_VISIBLE >= 199506 */
#if __POSIX_VISIBLE >= 200809
-FILE* fmemopen(void*, size_t, const char*);
-FILE* open_memstream(char**, size_t*);
+FILE* fmemopen(void*, size_t, const char*) __INTRODUCED_IN(23);
+FILE* open_memstream(char**, size_t*) __INTRODUCED_IN(23);
#endif /* __POSIX_VISIBLE >= 200809 */
#endif /* __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE */
@@ -274,26 +271,28 @@
__va_list)
__printflike(2, 0);
-void clearerr_unlocked(FILE*);
-int feof_unlocked(FILE*);
-int ferror_unlocked(FILE*);
-int fileno_unlocked(FILE*);
+void clearerr_unlocked(FILE*) __INTRODUCED_IN(23);
+int feof_unlocked(FILE*) __INTRODUCED_IN(23);
+int ferror_unlocked(FILE*) __INTRODUCED_IN(23);
+int fileno_unlocked(FILE*) __INTRODUCED_IN(24);
#define fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
#define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
#endif /* __BSD_VISIBLE */
-extern char* __fgets_chk(char*, int, FILE*, size_t);
+extern char* __fgets_chk(char*, int, FILE*, size_t) __INTRODUCED_IN(21);
extern char* __fgets_real(char*, int, FILE*) __RENAME(fgets);
__errordecl(__fgets_too_big_error, "fgets called with size bigger than buffer");
__errordecl(__fgets_too_small_error, "fgets called with size less than zero");
-extern size_t __fread_chk(void * __restrict, size_t, size_t, FILE * __restrict, size_t);
+extern size_t __fread_chk(void* __restrict, size_t, size_t, FILE* __restrict, size_t)
+ __INTRODUCED_IN(24);
extern size_t __fread_real(void * __restrict, size_t, size_t, FILE * __restrict) __RENAME(fread);
__errordecl(__fread_too_big_error, "fread called with size * count bigger than buffer");
__errordecl(__fread_overflow, "fread called with overflowing size * count");
-extern size_t __fwrite_chk(const void * __restrict, size_t, size_t, FILE * __restrict, size_t);
+extern size_t __fwrite_chk(const void* __restrict, size_t, size_t, FILE* __restrict, size_t)
+ __INTRODUCED_IN(24);
extern size_t __fwrite_real(const void * __restrict, size_t, size_t, FILE * __restrict) __RENAME(fwrite);
__errordecl(__fwrite_too_big_error, "fwrite called with size * count bigger than buffer");
__errordecl(__fwrite_overflow, "fwrite called with overflowing size * count");
diff --git a/libc/include/stdio_ext.h b/libc/include/stdio_ext.h
index f299e54..fdf6772 100644
--- a/libc/include/stdio_ext.h
+++ b/libc/include/stdio_ext.h
@@ -38,16 +38,14 @@
__BEGIN_DECLS
-size_t __fbufsize(FILE*);
-int __freading(FILE*);
-int __fwriting(FILE*);
-int __freadable(FILE*);
-int __fwritable(FILE*);
-int __flbf(FILE*);
-void __fpurge(FILE*);
-size_t __fpending(FILE*);
-void _flushlbf(void);
-int __fsetlocking(FILE*, int);
+size_t __fbufsize(FILE*) __INTRODUCED_IN(23);
+int __freadable(FILE*) __INTRODUCED_IN(23);
+int __fwritable(FILE*) __INTRODUCED_IN(23);
+int __flbf(FILE*) __INTRODUCED_IN(23);
+void __fpurge(FILE*) __INTRODUCED_IN(23);
+size_t __fpending(FILE*) __INTRODUCED_IN(23);
+void _flushlbf(void) __INTRODUCED_IN(23);
+int __fsetlocking(FILE*, int) __INTRODUCED_IN(23);
__END_DECLS
diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h
index d0fb0e8..b3e52d5 100644
--- a/libc/include/stdlib.h
+++ b/libc/include/stdlib.h
@@ -43,7 +43,7 @@
extern __noreturn void abort(void);
extern __noreturn void exit(int);
-extern __noreturn void _Exit(int);
+extern __noreturn void _Exit(int) __INTRODUCED_IN(21);
extern int atexit(void (*)(void));
#if __ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L
@@ -60,13 +60,13 @@
extern char* mkdtemp(char*);
extern char* mktemp(char*) __attribute__((deprecated("mktemp is unsafe, use mkstemp or tmpfile instead")));
-extern int mkostemp64(char*, int);
-extern int mkostemp(char*, int);
-extern int mkostemps64(char*, int, int);
-extern int mkostemps(char*, int, int);
-extern int mkstemp64(char*);
+extern int mkostemp64(char*, int) __INTRODUCED_IN(23);
+extern int mkostemp(char*, int) __INTRODUCED_IN(23);
+extern int mkostemps64(char*, int, int) __INTRODUCED_IN(23);
+extern int mkostemps(char*, int, int) __INTRODUCED_IN(23);
+extern int mkstemp64(char*) __INTRODUCED_IN(21);
extern int mkstemp(char*);
-extern int mkstemps64(char*, int);
+extern int mkstemps64(char*, int) __INTRODUCED_IN(23);
extern int mkstemps(char*, int);
extern long strtol(const char *, char **, int);
@@ -74,17 +74,19 @@
extern unsigned long strtoul(const char *, char **, int);
extern unsigned long long strtoull(const char *, char **, int);
-extern int posix_memalign(void **memptr, size_t alignment, size_t size);
+extern int posix_memalign(void** memptr, size_t alignment, size_t size) __INTRODUCED_IN(16);
__BIONIC_LEGACY_INLINE double atof(const char*);
extern double strtod(const char*, char**) __LIBC_ABI_PUBLIC__;
__BIONIC_LEGACY_INLINE float strtof(const char*, char**) __LIBC_ABI_PUBLIC__;
-extern long double strtold(const char*, char**) __LIBC_ABI_PUBLIC__;
+extern long double strtold(const char*, char**) __LIBC_ABI_PUBLIC__ __INTRODUCED_IN(21);
-extern long double strtold_l(const char *, char **, locale_t) __LIBC_ABI_PUBLIC__;
-extern long long strtoll_l(const char *, char **, int, locale_t) __LIBC_ABI_PUBLIC__;
-extern unsigned long long strtoull_l(const char *, char **, int, locale_t) __LIBC_ABI_PUBLIC__;
+extern long double strtold_l(const char*, char**, locale_t) __LIBC_ABI_PUBLIC__ __INTRODUCED_IN(21);
+extern long long strtoll_l(const char*, char**, int, locale_t) __LIBC_ABI_PUBLIC__
+ __INTRODUCED_IN(21);
+extern unsigned long long strtoull_l(const char*, char**, int, locale_t) __LIBC_ABI_PUBLIC__
+ __INTRODUCED_IN(21);
extern int atoi(const char*) __purefunc;
extern long atol(const char*) __purefunc;
@@ -110,32 +112,32 @@
#define RAND_MAX 0x7fffffff
__BIONIC_LEGACY_INLINE int rand(void);
-int rand_r(unsigned int*);
+int rand_r(unsigned int*) __INTRODUCED_IN(21);
__BIONIC_LEGACY_INLINE void srand(unsigned int);
double drand48(void);
double erand48(unsigned short[3]);
long jrand48(unsigned short[3]);
-void lcong48(unsigned short[7]);
+void lcong48(unsigned short[7]) __INTRODUCED_IN(23);
long lrand48(void);
long mrand48(void);
long nrand48(unsigned short[3]);
unsigned short* seed48(unsigned short[3]);
void srand48(long);
-char* initstate(unsigned int, char*, size_t);
+char* initstate(unsigned int, char*, size_t) __INTRODUCED_IN(21);
__BIONIC_LEGACY_INLINE long random(void);
-char* setstate(char*);
+char* setstate(char*) __INTRODUCED_IN(21);
__BIONIC_LEGACY_INLINE void srandom(unsigned int);
int getpt(void);
__BIONIC_LEGACY_INLINE int grantpt(int);
-int posix_openpt(int);
+int posix_openpt(int) __INTRODUCED_IN(21);
char* ptsname(int);
int ptsname_r(int, char*, size_t);
int unlockpt(int);
-int getsubopt(char**, char* const*, char**);
+int getsubopt(char**, char* const*, char**) __INTRODUCED_IN_FUTURE;
typedef struct {
int quot;
@@ -159,19 +161,16 @@
extern lldiv_t lldiv(long long, long long) __pure2;
/* BSD compatibility. */
-extern const char* getprogname(void);
-extern void setprogname(const char*);
+extern const char* getprogname(void) __INTRODUCED_IN(21);
+extern void setprogname(const char*) __INTRODUCED_IN(21);
-/* make STLPort happy */
-extern int mblen(const char *, size_t);
-extern size_t mbstowcs(wchar_t *, const char *, size_t);
-extern int mbtowc(wchar_t *, const char *, size_t);
+int mblen(const char*, size_t) __INTRODUCED_IN_FUTURE;
+size_t mbstowcs(wchar_t*, const char*, size_t);
+int mbtowc(wchar_t*, const char*, size_t) __INTRODUCED_IN(21);
+int wctomb(char*, wchar_t) __INTRODUCED_IN(21);
+size_t wcstombs(char*, const wchar_t*, size_t);
-/* Likewise, make libstdc++-v3 happy. */
-extern int wctomb(char *, wchar_t);
-extern size_t wcstombs(char *, const wchar_t *, size_t);
-
-extern size_t __ctype_get_mb_cur_max(void);
+extern size_t __ctype_get_mb_cur_max(void) __INTRODUCED_IN(21);
#define MB_CUR_MAX __ctype_get_mb_cur_max()
#if defined(__BIONIC_FORTIFY)
diff --git a/libc/include/string.h b/libc/include/string.h
index dada52b..3f98af1 100644
--- a/libc/include/string.h
+++ b/libc/include/string.h
@@ -47,30 +47,30 @@
extern int memcmp(const void *, const void *, size_t) __purefunc;
extern void* memcpy(void* __restrict, const void* __restrict, size_t);
#if defined(__USE_GNU)
-extern void* mempcpy(void* __restrict, const void* __restrict, size_t);
+extern void* mempcpy(void* __restrict, const void* __restrict, size_t) __INTRODUCED_IN(23);
#endif
extern void* memmove(void *, const void *, size_t);
extern void* memset(void *, int, size_t);
extern void* memmem(const void *, size_t, const void *, size_t) __purefunc;
extern char* strchr(const char *, int) __purefunc;
-extern char* __strchr_chk(const char *, int, size_t);
+extern char* __strchr_chk(const char*, int, size_t) __INTRODUCED_IN(21);
#if defined(__USE_GNU)
#if defined(__cplusplus)
extern "C++" char* strchrnul(char*, int) __RENAME(strchrnul) __purefunc;
extern "C++" const char* strchrnul(const char*, int) __RENAME(strchrnul) __purefunc;
#else
-char* strchrnul(const char*, int) __purefunc;
+char* strchrnul(const char*, int) __purefunc __INTRODUCED_IN(24);
#endif
#endif
extern char* strrchr(const char *, int) __purefunc;
-extern char* __strrchr_chk(const char *, int, size_t);
+extern char* __strrchr_chk(const char*, int, size_t) __INTRODUCED_IN(21);
extern size_t strlen(const char *) __purefunc;
-extern size_t __strlen_chk(const char *, size_t);
+extern size_t __strlen_chk(const char*, size_t) __INTRODUCED_IN(21);
extern int strcmp(const char *, const char *) __purefunc;
-extern char* stpcpy(char* __restrict, const char* __restrict);
+extern char* stpcpy(char* __restrict, const char* __restrict) __INTRODUCED_IN(21);
extern char* strcpy(char* __restrict, const char* __restrict);
extern char* strcat(char* __restrict, const char* __restrict);
@@ -82,9 +82,9 @@
extern char* strtok_r(char* __restrict, const char* __restrict, char** __restrict);
extern char* strerror(int);
-extern char* strerror_l(int, locale_t);
+extern char* strerror_l(int, locale_t) __INTRODUCED_IN(23);
#if defined(__USE_GNU)
-extern char* strerror_r(int, char*, size_t) __RENAME(__gnu_strerror_r);
+extern char* strerror_r(int, char*, size_t) __RENAME(__gnu_strerror_r) __INTRODUCED_IN(23);
#else /* POSIX */
extern int strerror_r(int, char*, size_t);
#endif
@@ -93,7 +93,7 @@
extern char* strncat(char* __restrict, const char* __restrict, size_t);
extern char* strndup(const char *, size_t);
extern int strncmp(const char *, const char *, size_t) __purefunc;
-extern char* stpncpy(char* __restrict, const char* __restrict, size_t);
+extern char* stpncpy(char* __restrict, const char* __restrict, size_t) __INTRODUCED_IN(21);
extern char* strncpy(char* __restrict, const char* __restrict, size_t);
extern size_t strlcat(char* __restrict, const char* __restrict, size_t);
@@ -109,8 +109,9 @@
extern int strcoll(const char *, const char *) __purefunc;
extern size_t strxfrm(char* __restrict, const char* __restrict, size_t);
-extern int strcoll_l(const char *, const char *, locale_t) __purefunc;
-extern size_t strxfrm_l(char* __restrict, const char* __restrict, size_t, locale_t);
+extern int strcoll_l(const char*, const char*, locale_t) __purefunc __INTRODUCED_IN(21);
+extern size_t strxfrm_l(char* __restrict, const char* __restrict, size_t, locale_t)
+ __INTRODUCED_IN(21);
#if defined(__USE_GNU) && !defined(basename)
/*
@@ -122,23 +123,26 @@
extern "C++" char* basename(char*) __RENAME(__gnu_basename) __nonnull((1));
extern "C++" const char* basename(const char*) __RENAME(__gnu_basename) __nonnull((1));
#else
-extern char* basename(const char*) __RENAME(__gnu_basename) __nonnull((1));
+extern char* basename(const char*) __RENAME(__gnu_basename) __nonnull((1)) __INTRODUCED_IN(23);
#endif
#endif
-extern void* __memchr_chk(const void*, int, size_t, size_t);
+extern void* __memchr_chk(const void*, int, size_t, size_t) __INTRODUCED_IN(23);
__errordecl(__memchr_buf_size_error, "memchr called with size bigger than buffer");
-extern void* __memrchr_chk(const void*, int, size_t, size_t);
+extern void* __memrchr_chk(const void*, int, size_t, size_t) __INTRODUCED_IN(23);
__errordecl(__memrchr_buf_size_error, "memrchr called with size bigger than buffer");
extern void* __memrchr_real(const void*, int, size_t) __RENAME(memrchr);
-extern char* __stpncpy_chk2(char* __restrict, const char* __restrict, size_t, size_t, size_t);
-extern char* __strncpy_chk2(char* __restrict, const char* __restrict, size_t, size_t, size_t);
+extern char* __stpncpy_chk2(char* __restrict, const char* __restrict, size_t, size_t, size_t)
+ __INTRODUCED_IN(21);
+extern char* __strncpy_chk2(char* __restrict, const char* __restrict, size_t, size_t, size_t)
+ __INTRODUCED_IN(21);
extern size_t __strlcpy_real(char* __restrict, const char* __restrict, size_t) __RENAME(strlcpy);
-extern size_t __strlcpy_chk(char *, const char *, size_t, size_t);
+extern size_t __strlcpy_chk(char*, const char*, size_t, size_t) __INTRODUCED_IN(21);
extern size_t __strlcat_real(char* __restrict, const char* __restrict, size_t) __RENAME(strlcat);
-extern size_t __strlcat_chk(char* __restrict, const char* __restrict, size_t, size_t);
+extern size_t __strlcat_chk(char* __restrict, const char* __restrict, size_t, size_t)
+ __INTRODUCED_IN(21);
#if defined(__BIONIC_FORTIFY)
diff --git a/libc/include/strings.h b/libc/include/strings.h
index 1200e77..ca9f658 100644
--- a/libc/include/strings.h
+++ b/libc/include/strings.h
@@ -54,7 +54,11 @@
#define bzero(b, len) (void)(__builtin_memset((b), '\0', (len)))
#endif
+#if defined(__i386__)
+int ffs(int) __INTRODUCED_IN(21);
+#else
int ffs(int);
+#endif
__END_DECLS
diff --git a/libc/include/sys/auxv.h b/libc/include/sys/auxv.h
index 0d753c3..4611fcc 100644
--- a/libc/include/sys/auxv.h
+++ b/libc/include/sys/auxv.h
@@ -33,7 +33,7 @@
__BEGIN_DECLS
-unsigned long int getauxval(unsigned long int type);
+unsigned long int getauxval(unsigned long int type) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h
index 2bd058e..3fcf163 100644
--- a/libc/include/sys/cdefs.h
+++ b/libc/include/sys/cdefs.h
@@ -451,15 +451,23 @@
#ifdef __clang__
#define __AVAILABILITY(...) __attribute__((availability(android,__VA_ARGS__)))
+#else
+#define __AVAILABILITY(...)
+#endif // __clang__
+
#define __INTRODUCED_IN(api_level) __AVAILABILITY(introduced=api_level)
#define __DEPRECATED_IN(api_level) __AVAILABILITY(deprecated=api_level)
#define __REMOVED_IN(api_level) __AVAILABILITY(obsoleted=api_level)
+
+#define __INTRODUCED_IN_FUTURE __INTRODUCED_IN(10000)
+
+#if __LP64__
+#define __INTRODUCED_IN_32(api_level)
+#define __INTRODUCED_IN_64 __INTRODUCED_IN
#else
-#define __AVAILABILITY(...)
-#define __INTRODUCED_IN(api_level)
-#define __DEPRECATED_IN(api_level)
-#define __REMOVED_IN(api_level)
-#endif // __clang__
+#define __INTRODUCED_IN_32 __INTRODUCED_IN
+#define __INTRODUCED_IN_64(api_level)
+#endif
#if __has_builtin(__builtin_umul_overflow) || __GNUC__ >= 5
#if __LP64__
diff --git a/libc/include/sys/endian.h b/libc/include/sys/endian.h
index 60cc030..449e0d7 100644
--- a/libc/include/sys/endian.h
+++ b/libc/include/sys/endian.h
@@ -49,10 +49,10 @@
/* glibc compatibility. */
__BEGIN_DECLS
-uint32_t htonl(uint32_t) __pure2;
-uint16_t htons(uint16_t) __pure2;
-uint32_t ntohl(uint32_t) __pure2;
-uint16_t ntohs(uint16_t) __pure2;
+uint32_t htonl(uint32_t) __pure2 __INTRODUCED_IN(21);
+uint16_t htons(uint16_t) __pure2 __INTRODUCED_IN(21);
+uint32_t ntohl(uint32_t) __pure2 __INTRODUCED_IN(21);
+uint16_t ntohs(uint16_t) __pure2 __INTRODUCED_IN(21);
__END_DECLS
#define htonl(x) __swap32(x)
diff --git a/libc/include/sys/epoll.h b/libc/include/sys/epoll.h
index 4a5a37c..4ec8969 100644
--- a/libc/include/sys/epoll.h
+++ b/libc/include/sys/epoll.h
@@ -74,10 +74,10 @@
;
int epoll_create(int);
-int epoll_create1(int);
+int epoll_create1(int) __INTRODUCED_IN(21);
int epoll_ctl(int, int, int, struct epoll_event*);
int epoll_wait(int, struct epoll_event*, int, int);
-int epoll_pwait(int, struct epoll_event*, int, int, const sigset_t*);
+int epoll_pwait(int, struct epoll_event*, int, int, const sigset_t*) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/fsuid.h b/libc/include/sys/fsuid.h
index 03355b7..223db90 100644
--- a/libc/include/sys/fsuid.h
+++ b/libc/include/sys/fsuid.h
@@ -34,8 +34,8 @@
__BEGIN_DECLS
-extern int setfsuid(uid_t);
-extern int setfsgid(gid_t);
+extern int setfsuid(uid_t) __INTRODUCED_IN(21);
+extern int setfsgid(gid_t) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/inotify.h b/libc/include/sys/inotify.h
index dcdd29a..dcf0e1d 100644
--- a/libc/include/sys/inotify.h
+++ b/libc/include/sys/inotify.h
@@ -41,7 +41,7 @@
#define IN_NONBLOCK O_NONBLOCK
extern int inotify_init(void);
-extern int inotify_init1(int);
+extern int inotify_init1(int) __INTRODUCED_IN(21);
extern int inotify_add_watch(int, const char*, uint32_t);
extern int inotify_rm_watch(int, uint32_t);
diff --git a/libc/include/sys/ioctl.h b/libc/include/sys/ioctl.h
index ed261f2..efbcb0c 100644
--- a/libc/include/sys/ioctl.h
+++ b/libc/include/sys/ioctl.h
@@ -37,7 +37,6 @@
#include <linux/termios.h>
#include <asm/ioctls.h>
#include <asm/termbits.h>
-#include <sys/ioctl_compat.h>
#include <linux/tty.h>
#include <bits/ioctl.h>
diff --git a/libc/include/sys/ioctl_compat.h b/libc/include/sys/ioctl_compat.h
deleted file mode 100644
index d9ba4c7..0000000
--- a/libc/include/sys/ioctl_compat.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/* $NetBSD: ioctl_compat.h,v 1.15 2005/12/03 17:10:46 christos Exp $ */
-
-/*
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- * (c) UNIX System Laboratories, Inc.
- * All or some portions of this file are derived from material licensed
- * to the University of California by American Telephone and Telegraph
- * Co. or Unix System Laboratories, Inc. and are reproduced herein with
- * the permission of UNIX System Laboratories, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ioctl_compat.h 8.4 (Berkeley) 1/21/94
- */
-
-#ifndef _SYS_IOCTL_COMPAT_H_
-#define _SYS_IOCTL_COMPAT_H_
-
-/*#include <sys/ttychars.h>*/
-/*#include <sys/ttydev.h>*/
-
-#if !defined(__mips__)
-struct tchars {
- char t_intrc; /* interrupt */
- char t_quitc; /* quit */
- char t_startc; /* start output */
- char t_stopc; /* stop output */
- char t_eofc; /* end-of-file */
- char t_brkc; /* input delimiter (like nl) */
-};
-
-struct ltchars {
- char t_suspc; /* stop process signal */
- char t_dsuspc; /* delayed stop process signal */
- char t_rprntc; /* reprint line */
- char t_flushc; /* flush output (toggles) */
- char t_werasc; /* word erase */
- char t_lnextc; /* literal next character */
-};
-
-/*
- * Structure for TIOCGETP and TIOCSETP ioctls.
- */
-#ifndef _SGTTYB_
-#define _SGTTYB_
-struct sgttyb {
- char sg_ispeed; /* input speed */
- char sg_ospeed; /* output speed */
- char sg_erase; /* erase character */
- char sg_kill; /* kill character */
- short sg_flags; /* mode flags */
-};
-#endif
-#endif
-
-#ifdef USE_OLD_TTY
-# undef TIOCGETD
-# define TIOCGETD _IOR('t', 0, int) /* get line discipline */
-# undef TIOCSETD
-# define TIOCSETD _IOW('t', 1, int) /* set line discipline */
-#else
-# define OTIOCGETD _IOR('t', 0, int) /* get line discipline */
-# define OTIOCSETD _IOW('t', 1, int) /* set line discipline */
-#endif
-#define TIOCHPCL _IO('t', 2) /* hang up on last close */
-#if !defined(__mips__)
-#define TIOCGETP _IOR('t', 8,struct sgttyb)/* get parameters -- gtty */
-#define TIOCSETP _IOW('t', 9,struct sgttyb)/* set parameters -- stty */
-#define TIOCSETN _IOW('t',10,struct sgttyb)/* as above, but no flushtty*/
-#endif
-#define TIOCSETC _IOW('t',17,struct tchars)/* set special characters */
-#define TIOCGETC _IOR('t',18,struct tchars)/* get special characters */
-#if 0
-/* BUG: a bunch of these conflict with #defines in asm/termbits.h */
-#define TANDEM 0x00000001 /* send stopc on out q full */
-#define CBREAK 0x00000002 /* half-cooked mode */
-#define LCASE 0x00000004 /* simulate lower case */
-#define ECHO 0x00000008 /* enable echoing */
-#define CRMOD 0x00000010 /* map \r to \r\n on output */
-#define RAW 0x00000020 /* no i/o processing */
-#define ODDP 0x00000040 /* get/send odd parity */
-#define EVENP 0x00000080 /* get/send even parity */
-#define ANYP 0x000000c0 /* get any parity/send none */
-#define NLDELAY 0x00000300 /* \n delay */
-#define NL0 0x00000000
-#define NL1 0x00000100 /* tty 37 */
-#define NL2 0x00000200 /* vt05 */
-#define NL3 0x00000300
-#define TBDELAY 0x00000c00 /* horizontal tab delay */
-#define TAB0 0x00000000
-#define TAB1 0x00000400 /* tty 37 */
-#define TAB2 0x00000800
-#define XTABS 0x00000c00 /* expand tabs on output */
-#define CRDELAY 0x00003000 /* \r delay */
-#define CR0 0x00000000
-#define CR1 0x00001000 /* tn 300 */
-#define CR2 0x00002000 /* tty 37 */
-#define CR3 0x00003000 /* concept 100 */
-#define VTDELAY 0x00004000 /* vertical tab delay */
-#define FF0 0x00000000
-#define FF1 0x00004000 /* tty 37 */
-#define BSDELAY 0x00008000 /* \b delay */
-#define BS0 0x00000000
-#define BS1 0x00008000
-#define ALLDELAY (NLDELAY|TBDELAY|CRDELAY|VTDELAY|BSDELAY)
-#define CRTBS 0x00010000 /* do backspacing for crt */
-#define PRTERA 0x00020000 /* \ ... / erase */
-#define CRTERA 0x00040000 /* " \b " to wipe out char */
-#define TILDE 0x00080000 /* hazeltine tilde kludge */
-#define MDMBUF 0x00100000 /* DTR/DCD hardware flow control */
-#define LITOUT 0x00200000 /* literal output */
-#define TOSTOP 0x00400000 /* stop background jobs on output */
-#define FLUSHO 0x00800000 /* output being flushed (state) */
-#define NOHANG 0x01000000 /* (no-op) was no SIGHUP on carrier drop */
-#define L001000 0x02000000
-#define CRTKIL 0x04000000 /* kill line with " \b " */
-#define PASS8 0x08000000
-#define CTLECH 0x10000000 /* echo control chars as ^X */
-#define PENDIN 0x20000000 /* re-echo input buffer at next read */
-#define DECCTQ 0x40000000 /* only ^Q starts after ^S */
-#define NOFLSH 0x80000000 /* don't flush output on signal */
-#endif
-#define TIOCLBIS _IOW('t', 127, int) /* bis local mode bits */
-#define TIOCLBIC _IOW('t', 126, int) /* bic local mode bits */
-#define TIOCLSET _IOW('t', 125, int) /* set entire local mode word */
-#define TIOCLGET _IOR('t', 124, int) /* get local modes */
-#define LCRTBS (CRTBS>>16)
-#define LPRTERA (PRTERA>>16)
-#define LCRTERA (CRTERA>>16)
-#define LTILDE (TILDE>>16)
-#define LMDMBUF (MDMBUF>>16)
-#define LLITOUT (LITOUT>>16)
-#define LTOSTOP (TOSTOP>>16)
-#define LFLUSHO (FLUSHO>>16)
-#define LNOHANG (NOHANG>>16)
-#define LCRTKIL (CRTKIL>>16)
-#define LPASS8 (PASS8>>16)
-#define LCTLECH (CTLECH>>16)
-#define LPENDIN (PENDIN>>16)
-#define LDECCTQ (DECCTQ>>16)
-#define LNOFLSH (NOFLSH>>16)
-#if !defined(__mips__)
-#define TIOCSLTC _IOW('t',117,struct ltchars)/* set local special chars*/
-#define TIOCGLTC _IOR('t',116,struct ltchars)/* get local special chars*/
-#endif
-#define OTIOCCONS _IO('t', 98) /* for hp300 -- sans int arg */
-#define OTTYDISC 0
-#define NETLDISC 1
-#define NTTYDISC 2
-
-#endif /* !_SYS_IOCTL_COMPAT_H_ */
diff --git a/libc/include/sys/mman.h b/libc/include/sys/mman.h
index 170300a..af96eff 100644
--- a/libc/include/sys/mman.h
+++ b/libc/include/sys/mman.h
@@ -50,26 +50,26 @@
#define POSIX_MADV_DONTNEED MADV_DONTNEED
#if defined(__USE_FILE_OFFSET64)
-extern void* mmap(void*, size_t, int, int, int, off_t) __RENAME(mmap64);
+extern void* mmap(void*, size_t, int, int, int, off_t) __RENAME(mmap64) __INTRODUCED_IN(21);
#else
extern void* mmap(void*, size_t, int, int, int, off_t);
#endif
-extern void* mmap64(void*, size_t, int, int, int, off64_t);
+extern void* mmap64(void*, size_t, int, int, int, off64_t) __INTRODUCED_IN(21);
extern int munmap(void*, size_t);
extern int msync(const void*, size_t, int);
extern int mprotect(const void*, size_t, int);
extern void* mremap(void*, size_t, size_t, int, ...);
-extern int mlockall(int);
-extern int munlockall(void);
+extern int mlockall(int) __INTRODUCED_IN(21);
+extern int munlockall(void) __INTRODUCED_IN(21);
extern int mlock(const void*, size_t);
extern int munlock(const void*, size_t);
extern int mincore(void*, size_t, unsigned char*);
extern int madvise(void*, size_t, int);
-extern int posix_madvise(void*, size_t, int);
+extern int posix_madvise(void*, size_t, int) __INTRODUCED_IN(23);
__END_DECLS
diff --git a/libc/include/sys/personality.h b/libc/include/sys/personality.h
index 7764468..68ae77c 100644
--- a/libc/include/sys/personality.h
+++ b/libc/include/sys/personality.h
@@ -34,7 +34,7 @@
__BEGIN_DECLS
-extern int personality (unsigned int persona);
+extern int personality(unsigned int persona) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/quota.h b/libc/include/sys/quota.h
index f4f6447..08ca982 100644
--- a/libc/include/sys/quota.h
+++ b/libc/include/sys/quota.h
@@ -40,7 +40,7 @@
__BEGIN_DECLS
-int quotactl(int, const char*, int, char*);
+int quotactl(int, const char*, int, char*) __INTRODUCED_IN_FUTURE;
__END_DECLS
diff --git a/libc/include/sys/resource.h b/libc/include/sys/resource.h
index 8209dfb..3187420 100644
--- a/libc/include/sys/resource.h
+++ b/libc/include/sys/resource.h
@@ -45,16 +45,17 @@
extern int getrlimit(int, struct rlimit*);
extern int setrlimit(int, const struct rlimit*);
-extern int getrlimit64(int, struct rlimit64*);
-extern int setrlimit64(int, const struct rlimit64*);
+extern int getrlimit64(int, struct rlimit64*) __INTRODUCED_IN(21);
+extern int setrlimit64(int, const struct rlimit64*) __INTRODUCED_IN(21);
extern int getpriority(int, int);
extern int setpriority(int, int, int);
extern int getrusage(int, struct rusage*);
-extern int prlimit(pid_t, int, const struct rlimit*, struct rlimit*);
-extern int prlimit64(pid_t, int, const struct rlimit64*, struct rlimit64*);
+extern int prlimit(pid_t, int, const struct rlimit*, struct rlimit*) __INTRODUCED_IN_32(24)
+ __INTRODUCED_IN_64(21);
+extern int prlimit64(pid_t, int, const struct rlimit64*, struct rlimit64*) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/select.h b/libc/include/sys/select.h
index 0c4a823..06c1c72 100644
--- a/libc/include/sys/select.h
+++ b/libc/include/sys/select.h
@@ -57,9 +57,9 @@
} \
} while (0)
-extern void __FD_CLR_chk(int, fd_set*, size_t);
-extern void __FD_SET_chk(int, fd_set*, size_t);
-extern int __FD_ISSET_chk(int, fd_set*, size_t);
+extern void __FD_CLR_chk(int, fd_set*, size_t) __INTRODUCED_IN(21);
+extern void __FD_SET_chk(int, fd_set*, size_t) __INTRODUCED_IN(21);
+extern int __FD_ISSET_chk(int, fd_set*, size_t) __INTRODUCED_IN(21);
#if defined(__BIONIC_FORTIFY)
#define FD_CLR(fd, set) __FD_CLR_chk(fd, set, __bos(set))
diff --git a/libc/include/sys/sendfile.h b/libc/include/sys/sendfile.h
index c588e68..f90498a 100644
--- a/libc/include/sys/sendfile.h
+++ b/libc/include/sys/sendfile.h
@@ -35,11 +35,12 @@
__BEGIN_DECLS
#if defined(__USE_FILE_OFFSET64)
-extern ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count) __RENAME(sendfile64);
+extern ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count) __RENAME(sendfile64)
+ __INTRODUCED_IN(21);
#else
extern ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count);
#endif
-extern ssize_t sendfile64(int out_fd, int in_fd, off64_t* offset, size_t count);
+extern ssize_t sendfile64(int out_fd, int in_fd, off64_t* offset, size_t count) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/signalfd.h b/libc/include/sys/signalfd.h
index 2537ab9..5b67822 100644
--- a/libc/include/sys/signalfd.h
+++ b/libc/include/sys/signalfd.h
@@ -35,7 +35,7 @@
__BEGIN_DECLS
-extern int signalfd(int fd, const sigset_t* mask, int flags) __nonnull((2));
+extern int signalfd(int fd, const sigset_t* mask, int flags) __nonnull((2)) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/socket.h b/libc/include/sys/socket.h
index c7e9acc..85999f3 100644
--- a/libc/include/sys/socket.h
+++ b/libc/include/sys/socket.h
@@ -113,7 +113,7 @@
? (struct cmsghdr*) (msg)->msg_control : (struct cmsghdr*) NULL)
#define CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len >= sizeof(struct cmsghdr) && (cmsg)->cmsg_len <= (unsigned long) ((mhdr)->msg_controllen - ((char*)(cmsg) - (char*)(mhdr)->msg_control)))
-struct cmsghdr* __cmsg_nxthdr(struct msghdr*, struct cmsghdr*);
+struct cmsghdr* __cmsg_nxthdr(struct msghdr*, struct cmsghdr*) __INTRODUCED_IN(21);
#define SCM_RIGHTS 0x01
#define SCM_CREDENTIALS 0x02
@@ -269,16 +269,17 @@
#endif
__socketcall int accept(int, struct sockaddr*, socklen_t*);
-__socketcall int accept4(int, struct sockaddr*, socklen_t*, int);
+__socketcall int accept4(int, struct sockaddr*, socklen_t*, int) __INTRODUCED_IN(21);
__socketcall int bind(int, const struct sockaddr*, int);
__socketcall int connect(int, const struct sockaddr*, socklen_t);
__socketcall int getpeername(int, struct sockaddr*, socklen_t*);
__socketcall int getsockname(int, struct sockaddr*, socklen_t*);
__socketcall int getsockopt(int, int, int, void*, socklen_t*);
__socketcall int listen(int, int);
-__socketcall int recvmmsg(int, struct mmsghdr*, unsigned int, int, const struct timespec*);
+__socketcall int recvmmsg(int, struct mmsghdr*, unsigned int, int, const struct timespec*)
+ __INTRODUCED_IN(21);
__socketcall int recvmsg(int, struct msghdr*, int);
-__socketcall int sendmmsg(int, const struct mmsghdr*, unsigned int, int);
+__socketcall int sendmmsg(int, const struct mmsghdr*, unsigned int, int) __INTRODUCED_IN(21);
__socketcall int sendmsg(int, const struct msghdr*, int);
__socketcall int setsockopt(int, int, int, const void*, socklen_t);
__socketcall int shutdown(int, int);
@@ -292,7 +293,8 @@
__socketcall ssize_t recvfrom(int, void*, size_t, int, const struct sockaddr*, socklen_t*);
__errordecl(__recvfrom_error, "recvfrom called with size bigger than buffer");
-extern ssize_t __recvfrom_chk(int, void*, size_t, size_t, int, const struct sockaddr*, socklen_t*);
+extern ssize_t __recvfrom_chk(int, void*, size_t, size_t, int, const struct sockaddr*, socklen_t*)
+ __INTRODUCED_IN(21);
extern ssize_t __recvfrom_real(int, void*, size_t, int, const struct sockaddr*, socklen_t*) __RENAME(recvfrom);
#if defined(__BIONIC_FORTIFY)
diff --git a/libc/include/sys/socketcalls.h b/libc/include/sys/socketcalls.h
deleted file mode 100644
index 131e0bb..0000000
--- a/libc/include/sys/socketcalls.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-#ifndef _SYS_SOCKETCALLS_H_
-#define _SYS_SOCKETCALLS_H_
-
-/* socketcalls by number */
-
-#define SYS_SOCKET 1 /* sys_socket(2) */
-#define SYS_BIND 2 /* sys_bind(2) */
-#define SYS_CONNECT 3 /* sys_connect(2) */
-#define SYS_LISTEN 4 /* sys_listen(2) */
-#define SYS_ACCEPT 5 /* sys_accept(2) */
-#define SYS_GETSOCKNAME 6 /* sys_getsockname(2) */
-#define SYS_GETPEERNAME 7 /* sys_getpeername(2) */
-#define SYS_SOCKETPAIR 8 /* sys_socketpair(2) */
-#define SYS_SEND 9 /* sys_send(2) */
-#define SYS_RECV 10 /* sys_recv(2) */
-#define SYS_SENDTO 11 /* sys_sendto(2) */
-#define SYS_RECVFROM 12 /* sys_recvfrom(2) */
-#define SYS_SHUTDOWN 13 /* sys_shutdown(2) */
-#define SYS_SETSOCKOPT 14 /* sys_setsockopt(2) */
-#define SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */
-#define SYS_SENDMSG 16 /* sys_sendmsg(2) */
-#define SYS_RECVMSG 17 /* sys_recvmsg(2) */
-#define SYS_ACCEPT4 18 /* sys_accept4(2) */
-#define SYS_RECVMMSG 19 /* sys_recvmmsg(2) */
-#define SYS_SENDMMSG 20 /* sys_sendmmsg(2) */
-
-#endif /* _SYS_SOCKETCALLS_H_ */
diff --git a/libc/include/sys/stat.h b/libc/include/sys/stat.h
index ae85f62..46eec96 100644
--- a/libc/include/sys/stat.h
+++ b/libc/include/sys/stat.h
@@ -146,18 +146,18 @@
extern int mkdir(const char*, mode_t);
extern int fstat(int, struct stat*);
-extern int fstat64(int, struct stat64*);
+extern int fstat64(int, struct stat64*) __INTRODUCED_IN(21);
extern int fstatat(int, const char*, struct stat*, int);
-extern int fstatat64(int, const char*, struct stat64*, int);
+extern int fstatat64(int, const char*, struct stat64*, int) __INTRODUCED_IN(21);
extern int lstat(const char*, struct stat*);
-extern int lstat64(const char*, struct stat64*);
+extern int lstat64(const char*, struct stat64*) __INTRODUCED_IN(21);
extern int stat(const char*, struct stat*);
-extern int stat64(const char*, struct stat64*);
+extern int stat64(const char*, struct stat64*) __INTRODUCED_IN(21);
extern int mknod(const char*, mode_t, dev_t);
extern mode_t umask(mode_t);
-extern mode_t __umask_chk(mode_t);
+extern mode_t __umask_chk(mode_t) __INTRODUCED_IN(21);
extern mode_t __umask_real(mode_t) __RENAME(umask);
__errordecl(__umask_invalid_mode, "umask called with invalid mode");
@@ -178,16 +178,17 @@
#endif /* defined(__BIONIC_FORTIFY) */
__BIONIC_LEGACY_INLINE int mkfifo(const char*, mode_t);
-extern int mkfifoat(int, const char*, mode_t);
+extern int mkfifoat(int, const char*, mode_t) __INTRODUCED_IN(23);
extern int fchmodat(int, const char*, mode_t, int);
extern int mkdirat(int, const char*, mode_t);
-extern int mknodat(int, const char*, mode_t, dev_t);
+extern int mknodat(int, const char*, mode_t, dev_t) __INTRODUCED_IN(21);
#define UTIME_NOW ((1L << 30) - 1L)
#define UTIME_OMIT ((1L << 30) - 2L)
-extern int utimensat(int fd, const char *path, const struct timespec times[2], int flags);
-extern int futimens(int fd, const struct timespec times[2]);
+extern int utimensat(int fd, const char* path, const struct timespec times[2], int flags)
+ __INTRODUCED_IN(12);
+extern int futimens(int fd, const struct timespec times[2]) __INTRODUCED_IN(19);
__END_DECLS
diff --git a/libc/include/sys/statvfs.h b/libc/include/sys/statvfs.h
index 3495546..e12f069 100644
--- a/libc/include/sys/statvfs.h
+++ b/libc/include/sys/statvfs.h
@@ -59,10 +59,12 @@
#define ST_NODIRATIME 0x0800
#define ST_RELATIME 0x1000
-extern int statvfs(const char* __restrict, struct statvfs* __restrict) __nonnull((1, 2));
-extern int statvfs64(const char* __restrict, struct statvfs64* __restrict) __nonnull((1, 2));
-extern int fstatvfs(int, struct statvfs*) __nonnull((2));
-extern int fstatvfs64(int, struct statvfs64*) __nonnull((2));
+extern int statvfs(const char* __restrict, struct statvfs* __restrict) __nonnull((1, 2))
+ __INTRODUCED_IN(21);
+extern int statvfs64(const char* __restrict, struct statvfs64* __restrict) __nonnull((1, 2))
+ __INTRODUCED_IN(21);
+extern int fstatvfs(int, struct statvfs*) __nonnull((2)) __INTRODUCED_IN(21);
+extern int fstatvfs64(int, struct statvfs64*) __nonnull((2)) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/swap.h b/libc/include/sys/swap.h
index e4c1819..b1f9295 100644
--- a/libc/include/sys/swap.h
+++ b/libc/include/sys/swap.h
@@ -38,8 +38,8 @@
#define SWAP_FLAG_PRIO_MASK 0x7fff
#define SWAP_FLAG_PRIO_SHIFT 0
-extern int swapon(const char*, int) __nonnull((1));
-extern int swapoff(const char*) __nonnull((1));
+extern int swapon(const char*, int) __nonnull((1)) __INTRODUCED_IN(21);
+extern int swapoff(const char*) __nonnull((1)) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/syscall.h b/libc/include/sys/syscall.h
index 21eaf33..87cddc9 100644
--- a/libc/include/sys/syscall.h
+++ b/libc/include/sys/syscall.h
@@ -30,7 +30,7 @@
#define _SYS_SYSCALL_H_
#include <asm/unistd.h> /* Linux kernel __NR_* names. */
-#include <sys/glibc-syscalls.h> /* glibc-compatible SYS_* aliases. */
+#include <bits/glibc-syscalls.h> /* glibc-compatible SYS_* aliases. */
/* The syscall function itself is declared in <unistd.h>, not here. */
diff --git a/libc/include/sys/sysinfo.h b/libc/include/sys/sysinfo.h
index b66bc8e..9a10d64 100644
--- a/libc/include/sys/sysinfo.h
+++ b/libc/include/sys/sysinfo.h
@@ -35,13 +35,13 @@
int sysinfo(struct sysinfo* info);
-int get_nprocs_conf(void);
+int get_nprocs_conf(void) __INTRODUCED_IN(23);
-int get_nprocs(void);
+int get_nprocs(void) __INTRODUCED_IN(23);
-long get_phys_pages(void);
+long get_phys_pages(void) __INTRODUCED_IN(23);
-long get_avphys_pages(void);
+long get_avphys_pages(void) __INTRODUCED_IN(23);
__END_DECLS
diff --git a/libc/include/sys/syslimits.h b/libc/include/sys/syslimits.h
deleted file mode 100644
index e69de29..0000000
--- a/libc/include/sys/syslimits.h
+++ /dev/null
diff --git a/libc/include/sys/system_properties.h b/libc/include/sys/system_properties.h
index 01c3db3..99a6e59 100644
--- a/libc/include/sys/system_properties.h
+++ b/libc/include/sys/system_properties.h
@@ -48,7 +48,7 @@
/* Set a system property by name.
**/
-int __system_property_set(const char *key, const char *value);
+int __system_property_set(const char* key, const char* value) __INTRODUCED_IN(21);
/* Return a pointer to the system property named name, if it
** exists, or NULL if there is no such property. Use
@@ -93,9 +93,8 @@
** Order of results may change from call to call. This is
** not a bug.
*/
-int __system_property_foreach(
- void (*propfn)(const prop_info *pi, void *cookie),
- void *cookie);
+int __system_property_foreach(void (*propfn)(const prop_info* pi, void* cookie), void* cookie)
+ __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/timerfd.h b/libc/include/sys/timerfd.h
index 1aa97b4..a189742 100644
--- a/libc/include/sys/timerfd.h
+++ b/libc/include/sys/timerfd.h
@@ -41,10 +41,10 @@
#define TFD_CLOEXEC O_CLOEXEC
#define TFD_NONBLOCK O_NONBLOCK
-extern int timerfd_create(clockid_t, int);
-extern int timerfd_settime(int, int, const struct itimerspec*,
- struct itimerspec*);
-extern int timerfd_gettime(int, struct itimerspec*);
+extern int timerfd_create(clockid_t, int) __INTRODUCED_IN(21);
+extern int timerfd_settime(int, int, const struct itimerspec*, struct itimerspec*)
+ __INTRODUCED_IN(21);
+extern int timerfd_gettime(int, struct itimerspec*) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/timex.h b/libc/include/sys/timex.h
index fade5c3..f704ce8 100644
--- a/libc/include/sys/timex.h
+++ b/libc/include/sys/timex.h
@@ -35,8 +35,8 @@
__BEGIN_DECLS
-int adjtimex(struct timex*);
-int clock_adjtime(clockid_t, struct timex*);
+int adjtimex(struct timex*) __INTRODUCED_IN(24);
+int clock_adjtime(clockid_t, struct timex*) __INTRODUCED_IN(24);
__END_DECLS
diff --git a/libc/include/sys/ttychars.h b/libc/include/sys/ttychars.h
deleted file mode 100644
index e69de29..0000000
--- a/libc/include/sys/ttychars.h
+++ /dev/null
diff --git a/libc/include/sys/ttydev.h b/libc/include/sys/ttydev.h
deleted file mode 100644
index e69de29..0000000
--- a/libc/include/sys/ttydev.h
+++ /dev/null
diff --git a/libc/include/sys/uio.h b/libc/include/sys/uio.h
index 72675d1..7a009b4 100644
--- a/libc/include/sys/uio.h
+++ b/libc/include/sys/uio.h
@@ -42,16 +42,18 @@
ssize_t preadv(int, const struct iovec*, int, off_t) __RENAME(preadv64);
ssize_t pwritev(int, const struct iovec*, int, off_t) __RENAME(pwritev64);
#else
-ssize_t preadv(int, const struct iovec*, int, off_t);
-ssize_t pwritev(int, const struct iovec*, int, off_t);
+ssize_t preadv(int, const struct iovec*, int, off_t) __INTRODUCED_IN(24);
+ssize_t pwritev(int, const struct iovec*, int, off_t) __INTRODUCED_IN(24);
#endif
-ssize_t preadv64(int, const struct iovec*, int, off64_t);
-ssize_t pwritev64(int, const struct iovec*, int, off64_t);
+ssize_t preadv64(int, const struct iovec*, int, off64_t) __INTRODUCED_IN(24);
+ssize_t pwritev64(int, const struct iovec*, int, off64_t) __INTRODUCED_IN(24);
#endif
#if defined(__USE_GNU)
-ssize_t process_vm_readv(pid_t, const struct iovec*, unsigned long, const struct iovec*, unsigned long, unsigned long);
-ssize_t process_vm_writev(pid_t, const struct iovec*, unsigned long, const struct iovec*, unsigned long, unsigned long);
+ssize_t process_vm_readv(pid_t, const struct iovec*, unsigned long, const struct iovec*,
+ unsigned long, unsigned long) __INTRODUCED_IN(23);
+ssize_t process_vm_writev(pid_t, const struct iovec*, unsigned long, const struct iovec*,
+ unsigned long, unsigned long) __INTRODUCED_IN(23);
#endif
__END_DECLS
diff --git a/libc/include/sys/user.h b/libc/include/sys/user.h
index 3312981..13fecf9 100644
--- a/libc/include/sys/user.h
+++ b/libc/include/sys/user.h
@@ -31,6 +31,7 @@
#include <sys/cdefs.h>
#include <stddef.h> /* For size_t. */
+#include <stdint.h>
__BEGIN_DECLS
diff --git a/libc/include/sys/vfs.h b/libc/include/sys/vfs.h
index 1fbc8be..9f04b28 100644
--- a/libc/include/sys/vfs.h
+++ b/libc/include/sys/vfs.h
@@ -138,9 +138,9 @@
#define XFS_SUPER_MAGIC 0x58465342
extern int statfs(const char*, struct statfs*) __nonnull((1, 2));
-extern int statfs64(const char*, struct statfs64*) __nonnull((1, 2));
+extern int statfs64(const char*, struct statfs64*) __nonnull((1, 2)) __INTRODUCED_IN(21);
extern int fstatfs(int, struct statfs*) __nonnull((2));
-extern int fstatfs64(int, struct statfs64*) __nonnull((2));
+extern int fstatfs64(int, struct statfs64*) __nonnull((2)) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/sys/wait.h b/libc/include/sys/wait.h
index 2317b02..aba20e5 100644
--- a/libc/include/sys/wait.h
+++ b/libc/include/sys/wait.h
@@ -51,7 +51,7 @@
extern pid_t wait(int *);
extern pid_t waitpid(pid_t, int *, int);
-extern pid_t wait4(pid_t, int *, int, struct rusage *);
+extern pid_t wait4(pid_t, int*, int, struct rusage*) __INTRODUCED_IN(19);
/* Posix states that idtype_t should be an enumeration type, but
* the kernel headers define P_ALL, P_PID and P_PGID as constant macros
diff --git a/libc/include/sys/xattr.h b/libc/include/sys/xattr.h
index 39b25b1..070913f 100644
--- a/libc/include/sys/xattr.h
+++ b/libc/include/sys/xattr.h
@@ -35,21 +35,26 @@
#define XATTR_CREATE 1
#define XATTR_REPLACE 2
-extern int fsetxattr(int fd, const char *name, const void *value, size_t size, int flags);
-extern int setxattr(const char *path, const char *name, const void *value, size_t size, int flags);
-extern int lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags);
+extern int fsetxattr(int fd, const char* name, const void* value, size_t size, int flags)
+ __INTRODUCED_IN(21);
+extern int setxattr(const char* path, const char* name, const void* value, size_t size, int flags)
+ __INTRODUCED_IN(21);
+extern int lsetxattr(const char* path, const char* name, const void* value, size_t size, int flags)
+ __INTRODUCED_IN(21);
-extern ssize_t fgetxattr(int fd, const char *name, void *value, size_t size);
-extern ssize_t getxattr(const char *path, const char *name, void *value, size_t size);
-extern ssize_t lgetxattr(const char *path, const char *name, void *value, size_t size);
+extern ssize_t fgetxattr(int fd, const char* name, void* value, size_t size) __INTRODUCED_IN(21);
+extern ssize_t getxattr(const char* path, const char* name, void* value, size_t size)
+ __INTRODUCED_IN(21);
+extern ssize_t lgetxattr(const char* path, const char* name, void* value, size_t size)
+ __INTRODUCED_IN(21);
-extern ssize_t listxattr(const char *path, char *list, size_t size);
-extern ssize_t llistxattr(const char *path, char *list, size_t size);
-extern ssize_t flistxattr(int fd, char *list, size_t size);
+extern ssize_t listxattr(const char* path, char* list, size_t size) __INTRODUCED_IN(21);
+extern ssize_t llistxattr(const char* path, char* list, size_t size) __INTRODUCED_IN(21);
+extern ssize_t flistxattr(int fd, char* list, size_t size) __INTRODUCED_IN(21);
-extern int removexattr(const char *path, const char *name);
-extern int lremovexattr(const char *path, const char *name);
-extern int fremovexattr(int fd, const char *name);
+extern int removexattr(const char* path, const char* name) __INTRODUCED_IN(21);
+extern int lremovexattr(const char* path, const char* name) __INTRODUCED_IN(21);
+extern int fremovexattr(int fd, const char* name) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/termios.h b/libc/include/termios.h
index e604747..15a7b32 100644
--- a/libc/include/termios.h
+++ b/libc/include/termios.h
@@ -40,8 +40,8 @@
__BIONIC_LEGACY_INLINE void cfmakeraw(struct termios*);
__BIONIC_LEGACY_INLINE int cfsetispeed(struct termios*, speed_t);
__BIONIC_LEGACY_INLINE int cfsetospeed(struct termios*, speed_t);
-__BIONIC_LEGACY_INLINE int cfsetspeed(struct termios*, speed_t);
-__BIONIC_LEGACY_INLINE int tcdrain(int);
+__BIONIC_LEGACY_INLINE int cfsetspeed(struct termios*, speed_t) __INTRODUCED_IN(21);
+__BIONIC_LEGACY_INLINE int tcdrain(int) __INTRODUCED_IN(21);
__BIONIC_LEGACY_INLINE int tcflow(int, int);
__BIONIC_LEGACY_INLINE int tcflush(int, int);
__BIONIC_LEGACY_INLINE int tcgetattr(int, struct termios*);
diff --git a/libc/include/time.h b/libc/include/time.h
index 1b0f6a1..039608b 100644
--- a/libc/include/time.h
+++ b/libc/include/time.h
@@ -76,7 +76,8 @@
extern char* strptime(const char*, const char*, struct tm*) __LIBC_ABI_PUBLIC__;
extern size_t strftime(char*, size_t, const char*, const struct tm*) __LIBC_ABI_PUBLIC__;
-extern size_t strftime_l(char *, size_t, const char *, const struct tm *, locale_t) __LIBC_ABI_PUBLIC__;
+extern size_t strftime_l(char*, size_t, const char*, const struct tm*, locale_t) __LIBC_ABI_PUBLIC__
+ __INTRODUCED_IN(21);
extern char* ctime(const time_t*) __LIBC_ABI_PUBLIC__;
extern char* ctime_r(const time_t*, char*) __LIBC_ABI_PUBLIC__;
@@ -85,7 +86,7 @@
extern clock_t clock(void) __LIBC_ABI_PUBLIC__;
-extern int clock_getcpuclockid(pid_t, clockid_t*) __LIBC_ABI_PUBLIC__;
+extern int clock_getcpuclockid(pid_t, clockid_t*) __LIBC_ABI_PUBLIC__ __INTRODUCED_IN(23);
extern int clock_getres(clockid_t, struct timespec*) __LIBC_ABI_PUBLIC__;
extern int clock_gettime(clockid_t, struct timespec*) __LIBC_ABI_PUBLIC__;
@@ -99,8 +100,8 @@
extern int timer_getoverrun(timer_t) __LIBC_ABI_PUBLIC__;
/* Non-standard extensions that are in the BSDs and glibc. */
-extern time_t timelocal(struct tm*) __LIBC_ABI_PUBLIC__;
-extern time_t timegm(struct tm*) __LIBC_ABI_PUBLIC__;
+extern time_t timelocal(struct tm*) __LIBC_ABI_PUBLIC__ __INTRODUCED_IN(21);
+extern time_t timegm(struct tm*) __LIBC_ABI_PUBLIC__ __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/uchar.h b/libc/include/uchar.h
index a5e72ea..9a0e2f8 100644
--- a/libc/include/uchar.h
+++ b/libc/include/uchar.h
@@ -42,16 +42,12 @@
#define __STD_UTF_16__ 1
#define __STD_UTF_32__ 1
-size_t c16rtomb(char* __restrict, char16_t, mbstate_t* __restrict);
-size_t c32rtomb(char* __restrict, char32_t, mbstate_t* __restrict);
-size_t mbrtoc16(char16_t* __restrict,
- const char* __restrict,
- size_t,
- mbstate_t* __restrict);
-size_t mbrtoc32(char32_t* __restrict,
- const char* __restrict,
- size_t,
- mbstate_t* __restrict);
+size_t c16rtomb(char* __restrict, char16_t, mbstate_t* __restrict) __INTRODUCED_IN(21);
+size_t c32rtomb(char* __restrict, char32_t, mbstate_t* __restrict) __INTRODUCED_IN(21);
+size_t mbrtoc16(char16_t* __restrict, const char* __restrict, size_t, mbstate_t* __restrict)
+ __INTRODUCED_IN(21);
+size_t mbrtoc32(char32_t* __restrict, const char* __restrict, size_t, mbstate_t* __restrict)
+ __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/include/unistd.h b/libc/include/unistd.h
index ea6c8a1..6b5ef76 100644
--- a/libc/include/unistd.h
+++ b/libc/include/unistd.h
@@ -176,12 +176,12 @@
extern off64_t lseek64(int __fd, off64_t __offset, int __whence);
#if defined(__USE_FILE_OFFSET64) && __ANDROID_API__ >= 21
-extern int truncate(const char* __path, off_t __length) __RENAME(truncate64);
-extern ssize_t pread(int __fd, void* __buf, size_t __count, off_t __offset)
- __RENAME(pread64);
-extern ssize_t pwrite(int __fd, const void* __buf, size_t __count,
- off_t __offset) __RENAME(pwrite64);
-extern int ftruncate(int __fd, off_t __length) __RENAME(ftruncate64);
+extern int truncate(const char* __path, off_t __length) __RENAME(truncate64) __INTRODUCED_IN(21);
+extern ssize_t pread(int __fd, void* __buf, size_t __count, off_t __offset) __RENAME(pread64)
+ __INTRODUCED_IN(12);
+extern ssize_t pwrite(int __fd, const void* __buf, size_t __count, off_t __offset)
+ __RENAME(pwrite64) __INTRODUCED_IN(12);
+extern int ftruncate(int __fd, off_t __length) __RENAME(ftruncate64) __INTRODUCED_IN(12);
#else
extern int truncate(const char* __path, off_t __length);
extern ssize_t pread(int __fd, void* __buf, size_t __count, off_t __offset);
@@ -191,10 +191,10 @@
#endif
extern int truncate64(const char* __path, off64_t __length) __INTRODUCED_IN(21);
-extern ssize_t pread64(int __fd, void* __buf, size_t __count, off64_t __offset) __INTRODUCED_IN(21);
-extern ssize_t pwrite64(int __fd, const void* __buf, size_t __count,
- off64_t __offset) __INTRODUCED_IN(21);
-extern int ftruncate64(int __fd, off64_t __length) __INTRODUCED_IN(21);
+extern ssize_t pread64(int __fd, void* __buf, size_t __count, off64_t __offset) __INTRODUCED_IN(12);
+extern ssize_t pwrite64(int __fd, const void* __buf, size_t __count, off64_t __offset)
+ __INTRODUCED_IN(12);
+extern int ftruncate64(int __fd, off64_t __length) __INTRODUCED_IN(12);
extern int pause(void);
extern unsigned int alarm(unsigned int __seconds);
@@ -202,7 +202,7 @@
extern int usleep(useconds_t __usec);
int gethostname(char* __name, size_t __len);
-int sethostname(const char* __name, size_t __len);
+int sethostname(const char* __name, size_t __len) __INTRODUCED_IN(23);
extern void* __brk(void* __addr);
extern int brk(void* __addr);
@@ -243,52 +243,53 @@
_rc; })
/* TODO(unified-headers): Factor out all the FORTIFY features. */
-extern char* __getcwd_chk(char*, size_t, size_t);
+extern char* __getcwd_chk(char*, size_t, size_t) __INTRODUCED_IN(24);
__errordecl(__getcwd_dest_size_error, "getcwd called with size bigger than destination");
extern char* __getcwd_real(char*, size_t) __RENAME(getcwd);
-extern ssize_t __pread_chk(int, void*, size_t, off_t, size_t);
+extern ssize_t __pread_chk(int, void*, size_t, off_t, size_t) __INTRODUCED_IN(23);
__errordecl(__pread_dest_size_error, "pread called with size bigger than destination");
__errordecl(__pread_count_toobig_error, "pread called with count > SSIZE_MAX");
extern ssize_t __pread_real(int, void*, size_t, off_t) __RENAME(pread);
-extern ssize_t __pread64_chk(int, void*, size_t, off64_t, size_t);
+extern ssize_t __pread64_chk(int, void*, size_t, off64_t, size_t) __INTRODUCED_IN(23);
__errordecl(__pread64_dest_size_error, "pread64 called with size bigger than destination");
__errordecl(__pread64_count_toobig_error, "pread64 called with count > SSIZE_MAX");
-extern ssize_t __pread64_real(int, void*, size_t, off64_t) __RENAME(pread64);
+extern ssize_t __pread64_real(int, void*, size_t, off64_t) __RENAME(pread64) __INTRODUCED_IN(12);
-extern ssize_t __pwrite_chk(int, const void*, size_t, off_t, size_t);
+extern ssize_t __pwrite_chk(int, const void*, size_t, off_t, size_t) __INTRODUCED_IN(24);
__errordecl(__pwrite_dest_size_error, "pwrite called with size bigger than destination");
__errordecl(__pwrite_count_toobig_error, "pwrite called with count > SSIZE_MAX");
extern ssize_t __pwrite_real(int, const void*, size_t, off_t) __RENAME(pwrite);
-extern ssize_t __pwrite64_chk(int, const void*, size_t, off64_t, size_t);
+extern ssize_t __pwrite64_chk(int, const void*, size_t, off64_t, size_t) __INTRODUCED_IN(24);
__errordecl(__pwrite64_dest_size_error, "pwrite64 called with size bigger than destination");
__errordecl(__pwrite64_count_toobig_error, "pwrite64 called with count > SSIZE_MAX");
-extern ssize_t __pwrite64_real(int, const void*, size_t, off64_t) __RENAME(pwrite64);
+extern ssize_t __pwrite64_real(int, const void*, size_t, off64_t) __RENAME(pwrite64)
+ __INTRODUCED_IN(12);
-extern ssize_t __read_chk(int, void*, size_t, size_t);
+extern ssize_t __read_chk(int, void*, size_t, size_t) __INTRODUCED_IN(21);
__errordecl(__read_dest_size_error, "read called with size bigger than destination");
__errordecl(__read_count_toobig_error, "read called with count > SSIZE_MAX");
extern ssize_t __read_real(int, void*, size_t) __RENAME(read);
-extern ssize_t __write_chk(int, const void*, size_t, size_t);
+extern ssize_t __write_chk(int, const void*, size_t, size_t) __INTRODUCED_IN(24);
__errordecl(__write_dest_size_error, "write called with size bigger than destination");
__errordecl(__write_count_toobig_error, "write called with count > SSIZE_MAX");
extern ssize_t __write_real(int, const void*, size_t) __RENAME(write);
-extern ssize_t __readlink_chk(const char*, char*, size_t, size_t);
+extern ssize_t __readlink_chk(const char*, char*, size_t, size_t) __INTRODUCED_IN(23);
__errordecl(__readlink_dest_size_error, "readlink called with size bigger than destination");
__errordecl(__readlink_size_toobig_error, "readlink called with size > SSIZE_MAX");
extern ssize_t __readlink_real(const char*, char*, size_t) __RENAME(readlink);
-extern ssize_t __readlinkat_chk(int dirfd, const char*, char*, size_t, size_t);
+extern ssize_t __readlinkat_chk(int dirfd, const char*, char*, size_t, size_t) __INTRODUCED_IN(23);
__errordecl(__readlinkat_dest_size_error, "readlinkat called with size bigger than destination");
__errordecl(__readlinkat_size_toobig_error, "readlinkat called with size > SSIZE_MAX");
extern ssize_t __readlinkat_real(int dirfd, const char*, char*, size_t) __RENAME(readlinkat);
-extern int getdomainname(char*, size_t);
-extern int setdomainname(const char*, size_t);
+extern int getdomainname(char*, size_t) __INTRODUCED_IN_FUTURE;
+extern int setdomainname(const char*, size_t) __INTRODUCED_IN_FUTURE;
#if defined(__BIONIC_FORTIFY)
diff --git a/libc/include/util.h b/libc/include/util.h
deleted file mode 100644
index e69de29..0000000
--- a/libc/include/util.h
+++ /dev/null
diff --git a/libc/include/utmp.h b/libc/include/utmp.h
index c6f22a5..62e8d59 100644
--- a/libc/include/utmp.h
+++ b/libc/include/utmp.h
@@ -101,7 +101,7 @@
struct utmp* getutent(void);
void endutent(void);
-int login_tty(int);
+int login_tty(int) __INTRODUCED_IN(23);
__END_DECLS
diff --git a/libc/include/wchar.h b/libc/include/wchar.h
index fe068be..91d6f24 100644
--- a/libc/include/wchar.h
+++ b/libc/include/wchar.h
@@ -37,10 +37,10 @@
#include <xlocale.h>
#include <bits/wchar_limits.h>
+#include <bits/wctype.h>
__BEGIN_DECLS
-typedef __WINT_TYPE__ wint_t;
typedef struct {
uint8_t __seq[4];
#ifdef __LP64__
@@ -65,26 +65,11 @@
WC_TYPE_MAX
};
-typedef long wctype_t;
-
#define WEOF ((wint_t)(-1))
extern wint_t btowc(int);
extern int fwprintf(FILE *, const wchar_t *, ...);
extern int fwscanf(FILE *, const wchar_t *, ...);
-extern int iswalnum(wint_t);
-extern int iswalpha(wint_t);
-extern int iswblank(wint_t);
-extern int iswcntrl(wint_t);
-extern int iswdigit(wint_t);
-extern int iswgraph(wint_t);
-extern int iswlower(wint_t);
-extern int iswprint(wint_t);
-extern int iswpunct(wint_t);
-extern int iswspace(wint_t);
-extern int iswupper(wint_t);
-extern int iswxdigit(wint_t);
-extern int iswctype(wint_t, wctype_t);
extern wint_t fgetwc(FILE *);
extern wchar_t *fgetws(wchar_t *, int, FILE *);
extern wint_t fputwc(wchar_t, FILE *);
@@ -96,25 +81,23 @@
extern size_t mbrlen(const char *, size_t, mbstate_t *);
extern size_t mbrtowc(wchar_t *, const char *, size_t, mbstate_t *);
extern size_t mbsrtowcs(wchar_t*, const char**, size_t, mbstate_t*);
-extern size_t mbsnrtowcs(wchar_t*, const char**, size_t, size_t, mbstate_t*);
+extern size_t mbsnrtowcs(wchar_t*, const char**, size_t, size_t, mbstate_t*) __INTRODUCED_IN(21);
extern wint_t putwc(wchar_t, FILE *);
extern wint_t putwchar(wchar_t);
extern int swprintf(wchar_t *, size_t, const wchar_t *, ...);
extern int swscanf(const wchar_t *, const wchar_t *, ...);
-extern wint_t towlower(wint_t);
-extern wint_t towupper(wint_t);
extern wint_t ungetwc(wint_t, FILE *);
extern int vfwprintf(FILE*, const wchar_t*, va_list);
-extern int vfwscanf(FILE*, const wchar_t*, va_list);
+extern int vfwscanf(FILE*, const wchar_t*, va_list) __INTRODUCED_IN(21);
extern int vswprintf(wchar_t*, size_t, const wchar_t*, va_list);
-extern int vswscanf(const wchar_t*, const wchar_t*, va_list);
+extern int vswscanf(const wchar_t*, const wchar_t*, va_list) __INTRODUCED_IN(21);
extern int vwprintf(const wchar_t*, va_list);
-extern int vwscanf(const wchar_t*, va_list);
+extern int vwscanf(const wchar_t*, va_list) __INTRODUCED_IN(21);
extern wchar_t* wcpcpy (wchar_t*, const wchar_t *);
extern wchar_t* wcpncpy (wchar_t*, const wchar_t *, size_t);
extern size_t wcrtomb(char *, wchar_t, mbstate_t *);
extern int wcscasecmp(const wchar_t *, const wchar_t *);
-extern int wcscasecmp_l(const wchar_t *, const wchar_t *, locale_t);
+extern int wcscasecmp_l(const wchar_t*, const wchar_t*, locale_t) __INTRODUCED_IN(23);
extern wchar_t *wcscat(wchar_t *, const wchar_t *);
extern wchar_t *wcschr(const wchar_t *, wchar_t);
extern int wcscmp(const wchar_t *, const wchar_t *);
@@ -124,56 +107,51 @@
extern size_t wcsftime(wchar_t *, size_t, const wchar_t *, const struct tm *) __LIBC_ABI_PUBLIC__;
extern size_t wcslen(const wchar_t *);
extern int wcsncasecmp(const wchar_t *, const wchar_t *, size_t);
-extern int wcsncasecmp_l(const wchar_t *, const wchar_t *, size_t, locale_t);
+extern int wcsncasecmp_l(const wchar_t*, const wchar_t*, size_t, locale_t) __INTRODUCED_IN(23);
extern wchar_t *wcsncat(wchar_t *, const wchar_t *, size_t);
extern int wcsncmp(const wchar_t *, const wchar_t *, size_t);
extern wchar_t *wcsncpy(wchar_t *, const wchar_t *, size_t);
-extern size_t wcsnrtombs(char*, const wchar_t**, size_t, size_t, mbstate_t*);
+extern size_t wcsnrtombs(char*, const wchar_t**, size_t, size_t, mbstate_t*) __INTRODUCED_IN(21);
extern wchar_t *wcspbrk(const wchar_t *, const wchar_t *);
extern wchar_t *wcsrchr(const wchar_t *, wchar_t);
extern size_t wcsrtombs(char*, const wchar_t**, size_t, mbstate_t*);
extern size_t wcsspn(const wchar_t *, const wchar_t *);
extern wchar_t *wcsstr(const wchar_t *, const wchar_t *);
extern double wcstod(const wchar_t*, wchar_t**);
-extern float wcstof(const wchar_t*, wchar_t**);
+extern float wcstof(const wchar_t*, wchar_t**) __INTRODUCED_IN(21);
extern wchar_t* wcstok(wchar_t*, const wchar_t*, wchar_t**);
extern long wcstol(const wchar_t*, wchar_t**, int);
-extern long long wcstoll(const wchar_t*, wchar_t**, int);
-extern long double wcstold(const wchar_t*, wchar_t**);
+extern long long wcstoll(const wchar_t*, wchar_t**, int) __INTRODUCED_IN(21);
+extern long double wcstold(const wchar_t*, wchar_t**) __INTRODUCED_IN(21);
extern unsigned long wcstoul(const wchar_t*, wchar_t**, int);
-extern unsigned long long wcstoull(const wchar_t*, wchar_t**, int);
+extern unsigned long long wcstoull(const wchar_t*, wchar_t**, int) __INTRODUCED_IN(21);
extern int wcswidth(const wchar_t *, size_t);
extern size_t wcsxfrm(wchar_t *, const wchar_t *, size_t);
extern int wctob(wint_t);
-extern wctype_t wctype(const char *);
extern int wcwidth(wchar_t);
extern wchar_t *wmemchr(const wchar_t *, wchar_t, size_t);
extern int wmemcmp(const wchar_t *, const wchar_t *, size_t);
extern wchar_t *wmemcpy(wchar_t *, const wchar_t *, size_t);
#if defined(__USE_GNU)
-extern wchar_t *wmempcpy(wchar_t *, const wchar_t *, size_t);
+extern wchar_t* wmempcpy(wchar_t*, const wchar_t*, size_t) __INTRODUCED_IN(23);
#endif
extern wchar_t *wmemmove(wchar_t *, const wchar_t *, size_t);
extern wchar_t *wmemset(wchar_t *, wchar_t, size_t);
extern int wprintf(const wchar_t *, ...);
extern int wscanf(const wchar_t *, ...);
-extern long long wcstoll_l(const wchar_t *, wchar_t **, int, locale_t);
-extern unsigned long long wcstoull_l(const wchar_t *, wchar_t **, int, locale_t);
-extern long double wcstold_l(const wchar_t *, wchar_t **, locale_t );
+extern long long wcstoll_l(const wchar_t*, wchar_t**, int, locale_t) __INTRODUCED_IN(21);
+extern unsigned long long wcstoull_l(const wchar_t*, wchar_t**, int, locale_t) __INTRODUCED_IN(21);
+extern long double wcstold_l(const wchar_t*, wchar_t**, locale_t) __INTRODUCED_IN(21);
-extern int wcscoll_l(const wchar_t *, const wchar_t *, locale_t);
-extern size_t wcsxfrm_l(wchar_t *, const wchar_t *, size_t, locale_t);
+extern int wcscoll_l(const wchar_t*, const wchar_t*, locale_t) __INTRODUCED_IN(21);
+extern size_t wcsxfrm_l(wchar_t*, const wchar_t*, size_t, locale_t) __INTRODUCED_IN(21);
extern size_t wcslcat(wchar_t*, const wchar_t*, size_t);
extern size_t wcslcpy(wchar_t*, const wchar_t*, size_t);
-typedef void *wctrans_t;
-extern wint_t towctrans(wint_t, wctrans_t);
-extern wctrans_t wctrans(const char*);
-
#if __POSIX_VISIBLE >= 200809
-FILE* open_wmemstream(wchar_t**, size_t*);
+FILE* open_wmemstream(wchar_t**, size_t*) __INTRODUCED_IN(23);
wchar_t* wcsdup(const wchar_t*);
size_t wcsnlen(const wchar_t*, size_t);
#endif
diff --git a/libc/include/wctype.h b/libc/include/wctype.h
index 1a4a05e..41e0ec3 100644
--- a/libc/include/wctype.h
+++ b/libc/include/wctype.h
@@ -31,25 +31,31 @@
#include <wchar.h>
+#include <bits/wctype.h>
+
__BEGIN_DECLS
-extern int iswalnum_l(wint_t, locale_t);
-extern int iswalpha_l(wint_t, locale_t);
-extern int iswblank_l(wint_t, locale_t);
-extern int iswcntrl_l(wint_t, locale_t);
-extern int iswdigit_l(wint_t, locale_t);
-extern int iswgraph_l(wint_t, locale_t);
-extern int iswlower_l(wint_t, locale_t);
-extern int iswprint_l(wint_t, locale_t);
-extern int iswpunct_l(wint_t, locale_t);
-extern int iswspace_l(wint_t, locale_t);
-extern int iswupper_l(wint_t, locale_t);
-extern int iswxdigit_l(wint_t, locale_t);
-extern int towlower_l(int, locale_t);
-extern int towupper_l(int, locale_t);
+int iswalnum_l(wint_t, locale_t) __INTRODUCED_IN(21);
+int iswalpha_l(wint_t, locale_t) __INTRODUCED_IN(21);
+int iswblank_l(wint_t, locale_t) __INTRODUCED_IN(21);
+int iswcntrl_l(wint_t, locale_t) __INTRODUCED_IN(21);
+int iswdigit_l(wint_t, locale_t) __INTRODUCED_IN(21);
+int iswgraph_l(wint_t, locale_t) __INTRODUCED_IN(21);
+int iswlower_l(wint_t, locale_t) __INTRODUCED_IN(21);
+int iswprint_l(wint_t, locale_t) __INTRODUCED_IN(21);
+int iswpunct_l(wint_t, locale_t) __INTRODUCED_IN(21);
+int iswspace_l(wint_t, locale_t) __INTRODUCED_IN(21);
+int iswupper_l(wint_t, locale_t) __INTRODUCED_IN(21);
+int iswxdigit_l(wint_t, locale_t) __INTRODUCED_IN(21);
-extern int iswctype_l(wint_t, wctype_t, locale_t);
-extern wctype_t wctype_l(const char*, locale_t);
+wint_t towlower_l(int, locale_t) __INTRODUCED_IN(21);
+wint_t towupper_l(int, locale_t) __INTRODUCED_IN(21);
+
+wint_t towctrans_l(wint_t, wctrans_t, locale_t) __INTRODUCED_IN_FUTURE;
+wctrans_t wctrans_l(const char*, locale_t) __INTRODUCED_IN_FUTURE;
+
+wctype_t wctype_l(const char*, locale_t) __INTRODUCED_IN(21);
+int iswctype_l(wint_t, wctype_t, locale_t) __INTRODUCED_IN(21);
__END_DECLS
diff --git a/libc/libc.arm.brillo.map b/libc/libc.arm.brillo.map
index ae41430..6998cab 100644
--- a/libc/libc.arm.brillo.map
+++ b/libc/libc.arm.brillo.map
@@ -627,10 +627,6 @@
madvise;
mallinfo;
malloc;
- malloc_backtrace;
- malloc_disable;
- malloc_enable;
- malloc_iterate;
malloc_info;
malloc_usable_size;
mbrlen;
@@ -1283,6 +1279,7 @@
getpwent;
getsubopt;
hasmntopt;
+ mblen;
pthread_getname_np;
quotactl;
setdomainname;
@@ -1294,6 +1291,10 @@
sigrelse;
sigset;
sync_file_range;
+ towctrans;
+ towctrans_l;
+ wctrans;
+ wctrans_l;
} LIBC_N;
LIBC_PRIVATE {
@@ -1480,4 +1481,8 @@
android_net_res_stats_get_info_for_net;
android_net_res_stats_aggregate;
android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
} LIBC_O;
diff --git a/libc/libc.arm.map b/libc/libc.arm.map
index 019a880..8628ed1 100644
--- a/libc/libc.arm.map
+++ b/libc/libc.arm.map
@@ -627,10 +627,6 @@
madvise;
mallinfo;
malloc;
- malloc_backtrace;
- malloc_disable;
- malloc_enable;
- malloc_iterate;
malloc_info;
malloc_usable_size;
mbrlen;
@@ -1283,6 +1279,7 @@
getpwent;
getsubopt;
hasmntopt;
+ mblen;
pthread_getname_np;
quotactl;
setdomainname;
@@ -1294,6 +1291,10 @@
sigrelse;
sigset;
sync_file_range;
+ towctrans;
+ towctrans_l;
+ wctrans;
+ wctrans_l;
} LIBC_N;
LIBC_PRIVATE {
@@ -1518,4 +1519,8 @@
android_net_res_stats_get_info_for_net;
android_net_res_stats_aggregate;
android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
} LIBC_O;
diff --git a/libc/libc.arm64.map b/libc/libc.arm64.map
index b1a50ae..c853f73 100644
--- a/libc/libc.arm64.map
+++ b/libc/libc.arm64.map
@@ -552,10 +552,6 @@
madvise;
mallinfo;
malloc;
- malloc_backtrace;
- malloc_disable;
- malloc_enable;
- malloc_iterate;
malloc_info;
malloc_usable_size;
mbrlen;
@@ -1205,6 +1201,7 @@
getpwent;
getsubopt;
hasmntopt;
+ mblen;
pthread_getname_np;
quotactl;
setdomainname;
@@ -1216,6 +1213,10 @@
sigrelse;
sigset;
sync_file_range;
+ towctrans;
+ towctrans_l;
+ wctrans;
+ wctrans_l;
} LIBC_N;
LIBC_PRIVATE {
@@ -1234,4 +1235,8 @@
android_net_res_stats_get_info_for_net;
android_net_res_stats_aggregate;
android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
} LIBC_O;
diff --git a/libc/libc.map.txt b/libc/libc.map.txt
index 8881485..1ed2977 100644
--- a/libc/libc.map.txt
+++ b/libc/libc.map.txt
@@ -629,10 +629,6 @@
madvise;
mallinfo;
malloc;
- malloc_backtrace;
- malloc_disable;
- malloc_enable;
- malloc_iterate;
malloc_info;
malloc_usable_size;
mbrlen;
@@ -1308,6 +1304,7 @@
getpwent;
getsubopt;
hasmntopt;
+ mblen;
pthread_getname_np;
quotactl;
setdomainname;
@@ -1319,6 +1316,10 @@
sigrelse;
sigset;
sync_file_range;
+ towctrans;
+ towctrans_l;
+ wctrans;
+ wctrans_l;
} LIBC_N;
LIBC_PRIVATE {
@@ -1544,4 +1545,8 @@
android_net_res_stats_get_info_for_net;
android_net_res_stats_aggregate;
android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
} LIBC_O;
diff --git a/libc/libc.mips.brillo.map b/libc/libc.mips.brillo.map
index c281104..f42f5aa 100644
--- a/libc/libc.mips.brillo.map
+++ b/libc/libc.mips.brillo.map
@@ -625,10 +625,6 @@
madvise;
mallinfo;
malloc;
- malloc_backtrace;
- malloc_disable;
- malloc_enable;
- malloc_iterate;
malloc_info;
malloc_usable_size;
mbrlen;
@@ -1267,6 +1263,7 @@
getpwent;
getsubopt;
hasmntopt;
+ mblen;
pthread_getname_np;
quotactl;
setdomainname;
@@ -1278,6 +1275,10 @@
sigrelse;
sigset;
sync_file_range;
+ towctrans;
+ towctrans_l;
+ wctrans;
+ wctrans_l;
} LIBC_N;
LIBC_PRIVATE {
@@ -1321,4 +1322,8 @@
android_net_res_stats_get_info_for_net;
android_net_res_stats_aggregate;
android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
} LIBC_O;
diff --git a/libc/libc.mips.map b/libc/libc.mips.map
index 47a1ba2..439c855 100644
--- a/libc/libc.mips.map
+++ b/libc/libc.mips.map
@@ -625,10 +625,6 @@
madvise;
mallinfo;
malloc;
- malloc_backtrace;
- malloc_disable;
- malloc_enable;
- malloc_iterate;
malloc_info;
malloc_usable_size;
mbrlen;
@@ -1267,6 +1263,7 @@
getpwent;
getsubopt;
hasmntopt;
+ mblen;
pthread_getname_np;
quotactl;
setdomainname;
@@ -1278,6 +1275,10 @@
sigrelse;
sigset;
sync_file_range;
+ towctrans;
+ towctrans_l;
+ wctrans;
+ wctrans_l;
} LIBC_N;
LIBC_PRIVATE {
@@ -1359,4 +1360,8 @@
android_net_res_stats_get_info_for_net;
android_net_res_stats_aggregate;
android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
} LIBC_O;
diff --git a/libc/libc.mips64.map b/libc/libc.mips64.map
index b1a50ae..c853f73 100644
--- a/libc/libc.mips64.map
+++ b/libc/libc.mips64.map
@@ -552,10 +552,6 @@
madvise;
mallinfo;
malloc;
- malloc_backtrace;
- malloc_disable;
- malloc_enable;
- malloc_iterate;
malloc_info;
malloc_usable_size;
mbrlen;
@@ -1205,6 +1201,7 @@
getpwent;
getsubopt;
hasmntopt;
+ mblen;
pthread_getname_np;
quotactl;
setdomainname;
@@ -1216,6 +1213,10 @@
sigrelse;
sigset;
sync_file_range;
+ towctrans;
+ towctrans_l;
+ wctrans;
+ wctrans_l;
} LIBC_N;
LIBC_PRIVATE {
@@ -1234,4 +1235,8 @@
android_net_res_stats_get_info_for_net;
android_net_res_stats_aggregate;
android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
} LIBC_O;
diff --git a/libc/libc.x86.brillo.map b/libc/libc.x86.brillo.map
index 30eaf94..b1ba988 100644
--- a/libc/libc.x86.brillo.map
+++ b/libc/libc.x86.brillo.map
@@ -623,10 +623,6 @@
madvise;
mallinfo;
malloc;
- malloc_backtrace;
- malloc_disable;
- malloc_enable;
- malloc_iterate;
malloc_info;
malloc_usable_size;
mbrlen;
@@ -1265,6 +1261,7 @@
getpwent;
getsubopt;
hasmntopt;
+ mblen;
pthread_getname_np;
quotactl;
setdomainname;
@@ -1276,6 +1273,10 @@
sigrelse;
sigset;
sync_file_range;
+ towctrans;
+ towctrans_l;
+ wctrans;
+ wctrans_l;
} LIBC_N;
LIBC_PRIVATE {
@@ -1320,4 +1321,8 @@
android_net_res_stats_get_info_for_net;
android_net_res_stats_aggregate;
android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
} LIBC_O;
diff --git a/libc/libc.x86.map b/libc/libc.x86.map
index b98f865..bab1737 100644
--- a/libc/libc.x86.map
+++ b/libc/libc.x86.map
@@ -623,10 +623,6 @@
madvise;
mallinfo;
malloc;
- malloc_backtrace;
- malloc_disable;
- malloc_enable;
- malloc_iterate;
malloc_info;
malloc_usable_size;
mbrlen;
@@ -1265,6 +1261,7 @@
getpwent;
getsubopt;
hasmntopt;
+ mblen;
pthread_getname_np;
quotactl;
setdomainname;
@@ -1276,6 +1273,10 @@
sigrelse;
sigset;
sync_file_range;
+ towctrans;
+ towctrans_l;
+ wctrans;
+ wctrans_l;
} LIBC_N;
LIBC_PRIVATE {
@@ -1358,4 +1359,8 @@
android_net_res_stats_get_info_for_net;
android_net_res_stats_aggregate;
android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
} LIBC_O;
diff --git a/libc/libc.x86_64.map b/libc/libc.x86_64.map
index b1a50ae..c853f73 100644
--- a/libc/libc.x86_64.map
+++ b/libc/libc.x86_64.map
@@ -552,10 +552,6 @@
madvise;
mallinfo;
malloc;
- malloc_backtrace;
- malloc_disable;
- malloc_enable;
- malloc_iterate;
malloc_info;
malloc_usable_size;
mbrlen;
@@ -1205,6 +1201,7 @@
getpwent;
getsubopt;
hasmntopt;
+ mblen;
pthread_getname_np;
quotactl;
setdomainname;
@@ -1216,6 +1213,10 @@
sigrelse;
sigset;
sync_file_range;
+ towctrans;
+ towctrans_l;
+ wctrans;
+ wctrans_l;
} LIBC_N;
LIBC_PRIVATE {
@@ -1234,4 +1235,8 @@
android_net_res_stats_get_info_for_net;
android_net_res_stats_aggregate;
android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
} LIBC_O;
diff --git a/libc/include/machine/ieee.h b/libc/private/bionic_ieee.h
similarity index 100%
rename from libc/include/machine/ieee.h
rename to libc/private/bionic_ieee.h
diff --git a/libc/tools/gensyscalls.py b/libc/tools/gensyscalls.py
index f7785d6..de06a2f 100755
--- a/libc/tools/gensyscalls.py
+++ b/libc/tools/gensyscalls.py
@@ -62,9 +62,11 @@
arm_eabi_call_default = syscall_stub_header + """\
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =%(__NR_name)s
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
@@ -568,7 +570,7 @@
def gen_glibc_syscalls_h(self):
# TODO: generate a separate file for each architecture, like glibc's bits/syscall.h.
- glibc_syscalls_h_path = "include/sys/glibc-syscalls.h"
+ glibc_syscalls_h_path = "include/bits/glibc-syscalls.h"
logging.info("generating " + glibc_syscalls_h_path)
glibc_fp = create_file(glibc_syscalls_h_path)
glibc_fp.write("/* %s */\n" % warning)
diff --git a/libc/upstream-freebsd/android/include/machine/endian.h b/libc/upstream-freebsd/android/include/machine/endian.h
new file mode 100644
index 0000000..2dc4d83
--- /dev/null
+++ b/libc/upstream-freebsd/android/include/machine/endian.h
@@ -0,0 +1 @@
+#include <endian.h>
diff --git a/libc/upstream-openbsd/android/include/machine/ieee.h b/libc/upstream-openbsd/android/include/machine/ieee.h
new file mode 100644
index 0000000..dac332a
--- /dev/null
+++ b/libc/upstream-openbsd/android/include/machine/ieee.h
@@ -0,0 +1 @@
+#include "private/bionic_ieee.h"
diff --git a/libc/zoneinfo/tzdata b/libc/zoneinfo/tzdata
index d2cc535..5229797 100644
--- a/libc/zoneinfo/tzdata
+++ b/libc/zoneinfo/tzdata
Binary files differ
diff --git a/libm/Android.mk b/libm/Android.mk
index 7200e5f..b07e426 100644
--- a/libm/Android.mk
+++ b/libm/Android.mk
@@ -507,7 +507,10 @@
LOCAL_C_INCLUDES_x86 += $(LOCAL_PATH)/i387
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/upstream-freebsd/lib/msun/src/
+LOCAL_C_INCLUDES += \
+ $(LOCAL_PATH)/upstream-freebsd/android/include/ \
+ $(LOCAL_PATH)/upstream-freebsd/lib/msun/src/ \
+
LOCAL_C_INCLUDES_64 += $(LOCAL_PATH)/upstream-freebsd/lib/msun/ld128/
LOCAL_ARM_MODE := arm
diff --git a/libm/upstream-freebsd/android/include/machine/endian.h b/libm/upstream-freebsd/android/include/machine/endian.h
new file mode 100644
index 0000000..2dc4d83
--- /dev/null
+++ b/libm/upstream-freebsd/android/include/machine/endian.h
@@ -0,0 +1 @@
+#include <endian.h>
diff --git a/tests/Android.mk b/tests/Android.mk
index 8e190ea..2db1cda 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -129,6 +129,7 @@
unistd_test.cpp \
utmp_test.cpp \
wchar_test.cpp \
+ wctype_test.cpp \
libBionicStandardTests_cflags := \
$(test_cflags) \
diff --git a/tests/complex_test.cpp b/tests/complex_test.cpp
index 3b8e682..a8f6777 100644
--- a/tests/complex_test.cpp
+++ b/tests/complex_test.cpp
@@ -16,6 +16,16 @@
#include <gtest/gtest.h>
+// This file is compiled against both glibc and bionic, and our complex.h
+// depends on bionic-specific macros, so hack around that.
+#include <sys/cdefs.h>
+#if !defined(__INTRODUCED_IN)
+#define __INTRODUCED_IN(x)
+#define __INTRODUCED_IN_32(x)
+#define __INTRODUCED_IN_64(x)
+#define __INTRODUCED_IN_FUTURE
+#endif
+
// libc++ actively gets in the way of including <complex.h> from C++, so we
// have to be naughty.
#include <../libc/include/complex.h>
diff --git a/tests/stdlib_test.cpp b/tests/stdlib_test.cpp
index 05438eb..773230f 100644
--- a/tests/stdlib_test.cpp
+++ b/tests/stdlib_test.cpp
@@ -537,3 +537,26 @@
ASSERT_EQ(-1, getsubopt(&subopts, tokens, &value));
}
+
+TEST(stdlib, mblen) {
+ // "If s is a null pointer, mblen() shall return a non-zero or 0 value, if character encodings,
+ // respectively, do or do not have state-dependent encodings." We're always UTF-8.
+ EXPECT_EQ(0, mblen(nullptr, 1));
+
+ ASSERT_STREQ("C.UTF-8", setlocale(LC_ALL, "C.UTF-8"));
+
+ // 1-byte UTF-8.
+ EXPECT_EQ(1, mblen("abcdef", 6));
+ // 2-byte UTF-8.
+ EXPECT_EQ(2, mblen("\xc2\xa2" "cdef", 6));
+ // 3-byte UTF-8.
+ EXPECT_EQ(3, mblen("\xe2\x82\xac" "def", 6));
+ // 4-byte UTF-8.
+ EXPECT_EQ(4, mblen("\xf0\xa4\xad\xa2" "ef", 6));
+
+ // Illegal over-long sequence.
+ ASSERT_EQ(-1, mblen("\xf0\x82\x82\xac" "ef", 6));
+
+ // "mblen() shall ... return 0 (if s points to the null byte)".
+ EXPECT_EQ(0, mblen("", 1));
+}
diff --git a/tests/wctype_test.cpp b/tests/wctype_test.cpp
new file mode 100644
index 0000000..fe2e374
--- /dev/null
+++ b/tests/wctype_test.cpp
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <wctype.h>
+
+#include <gtest/gtest.h>
+
+class UtfLocale {
+ public:
+ UtfLocale() : l(newlocale(LC_ALL, "C.UTF-8", 0)) {}
+ ~UtfLocale() { freelocale(l); }
+ locale_t l;
+};
+
+static void TestIsWideFn(int fn(wint_t),
+ int fn_l(wint_t, locale_t),
+ const wchar_t* trues,
+ const wchar_t* falses) {
+ UtfLocale l;
+ for (const wchar_t* p = trues; *p; ++p) {
+ EXPECT_TRUE(fn(*p)) << *p;
+ EXPECT_TRUE(fn_l(*p, l.l)) << *p;
+ }
+ for (const wchar_t* p = falses; *p; ++p) {
+ EXPECT_FALSE(fn(*p)) << *p;
+ EXPECT_FALSE(fn_l(*p, l.l)) << *p;
+ }
+}
+
+TEST(wctype, iswalnum) {
+ TestIsWideFn(iswalnum, iswalnum_l, L"1aA", L"! \b");
+}
+
+TEST(wctype, iswalpha) {
+ TestIsWideFn(iswalpha, iswalpha_l, L"aA", L"1! \b");
+}
+
+TEST(wctype, iswblank) {
+ TestIsWideFn(iswblank, iswblank_l, L" \t", L"1aA!\b");
+}
+
+TEST(wctype, iswcntrl) {
+ TestIsWideFn(iswcntrl, iswcntrl_l, L"\b", L"1aA! ");
+}
+
+TEST(wctype, iswdigit) {
+ TestIsWideFn(iswdigit, iswdigit_l, L"1", L"aA! \b");
+}
+
+TEST(wctype, iswgraph) {
+ TestIsWideFn(iswgraph, iswgraph_l, L"1aA!", L" \b");
+}
+
+TEST(wctype, iswlower) {
+ TestIsWideFn(iswlower, iswlower_l, L"a", L"1A! \b");
+}
+
+TEST(wctype, iswprint) {
+ TestIsWideFn(iswprint, iswprint_l, L"1aA! ", L"\b");
+}
+
+TEST(wctype, iswpunct) {
+ TestIsWideFn(iswpunct, iswpunct_l, L"!", L"1aA \b");
+}
+
+TEST(wctype, iswspace) {
+ TestIsWideFn(iswspace, iswspace_l, L" \f\t", L"1aA!\b");
+}
+
+TEST(wctype, iswupper) {
+ TestIsWideFn(iswupper, iswupper_l, L"A", L"1a! \b");
+}
+
+TEST(wctype, iswxdigit) {
+ TestIsWideFn(iswxdigit, iswxdigit_l, L"01aA", L"xg! \b");
+}
+
+TEST(wctype, towlower) {
+ EXPECT_EQ(wint_t('!'), towlower(L'!'));
+ EXPECT_EQ(wint_t('a'), towlower(L'a'));
+ EXPECT_EQ(wint_t('a'), towlower(L'A'));
+}
+
+TEST(wctype, towlower_l) {
+ UtfLocale l;
+ EXPECT_EQ(wint_t('!'), towlower_l(L'!', l.l));
+ EXPECT_EQ(wint_t('a'), towlower_l(L'a', l.l));
+ EXPECT_EQ(wint_t('a'), towlower_l(L'A', l.l));
+}
+
+TEST(wctype, towupper) {
+ EXPECT_EQ(wint_t('!'), towupper(L'!'));
+ EXPECT_EQ(wint_t('A'), towupper(L'a'));
+ EXPECT_EQ(wint_t('A'), towupper(L'A'));
+}
+
+TEST(wctype, towupper_l) {
+ UtfLocale l;
+ EXPECT_EQ(wint_t('!'), towupper_l(L'!', l.l));
+ EXPECT_EQ(wint_t('A'), towupper_l(L'a', l.l));
+ EXPECT_EQ(wint_t('A'), towupper_l(L'A', l.l));
+}
+
+TEST(wctype, wctype) {
+ EXPECT_TRUE(wctype("alnum") != 0);
+ EXPECT_TRUE(wctype("alpha") != 0);
+ EXPECT_TRUE(wctype("blank") != 0);
+ EXPECT_TRUE(wctype("cntrl") != 0);
+ EXPECT_TRUE(wctype("digit") != 0);
+ EXPECT_TRUE(wctype("graph") != 0);
+ EXPECT_TRUE(wctype("lower") != 0);
+ EXPECT_TRUE(wctype("print") != 0);
+ EXPECT_TRUE(wctype("punct") != 0);
+ EXPECT_TRUE(wctype("space") != 0);
+ EXPECT_TRUE(wctype("upper") != 0);
+ EXPECT_TRUE(wctype("xdigit") != 0);
+
+ EXPECT_TRUE(wctype("monkeys") == 0);
+}
+
+TEST(wctype, wctype_l) {
+ UtfLocale l;
+ EXPECT_TRUE(wctype_l("alnum", l.l) != 0);
+ EXPECT_TRUE(wctype_l("alpha", l.l) != 0);
+ EXPECT_TRUE(wctype_l("blank", l.l) != 0);
+ EXPECT_TRUE(wctype_l("cntrl", l.l) != 0);
+ EXPECT_TRUE(wctype_l("digit", l.l) != 0);
+ EXPECT_TRUE(wctype_l("graph", l.l) != 0);
+ EXPECT_TRUE(wctype_l("lower", l.l) != 0);
+ EXPECT_TRUE(wctype_l("print", l.l) != 0);
+ EXPECT_TRUE(wctype_l("punct", l.l) != 0);
+ EXPECT_TRUE(wctype_l("space", l.l) != 0);
+ EXPECT_TRUE(wctype_l("upper", l.l) != 0);
+ EXPECT_TRUE(wctype_l("xdigit", l.l) != 0);
+
+ EXPECT_TRUE(wctype_l("monkeys", l.l) == 0);
+}
+
+TEST(wctype, iswctype) {
+ EXPECT_TRUE(iswctype(L'a', wctype("alnum")));
+ EXPECT_TRUE(iswctype(L'1', wctype("alnum")));
+ EXPECT_FALSE(iswctype(L' ', wctype("alnum")));
+
+ EXPECT_EQ(0, iswctype(WEOF, wctype("alnum")));
+}
+
+TEST(wctype, iswctype_l) {
+ UtfLocale l;
+ EXPECT_TRUE(iswctype_l(L'a', wctype_l("alnum", l.l), l.l));
+ EXPECT_TRUE(iswctype_l(L'1', wctype_l("alnum", l.l), l.l));
+ EXPECT_FALSE(iswctype_l(L' ', wctype_l("alnum", l.l), l.l));
+
+ EXPECT_EQ(0, iswctype_l(WEOF, wctype_l("alnum", l.l), l.l));
+}
+
+TEST(wctype, towctrans) {
+ EXPECT_TRUE(wctrans("tolower") != 0);
+ EXPECT_TRUE(wctrans("toupper") != 0);
+
+ EXPECT_TRUE(wctrans("monkeys") == 0);
+}
+
+TEST(wctype, towctrans_l) {
+ UtfLocale l;
+ EXPECT_TRUE(wctrans_l("tolower", l.l) != 0);
+ EXPECT_TRUE(wctrans_l("toupper", l.l) != 0);
+
+ EXPECT_TRUE(wctrans_l("monkeys", l.l) == 0);
+}
+
+TEST(wctype, wctrans) {
+ EXPECT_EQ(wint_t('a'), towctrans(L'A', wctrans("tolower")));
+ EXPECT_EQ(WEOF, towctrans(WEOF, wctrans("tolower")));
+
+ EXPECT_EQ(wint_t('A'), towctrans(L'a', wctrans("toupper")));
+ EXPECT_EQ(WEOF, towctrans(WEOF, wctrans("toupper")));
+}
+
+TEST(wctype, wctrans_l) {
+ UtfLocale l;
+ EXPECT_EQ(wint_t('a'), towctrans_l(L'A', wctrans_l("tolower", l.l), l.l));
+ EXPECT_EQ(WEOF, towctrans_l(WEOF, wctrans_l("tolower", l.l), l.l));
+
+ EXPECT_EQ(wint_t('A'), towctrans_l(L'a', wctrans_l("toupper", l.l), l.l));
+ EXPECT_EQ(WEOF, towctrans_l(WEOF, wctrans_l("toupper", l.l), l.l));
+}