summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-03-19 15:03:47 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-03-19 15:03:47 +0000
commit513499d0ad4ff3aad80d7dda9819a0c51cfe6496 (patch)
tree9893a5b0bd7a637efde0b17857d3240a81e13f8e
parent95eaa216379eea52ca12bebf29ab6e052a2e3a72 (diff)
downloadbcm5719-llvm-513499d0ad4ff3aad80d7dda9819a0c51cfe6496.tar.gz
bcm5719-llvm-513499d0ad4ff3aad80d7dda9819a0c51cfe6496.zip
Don't try to set attributes in alias, they have none.
llvm-svn: 177402
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp4
-rw-r--r--clang/test/CodeGenCXX/constructor-alias.cpp12
2 files changed, 15 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 402b309f8ec..173774452e9 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -656,7 +656,9 @@ void CodeGenModule::SetCommonAttributes(const Decl *D,
if (const SectionAttr *SA = D->getAttr<SectionAttr>())
GV->setSection(SA->getName());
- getTargetCodeGenInfo().SetTargetAttributes(D, GV, *this);
+ // Alias cannot have attributes. Filter them here.
+ if (!isa<llvm::GlobalAlias>(GV))
+ getTargetCodeGenInfo().SetTargetAttributes(D, GV, *this);
}
void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
diff --git a/clang/test/CodeGenCXX/constructor-alias.cpp b/clang/test/CodeGenCXX/constructor-alias.cpp
new file mode 100644
index 00000000000..18a47775012
--- /dev/null
+++ b/clang/test/CodeGenCXX/constructor-alias.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -emit-llvm -triple mipsel--linux-gnu -mconstructor-aliases -o - %s | FileCheck %s
+
+// The target attribute code used to get confused with aliases. Make sure
+// we don't crash when an alias is used.
+
+struct B {
+ B();
+};
+B::B() {
+}
+
+// CHECK: @_ZN1BC1Ev = alias void (%struct.B*)* @_ZN1BC2Ev
OpenPOWER on IntegriCloud