summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2013-09-10 20:43:12 +0000
committerReid Kleckner <reid@kleckner.net>2013-09-10 20:43:12 +0000
commit1ece9fc80677745278bbe670c595215b1748c951 (patch)
treeaf60f15c71debdd36a38f60c6d77cf79cb5671c0 /clang/lib/AST
parent24ffd63626708237ad9b30d6aa237ae5d0c86c8b (diff)
downloadbcm5719-llvm-1ece9fc80677745278bbe670c595215b1748c951.tar.gz
bcm5719-llvm-1ece9fc80677745278bbe670c595215b1748c951.zip
[ms-cxxabi] Mangle dynamic initializer stubs the same way MSVC does
Summary: Dynamic initializers are mangled as ??__E <name> YAXXZ. Reviewers: timurrrr CC: cfe-commits Differential Revision: http://llvm-reviews.chandlerc.com/D1477 llvm-svn: 190434
Diffstat (limited to 'clang/lib/AST')
-rw-r--r--clang/lib/AST/ItaniumMangle.cpp9
-rw-r--r--clang/lib/AST/MicrosoftMangle.cpp28
2 files changed, 31 insertions, 6 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 1d8a311c614..38a6223f788 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -153,6 +153,7 @@ public:
raw_ostream &);
void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &);
+ void mangleDynamicInitializer(const VarDecl *D, raw_ostream &Out);
void mangleDynamicAtExitDestructor(const VarDecl *D, raw_ostream &Out);
void mangleItaniumThreadLocalInit(const VarDecl *D, raw_ostream &);
void mangleItaniumThreadLocalWrapper(const VarDecl *D, raw_ostream &);
@@ -3701,6 +3702,14 @@ void ItaniumMangleContext::mangleStaticGuardVariable(const VarDecl *D,
Mangler.mangleName(D);
}
+void ItaniumMangleContext::mangleDynamicInitializer(const VarDecl *MD,
+ raw_ostream &Out) {
+ // These symbols are internal in the Itanium ABI, so the names don't matter.
+ // Clang has traditionally used this symbol and allowed LLVM to adjust it to
+ // avoid duplicate symbols.
+ Out << "__cxx_global_var_init";
+}
+
void ItaniumMangleContext::mangleDynamicAtExitDestructor(const VarDecl *D,
raw_ostream &Out) {
// Prefix the mangling of D with __dtor_.
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp
index 7e3d6c21395..3ccc2bddf6d 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -170,8 +170,12 @@ public:
raw_ostream &);
virtual void mangleReferenceTemporary(const VarDecl *, raw_ostream &);
virtual void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &Out);
+ virtual void mangleDynamicInitializer(const VarDecl *D, raw_ostream &Out);
virtual void mangleDynamicAtExitDestructor(const VarDecl *D,
raw_ostream &Out);
+
+private:
+ void mangleInitFiniStub(const VarDecl *D, raw_ostream &Out, char CharCode);
};
}
@@ -1941,17 +1945,29 @@ void MicrosoftMangleContext::mangleStaticGuardVariable(const VarDecl *VD,
Mangler.getStream() << (Visible ? "@51" : "@4IA");
}
-void MicrosoftMangleContext::mangleDynamicAtExitDestructor(const VarDecl *D,
- raw_ostream &Out) {
- // <destructor-name> ::= ?__F <postfix> YAXXZ
+void MicrosoftMangleContext::mangleInitFiniStub(const VarDecl *D,
+ raw_ostream &Out,
+ char CharCode) {
MicrosoftCXXNameMangler Mangler(*this, Out);
- Mangler.getStream() << "\01??__F";
+ Mangler.getStream() << "\01??__" << CharCode;
Mangler.mangleName(D);
- // This is the mangling of the function type of the stub, which is a global,
- // non-variadic, cdecl function that returns void and takes no args.
+ // This is the function class mangling. These stubs are global, non-variadic,
+ // cdecl functions that return void and take no args.
Mangler.getStream() << "YAXXZ";
}
+void MicrosoftMangleContext::mangleDynamicInitializer(const VarDecl *D,
+ raw_ostream &Out) {
+ // <initializer-name> ::= ?__E <name> YAXXZ
+ mangleInitFiniStub(D, Out, 'E');
+}
+
+void MicrosoftMangleContext::mangleDynamicAtExitDestructor(const VarDecl *D,
+ raw_ostream &Out) {
+ // <destructor-name> ::= ?__F <name> YAXXZ
+ mangleInitFiniStub(D, Out, 'F');
+}
+
MangleContext *clang::createMicrosoftMangleContext(ASTContext &Context,
DiagnosticsEngine &Diags) {
return new MicrosoftMangleContext(Context, Diags);
OpenPOWER on IntegriCloud