OLD | NEW |
---|---|
1 //===---- CGBuiltin.cpp - Emit LLVM Code for builtins ---------------------===// | 1 //===---- CGBuiltin.cpp - Emit LLVM Code for builtins ---------------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This contains code to emit Builtin calls as LLVM code. | 10 // This contains code to emit Builtin calls as LLVM code. |
11 // | 11 // |
12 //===----------------------------------------------------------------------===// | 12 //===----------------------------------------------------------------------===// |
13 | 13 |
14 #include "CodeGenFunction.h" | 14 #include "CodeGenFunction.h" |
15 #include "CGObjCRuntime.h" | 15 #include "CGObjCRuntime.h" |
16 #include "CodeGenModule.h" | 16 #include "CodeGenModule.h" |
17 #include "TargetInfo.h" | 17 #include "TargetInfo.h" |
18 #include "clang/AST/ASTContext.h" | 18 #include "clang/AST/ASTContext.h" |
19 #include "clang/AST/Decl.h" | 19 #include "clang/AST/Decl.h" |
20 #include "clang/Basic/TargetBuiltins.h" | 20 #include "clang/Basic/TargetBuiltins.h" |
21 #include "clang/Basic/TargetInfo.h" | 21 #include "clang/Basic/TargetInfo.h" |
22 #include "llvm/IR/DataLayout.h" | 22 #include "llvm/IR/DataLayout.h" |
23 #include "llvm/IR/InlineAsm.h" // @LOCALMOD | |
23 #include "llvm/IR/Intrinsics.h" | 24 #include "llvm/IR/Intrinsics.h" |
24 | 25 |
25 using namespace clang; | 26 using namespace clang; |
26 using namespace CodeGen; | 27 using namespace CodeGen; |
27 using namespace llvm; | 28 using namespace llvm; |
28 | 29 |
29 /// getBuiltinLibFunction - Given a builtin id for a function like | 30 /// getBuiltinLibFunction - Given a builtin id for a function like |
30 /// "__builtin_fabsf", return a Function* for "fabsf". | 31 /// "__builtin_fabsf", return a Function* for "fabsf". |
31 llvm::Value *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD, | 32 llvm::Value *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD, |
32 unsigned BuiltinID) { | 33 unsigned BuiltinID) { |
(...skipping 994 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1027 } | 1028 } |
1028 | 1029 |
1029 case Builtin::BI__sync_synchronize: { | 1030 case Builtin::BI__sync_synchronize: { |
1030 // We assume this is supposed to correspond to a C++0x-style | 1031 // We assume this is supposed to correspond to a C++0x-style |
1031 // sequentially-consistent fence (i.e. this is only usable for | 1032 // sequentially-consistent fence (i.e. this is only usable for |
1032 // synchonization, not device I/O or anything like that). This intrinsic | 1033 // synchonization, not device I/O or anything like that). This intrinsic |
1033 // is really badly designed in the sense that in theory, there isn't | 1034 // is really badly designed in the sense that in theory, there isn't |
1034 // any way to safely use it... but in practice, it mostly works | 1035 // any way to safely use it... but in practice, it mostly works |
1035 // to use it with non-atomic loads and stores to get acquire/release | 1036 // to use it with non-atomic loads and stores to get acquire/release |
1036 // semantics. | 1037 // semantics. |
1038 // @LOCALMOD-START | |
1039 // For PNaCl, surround __sync_synchronize with compiler fences. This | |
1040 // should enforce ordering of more than just atomic memory accesses, | |
1041 // though it won't guarantee that all accesses (e.g. those to | |
1042 // non-escaping objects) will not be reordered. | |
1043 llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false); | |
1044 std::string AsmString; // Empty. | |
1045 std::string Constraints("~{memory}"); | |
1046 bool HasSideEffect = true; | |
1047 if (getTarget().getTriple().getArch() == llvm::Triple::le32) | |
eliben
2013/08/06 16:26:56
It would be cleaner to have a single LOCAMOD if-br
JF
2013/08/07 17:58:28
Done, and as suggested offline the code now uses T
| |
1048 Builder.CreateCall( | |
1049 llvm::InlineAsm::get(FTy, AsmString, Constraints, HasSideEffect))-> | |
1050 addAttribute(llvm::AttributeSet::FunctionIndex, | |
1051 llvm::Attribute::NoUnwind); | |
1037 Builder.CreateFence(llvm::SequentiallyConsistent); | 1052 Builder.CreateFence(llvm::SequentiallyConsistent); |
1053 if (getTarget().getTriple().getArch() == llvm::Triple::le32) | |
1054 Builder.CreateCall( | |
1055 llvm::InlineAsm::get(FTy, AsmString, Constraints, HasSideEffect))-> | |
1056 addAttribute(llvm::AttributeSet::FunctionIndex, | |
1057 llvm::Attribute::NoUnwind); | |
1058 // @LOCALMOD-END | |
1038 return RValue::get(0); | 1059 return RValue::get(0); |
1039 } | 1060 } |
1040 | 1061 |
1041 case Builtin::BI__c11_atomic_is_lock_free: | 1062 case Builtin::BI__c11_atomic_is_lock_free: |
1042 case Builtin::BI__atomic_is_lock_free: { | 1063 case Builtin::BI__atomic_is_lock_free: { |
1043 // Call "bool __atomic_is_lock_free(size_t size, void *ptr)". For the | 1064 // Call "bool __atomic_is_lock_free(size_t size, void *ptr)". For the |
1044 // __c11 builtin, ptr is 0 (indicating a properly-aligned object), since | 1065 // __c11 builtin, ptr is 0 (indicating a properly-aligned object), since |
1045 // _Atomic(T) is always properly-aligned. | 1066 // _Atomic(T) is always properly-aligned. |
1046 const char *LibCallName = "__atomic_is_lock_free"; | 1067 const char *LibCallName = "__atomic_is_lock_free"; |
1047 CallArgList Args; | 1068 CallArgList Args; |
(...skipping 1802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2850 break; | 2871 break; |
2851 case PPC::BI__builtin_altivec_stvewx: | 2872 case PPC::BI__builtin_altivec_stvewx: |
2852 ID = Intrinsic::ppc_altivec_stvewx; | 2873 ID = Intrinsic::ppc_altivec_stvewx; |
2853 break; | 2874 break; |
2854 } | 2875 } |
2855 llvm::Function *F = CGM.getIntrinsic(ID); | 2876 llvm::Function *F = CGM.getIntrinsic(ID); |
2856 return Builder.CreateCall(F, Ops, ""); | 2877 return Builder.CreateCall(F, Ops, ""); |
2857 } | 2878 } |
2858 } | 2879 } |
2859 } | 2880 } |
OLD | NEW |