summaryrefslogtreecommitdiff
path: root/src/include
AgeCommit message (Collapse)AuthorFilesLines
2019-03-12make FILE a complete type for pre-C11 standard profilesRich Felker2-0/+11
C11 removed the requirement that FILE be a complete type, which was deemed erroneous, as part of the changes introduced by N1439 regarding completeness of types (see footnote 6 for specific mention of FILE). however the current version of POSIX is still based on C99 and incorporates the old requirement that FILE be a complete type. expose an arbitrary, useless complete type definition because the actual object used to represent FILE streams cannot be public/ABI. thanks to commit 13d1afa46f8098df290008c681816c9eb89ffbdb, we now have a framework for suppressing the public complete-type definition of FILE when stdio.h is included internally, so that a different internal definition can be provided. this is perfectly well-defined, since the same struct tag can refer to different types in different translation units. it would be a problem if the implementation were accessing the application's FILE objects or vice versa, but either would be undefined behavior.
2019-02-22add membarrier syscall wrapper, refactor dynamic tls install to use itRich Felker1-0/+9
the motivation for this change is twofold. first, it gets the fallback logic out of the dynamic linker, improving code readability and organization. second, it provides application code that wants to use the membarrier syscall, which depends on preregistration of intent before the process becomes multithreaded unless unbounded latency is acceptable, with a symbol that, when linked, ensures that this registration happens.
2019-02-16introduce namespace-safe rwlock aliases; use in pthread_key_createRich Felker1-0/+7
commit 84d061d5a31c9c773e29e1e2b1ffe8cb9557bc58 inadvertently introduced namespace violations by using the pthread-namespace rwlock functions in pthread_key_create, which is in turn used for C11 tss. fix that and possible future uses of rwlocks elsewhere.
2018-12-09add namespace-safe version of getauxval for internal useRich Felker1-0/+10
2018-10-18bypass indirection through pointer objects to access stdin/out/errRich Felker1-0/+18
by ABI, the public stdin/out/err macros use extern pointer objects, and this is necessary to avoid copy relocations that would be expensive and make the size of the FILE structure part of the ABI. however, internally it makes sense to access the underlying FILE objects directly. this avoids both an indirection through the GOT to find the address of the stdin/out/err pointer objects (which can't be computed PC-relative because they may have been moved to the main program by copy relocations) and an indirection through the resulting pointer object. in most places this is just a minor optimization, but in the case of getchar and putchar (and the unlocked versions thereof), ipa constant propagation makes all accesses to members of stdin/out PC-relative or GOT-relative, possibly reducing register pressure as well.
2018-09-14add hidden version of &errno accessor functionRich Felker1-0/+11
this significantly improves codegen in functions that need to access errno but otherwise have no need for a GOT pointer. we could probably improve it much more by including an inline version of the &errno accessor function, but that depends on having the definitions of struct __pthread and __pthread_self(), which at present would expose a lot more than is appropriate. moving them to a small tls.h later might make this more reasonable.
2018-09-12use wrapper headers to hide most namespaced/internally-public symbolsRich Felker12-60/+64
not all prefixed symbols can be made hidden. some are part of ABI-compat (e.g. __nl_langinfo_l) and others are ABI as a consequence of the way copy relocations for weak aliases work in ELF shared libraries. most, however, can be made hidden. with this commit, there should be no remaining unintentionally visible symbols exported from libc.so.
2018-09-12declare __env_rm_add in wrapper stdlib.hRich Felker1-0/+1
this is perhaps not the ideal place, but no better alternatives stand out.
2018-09-12overhaul internally-public declarations using wrapper headersRich Felker14-0/+173
commits leading up to this one have moved the vast majority of libc-internal interface declarations to appropriate internal headers, allowing them to be type-checked and setting the stage to limit their visibility. the ones that have not yet been moved are mostly namespace-protected aliases for standard/public interfaces, which exist to facilitate implementing plain C functions in terms of POSIX functionality, or C or POSIX functionality in terms of extensions that are not standardized. some don't quite fit this description, but are "internally public" interfacs between subsystems of libc. rather than create a number of newly-named headers to declare these functions, and having to add explicit include directives for them to every source file where they're needed, I have introduced a method of wrapping the corresponding public headers. parallel to the public headers in $(srcdir)/include, we now have wrappers in $(srcdir)/src/include that come earlier in the include path order. they include the public header they're wrapping, then add declarations for namespace-protected versions of the same interfaces and any "internally public" interfaces for the subsystem they correspond to. along these lines, the wrapper for features.h is now responsible for the definition of the hidden, weak, and weak_alias macros. this means source files will no longer need to include any special headers to access these features. over time, it is my expectation that the scope of what is "internally public" will expand, reducing the number of source files which need to include *_impl.h and related headers down to those which are actually implementing the corresponding subsystems, not just using them.