llvm-project/clang/lib/Basic
Yaxun Liu 8f66b4b44a Add support for non-zero null pointer for C and OpenCL
In amdgcn target, null pointers in global, constant, and generic address space take value 0 but null pointers in private and local address space take value -1. Currently LLVM assumes all null pointers take value 0, which results in incorrectly translated IR. To workaround this issue, instead of emit null pointers in local and private address space, a null pointer in generic address space is emitted and casted to local and private address space.

Tentative definition of global variables with non-zero initializer will have weak linkage instead of common linkage since common linkage requires zero initializer and does not have explicit section to hold the non-zero value.

Virtual member functions getNullPointer and performAddrSpaceCast are added to TargetCodeGenInfo which by default returns ConstantPointerNull and emitting addrspacecast instruction. A virtual member function getNullPointerValue is added to TargetInfo which by default returns 0. Each target can override these virtual functions to get target specific null pointer and the null pointer value for specific address space, and perform specific translations for addrspacecast.

Wrapper functions getNullPointer is added to CodegenModule and getTargetNullPointerValue is added to ASTContext to facilitate getting the target specific null pointers and their values.

This change has no effect on other targets except amdgcn target. Other targets can provide support of non-zero null pointer in a similar way.

This change only provides support for non-zero null pointer for C and OpenCL. Supporting for other languages will be added later incrementally.

Differential Revision: https://reviews.llvm.org/D26196

llvm-svn: 289252
2016-12-09 19:01:11 +00:00
..
Attributes.cpp Ignore the "novtable" declspec when not using the Microsoft C++ ABI. 2015-07-20 22:57:31 +00:00
Builtins.cpp [OpenCL] Make OpenCL Builtins added according to the right version. 2016-07-04 16:07:18 +00:00
CMakeLists.txt [cmake] Use LLVM_CMAKE_PATH for GetSVN script 2016-10-19 12:21:39 +00:00
CharInfo.cpp
Cuda.cpp [CUDA] Fix "control reaches end of non-void function" warnings in Cuda.cpp. 2016-07-07 01:06:59 +00:00
Diagnostic.cpp [Diag] Fix idiom in comment: "on the lam", not "on the lamb". 2016-08-10 01:09:07 +00:00
DiagnosticIDs.cpp [PCH/preamble] Make sure that if the preamble/PCH was serialized with errors that we set diagnostic engine state appropriately. 2016-07-13 20:35:26 +00:00
DiagnosticOptions.cpp [NFC] Header cleanup 2016-07-18 19:02:11 +00:00
FileManager.cpp Turn FileManager DirectoryEntry::Name from raw pointer to StringRef (NFC) 2016-10-11 07:31:29 +00:00
FileSystemStatCache.cpp [VFS] Replace TimeValue usage with std::chrono 2016-11-09 10:52:22 +00:00
IdentifierTable.cpp Add some more asserts to clearly indicate that there are special cases 2016-11-04 06:32:57 +00:00
LangOptions.cpp Do not print include_next/pragma once warnings when input is a header. 2016-10-27 14:17:10 +00:00
Module.cpp [Modules] Add 'no_undeclared_includes' module map attribute 2016-10-21 01:41:56 +00:00
ObjCRuntime.cpp Watch and TV OS: wire up basic ABI choices 2015-10-30 16:30:36 +00:00
OpenMPKinds.cpp [OpenMP] Sema and parsing for 'teams distribute parallel for' pragma 2016-12-09 03:24:30 +00:00
OperatorPrecedence.cpp [OpenCL] Adding reserved operator logical xor for OpenCL 2016-02-03 15:17:14 +00:00
SanitizerBlacklist.cpp Replace double-negated !SourceLocation.isInvalid() with SourceLocation.isValid(). 2015-10-03 05:15:57 +00:00
Sanitizers.cpp Pull trivial SanitizerSet methods into the header. 2015-07-14 15:34:19 +00:00
SourceLocation.cpp [NFC] Header cleanup 2016-07-18 19:02:11 +00:00
SourceManager.cpp Drop a redundant ".get()" call (NFC) 2016-10-18 18:19:02 +00:00
TargetInfo.cpp P0035R4: add predefined __STDCPP_DEFAULT_NEW_ALIGNMENT__ macro. By default, we 2016-09-30 22:41:36 +00:00
Targets.cpp Add support for non-zero null pointer for C and OpenCL 2016-12-09 19:01:11 +00:00
TokenKinds.cpp [C++11] Use 'nullptr'. 2014-05-08 06:41:40 +00:00
Version.cpp Revert r223578, perf data collection depends on the old symbol name. 2014-12-10 23:49:03 +00:00
VersionTuple.cpp MS ABI: Implement driver-level support for thread-safe statics 2015-03-22 08:39:22 +00:00
VirtualFileSystem.cpp [VFS] Replace TimeValue usage with std::chrono 2016-11-09 10:52:22 +00:00
Warnings.cpp Use -Rblah, not -Wblah, to control remark diagnostics. This was always the 2014-08-07 00:24:21 +00:00