summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorRenato Golin <renato.golin@linaro.org>2014-03-26 14:01:32 +0000
committerRenato Golin <renato.golin@linaro.org>2014-03-26 14:01:32 +0000
commit93010e687fbac2800f04bfef2f32005179bc0f73 (patch)
treeab1259be4cbfb3ea070e1c13e03190d6b64d76f1 /llvm
parent6dd7251599724fc308a5d6ae31baaccf3154bc4c (diff)
downloadbcm5719-llvm-93010e687fbac2800f04bfef2f32005179bc0f73.tar.gz
bcm5719-llvm-93010e687fbac2800f04bfef2f32005179bc0f73.zip
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. llvm-svn: 204806
Diffstat (limited to 'llvm')
-rw-r--r--llvm/docs/LangRef.rst18
-rw-r--r--llvm/include/llvm/Target/TargetLowering.h3
-rw-r--r--llvm/lib/Target/ARM/ARMISelLowering.h5
-rw-r--r--llvm/lib/Target/Mips/MipsISelLowering.h5
4 files changed, 16 insertions, 15 deletions
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst
index d18d4ebac90..1a6549a15d6 100644
--- a/llvm/docs/LangRef.rst
+++ b/llvm/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/llvm/include/llvm/Target/TargetLowering.h b/llvm/include/llvm/Target/TargetLowering.h
index fbc8b74e9e7..7f35244f196 100644
--- a/llvm/include/llvm/Target/TargetLowering.h
+++ b/llvm/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/llvm/lib/Target/ARM/ARMISelLowering.h b/llvm/lib/Target/ARM/ARMISelLowering.h
index 5f6ea754348..022945f625a 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.h
+++ b/llvm/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<const TargetRegisterClass*, uint8_t>
findRepresentativeClass(MVT VT) const override;
diff --git a/llvm/lib/Target/Mips/MipsISelLowering.h b/llvm/lib/Target/Mips/MipsISelLowering.h
index 7831fecae1c..6f60a1e18f3 100644
--- a/llvm/lib/Target/Mips/MipsISelLowering.h
+++ b/llvm/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.
OpenPOWER on IntegriCloud