From: Renato Golin Date: Wed, 26 Mar 2014 14:01:32 +0000 (+0000) Subject: Change @llvm.clear_cache default to call rt-lib X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=58839f43de03c894c3398ba2f7429c3ba82c96c1 Change @llvm.clear_cache default to call rt-lib After some discussion on IRC, emitting a call to the library function seems like a better default, since it will move from a compiler internal error to a linker error, that the user can work around until LLVM is fixed. I'm also adding a note on the responsibility of the user to confirm that the cache was cleared on platforms where nothing is done. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204806 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/docs/LangRef.rst b/docs/LangRef.rst index d18d4ebac90..1a6549a15d6 100644 --- a/docs/LangRef.rst +++ b/docs/LangRef.rst @@ -6964,10 +6964,20 @@ Semantics: When directly supported, this intrinsic will either return a call to the appropriate cache clearing system call (usually ``__clear_cache``) when the caches are not unified (ARM, Mips) or just remove the call -altogether when they are (ex. x86_64). - -Targets must implement it directly to have either behaviour, as the -default is to bail with "Not Implemented" message. +altogether when they are (ex. x86_64). Some targets can lower these +directly into special instructions, if they have it. + +The default behaviour is to emit a call to ``__clear_cache``, so in +case a target doesn't support it, the user gets a linker error rather +than a compiler internal error. It also provides a work around to +the user (implement an empty function called ``__clear_cache``) while +LLVM doesn't implement it in the target's back-end. + +Please note that the caller is responsible for ensuring the cache +is actually cleared. This is most important in targets that don't +need to flush the cache directly (ex. x86_64) and could potentially +still execute old instructions while the cache is not cleared. LLVM +will *not* insert nops or busy-wait sequences. Standard C Library Intrinsics ----------------------------- diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h index fbc8b74e9e7..7f35244f196 100644 --- a/include/llvm/Target/TargetLowering.h +++ b/include/llvm/Target/TargetLowering.h @@ -2109,8 +2109,9 @@ public: } /// Return the builtin name for the __builtin___clear_cache intrinsic + /// Default is to invoke the clear cache library call virtual const char * getClearCacheBuiltinName() const { - llvm_unreachable("Not Implemented"); + return "__clear_cache"; } /// Return the type that should be used to zero or sign extend a diff --git a/lib/Target/ARM/ARMISelLowering.h b/lib/Target/ARM/ARMISelLowering.h index 5f6ea754348..022945f625a 100644 --- a/lib/Target/ARM/ARMISelLowering.h +++ b/lib/Target/ARM/ARMISelLowering.h @@ -384,11 +384,6 @@ namespace llvm { bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const override; - /// Clear cache library call - const char * getClearCacheBuiltinName() const { - return "__clear_cache"; - } - protected: std::pair findRepresentativeClass(MVT VT) const override; diff --git a/lib/Target/Mips/MipsISelLowering.h b/lib/Target/Mips/MipsISelLowering.h index 7831fecae1c..6f60a1e18f3 100644 --- a/lib/Target/Mips/MipsISelLowering.h +++ b/lib/Target/Mips/MipsISelLowering.h @@ -585,11 +585,6 @@ namespace llvm { bool MemcpyStrSrc, MachineFunction &MF) const; - /// Clear cache library call - const char * getClearCacheBuiltinName() const { - return "__clear_cache"; - } - /// isFPImmLegal - Returns true if the target can instruction select the /// specified FP immediate natively. If false, the legalizer will /// materialize the FP immediate as a load from a constant pool.