summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2011-04-06 12:29:09 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2011-04-06 12:29:09 +0000
commitba3e6667cce786c47e996376ef211b1033cce663 (patch)
tree3c292c29b7edd0678aea2318b4806de47d76d7fe
parenteafa4e4b5bee6f95382bc3cc8b08c9368e054717 (diff)
downloadbcm5719-llvm-ba3e6667cce786c47e996376ef211b1033cce663.tar.gz
bcm5719-llvm-ba3e6667cce786c47e996376ef211b1033cce663.zip
Do not use IR marker for LLVM intrinsics
llvm-svn: 129001
-rw-r--r--clang/lib/AST/ItaniumMangle.cpp5
-rw-r--r--clang/test/CodeGen/mangle.c9
2 files changed, 12 insertions, 2 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index bb274a96f1c..6ab68dbae92 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -334,10 +334,11 @@ void CXXNameMangler::mangle(const NamedDecl *D, llvm::StringRef Prefix) {
// another has a "\01foo". That is known to happen on ELF with the
// tricks normally used for producing aliases (PR9177). Fortunately the
// llvm mangler on ELF is a nop, so we can just avoid adding the \01
- // marker.
+ // marker. We also avoid adding the marker if this is an alias for an
+ // LLVM intrinsic.
llvm::StringRef UserLabelPrefix =
getASTContext().Target.getUserLabelPrefix();
- if (!UserLabelPrefix.empty())
+ if (!UserLabelPrefix.empty() && !ALA->getLabel().startswith("llvm."))
Out << '\01'; // LLVM IR Marker for __asm("foo")
Out << ALA->getLabel();
diff --git a/clang/test/CodeGen/mangle.c b/clang/test/CodeGen/mangle.c
index 3bbd9c8b807..46ef512f695 100644
--- a/clang/test/CodeGen/mangle.c
+++ b/clang/test/CodeGen/mangle.c
@@ -63,3 +63,12 @@ int func(void) {
// CHECK: @_Z4foo9Dv4_f
typedef __attribute__(( vector_size(16) )) float float4;
void __attribute__((__overloadable__)) foo9(float4 f) {}
+
+// Intrinsic calls.
+extern int llvm_cas(volatile int*, int, int)
+ __asm__("llvm.atomic.cmp.swap.i32.p0i32");
+
+int foo10(volatile int* add, int from, int to) {
+ // CHECK: call i32 @llvm.atomic.cmp.swap.i32.p0i32
+ return llvm_cas(add, from, to);
+}
OpenPOWER on IntegriCloud