r205554 - -fms-extensions: Error out on #pragma init_seg
Reid Kleckner
reid at kleckner.net
Thu Apr 3 12:04:24 PDT 2014
Author: rnk
Date: Thu Apr 3 14:04:24 2014
New Revision: 205554
URL: http://llvm.org/viewvc/llvm-project?rev=205554&view=rev
Log:
-fms-extensions: Error out on #pragma init_seg
By ignoring this pragma with a warning, we're essentially miscompiling
the user's program. WebKit / Blink use this pragma to disable dynamic
initialization and finalization of some static data, and running the
dtors crashes the program.
Error out for now, so that /fallback compiles the TU correctly with
MSVC. This pragma should be implemented some time this month, and we
can remove this hack.
Added:
cfe/trunk/test/CodeGenCXX/pragma-init_seg.cpp
Modified:
cfe/trunk/include/clang/Parse/Parser.h
cfe/trunk/lib/Parse/ParsePragma.cpp
Modified: cfe/trunk/include/clang/Parse/Parser.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=205554&r1=205553&r2=205554&view=diff
==============================================================================
--- cfe/trunk/include/clang/Parse/Parser.h (original)
+++ cfe/trunk/include/clang/Parse/Parser.h Thu Apr 3 14:04:24 2014
@@ -154,6 +154,7 @@ class Parser : public CodeCompletionHand
std::unique_ptr<PragmaHandler> MSDetectMismatchHandler;
std::unique_ptr<PragmaHandler> MSPointersToMembers;
std::unique_ptr<PragmaHandler> MSVtorDisp;
+ std::unique_ptr<PragmaHandler> MSInitSeg;
std::unique_ptr<CommentHandler> CommentSemaHandler;
Modified: cfe/trunk/lib/Parse/ParsePragma.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParsePragma.cpp?rev=205554&r1=205553&r2=205554&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParsePragma.cpp (original)
+++ cfe/trunk/lib/Parse/ParsePragma.cpp Thu Apr 3 14:04:24 2014
@@ -124,6 +124,12 @@ struct PragmaMSVtorDisp : public PragmaH
Token &FirstToken) override;
};
+struct PragmaMSInitSeg : public PragmaHandler {
+ explicit PragmaMSInitSeg() : PragmaHandler("init_seg") {}
+ void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
+ Token &FirstToken) override;
+};
+
} // end namespace
void Parser::initializePragmaHandlers() {
@@ -175,6 +181,8 @@ void Parser::initializePragmaHandlers()
PP.AddPragmaHandler(MSPointersToMembers.get());
MSVtorDisp.reset(new PragmaMSVtorDisp());
PP.AddPragmaHandler(MSVtorDisp.get());
+ MSInitSeg.reset(new PragmaMSInitSeg());
+ PP.AddPragmaHandler(MSInitSeg.get());
}
}
@@ -214,6 +222,8 @@ void Parser::resetPragmaHandlers() {
MSPointersToMembers.reset();
PP.RemovePragmaHandler(MSVtorDisp.get());
MSVtorDisp.reset();
+ PP.RemovePragmaHandler(MSInitSeg.get());
+ MSInitSeg.reset();
}
PP.RemovePragmaHandler("STDC", FPContractHandler.get());
@@ -1204,6 +1214,14 @@ void PragmaMSVtorDisp::HandlePragma(Prep
PP.EnterToken(AnnotTok);
}
+void PragmaMSInitSeg::HandlePragma(Preprocessor &PP,
+ PragmaIntroducerKind Introducer,
+ Token &Tok) {
+ unsigned ID = PP.getDiagnostics().getCustomDiagID(
+ DiagnosticsEngine::Error, "'#pragma init_seg' not implemented");
+ PP.Diag(Tok.getLocation(), ID);
+}
+
/// \brief Handle the Microsoft \#pragma detect_mismatch extension.
///
/// The syntax is:
Added: cfe/trunk/test/CodeGenCXX/pragma-init_seg.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/pragma-init_seg.cpp?rev=205554&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/pragma-init_seg.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/pragma-init_seg.cpp Thu Apr 3 14:04:24 2014
@@ -0,0 +1,16 @@
+// RUN: not %clang_cc1 %s -triple=i686-pc-win32 -fms-extensions -emit-llvm-only 2>&1 | FileCheck %s
+
+// Reduced from WebKit.
+
+// FIXME: Implement this pragma and test the codegen. We probably want to
+// completely skip @llvm.global_ctors and just create global function pointers
+// to the initializer with the right section.
+
+// CHECK: '#pragma init_seg' not implemented
+#pragma init_seg(".unwantedstaticinits")
+struct A {
+ A();
+ ~A();
+ int a;
+};
+A a;
More information about the cfe-commits
mailing list