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). +altogether when they are (ex. x86_64). Some targets can lower these +directly into special instructions, if they have it. -Targets must implement it directly to have either behaviour, as the -default is to bail with "Not Implemented" message. +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.