]> granicus.if.org Git - clang/commitdiff
Pass LangOptions to RewriteTest().
authorSteve Naroff <snaroff@apple.com>
Mon, 10 Mar 2008 20:43:59 +0000 (20:43 +0000)
committerSteve Naroff <snaroff@apple.com>
Mon, 10 Mar 2008 20:43:59 +0000 (20:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48172 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/ASTConsumers.h
Driver/RewriteTest.cpp
Driver/clang.cpp

index 63f769f06a39573ab65091a425e2f6b03f8f76be..815f3cc43865cfa7b7a35edb2cf1f6e82e23aee6 100644 (file)
@@ -50,7 +50,8 @@ ASTConsumer* CreateCFRefChecker(Diagnostic &Diags,
                                 const std::string& FunctionName); 
 
 ASTConsumer *CreateCodeRewriterTest(const std::string& InFile,
-                                    Diagnostic &Diags);
+                                    Diagnostic &Diags,
+                                    const LangOptions &LOpts);
 
 ASTConsumer *CreateSerializationTest(Diagnostic &Diags,
                                      FileManager& FMgr, 
index 097aa1b3a598c99ebed04bd5b46cdee6ff0fc776..2b48a635873001b853f5e315e2bc742fec1e711d 100644 (file)
@@ -35,6 +35,7 @@ namespace {
   class RewriteTest : public ASTConsumer {
     Rewriter Rewrite;
     Diagnostic &Diags;
+    const LangOptions &LangOpts;
     unsigned RewriteFailedDiag;
     
     ASTContext *Context;
@@ -84,7 +85,8 @@ namespace {
     // Top Level Driver code.
     virtual void HandleTopLevelDecl(Decl *D);
     void HandleDeclInMainFile(Decl *D);
-    RewriteTest(bool isHeader, Diagnostic &D) : Diags(D) {
+    RewriteTest(bool isHeader, Diagnostic &D, const LangOptions &LOpts) : 
+      Diags(D), LangOpts(LOpts) {
       IsHeader = isHeader;
       RewriteFailedDiag = Diags.getCustomDiagID(Diagnostic::Warning, 
                "rewriting sub-expression within a macro (may not be correct)");
@@ -224,8 +226,9 @@ static bool IsHeaderFile(const std::string &Filename) {
 }    
 
 ASTConsumer *clang::CreateCodeRewriterTest(const std::string& InFile,
-                                           Diagnostic &Diags) {
-  return new RewriteTest(IsHeaderFile(InFile), Diags);
+                                           Diagnostic &Diags, 
+                                           const LangOptions &LOpts) {
+  return new RewriteTest(IsHeaderFile(InFile), Diags, LOpts);
 }
 
 void RewriteTest::Initialize(ASTContext &context) {
@@ -298,6 +301,11 @@ void RewriteTest::Initialize(ASTContext &context) {
   "unsigned long extra[5];\n};\n"
   "#define __FASTENUMERATIONSTATE\n"
   "#endif\n";
+  if (LangOpts.Microsoft) {
+    std::string S = s;
+    S += "#define __attribute__(X)\n";
+    s = S.c_str();
+  }
   if (IsHeader) {
     // insert the whole string when rewriting a header file
     InsertText(SourceLocation::getFileLoc(MainFileID, 0), s, strlen(s));
@@ -2852,6 +2860,13 @@ void RewriteTest::RewriteImplementations(std::string &Result) {
   Result += "\t" + utostr(OBJC_ABI_VERSION) + 
   ", sizeof(struct _objc_module), \"\", &_OBJC_SYMBOLS\n";
   Result += "};\n\n";
-  
+
+  if (LangOpts.Microsoft) {
+    Result += "#pragma section(\".objc_module_info$B\",long,read,write)\n";
+    Result += "#pragma data_seq(push, \".objc_module_info$B\")\n";
+    Result += "static struct _objc_module *_POINTER_OBJC_MODULES = ";
+    Result += "&_OBJC_MODULES;\n";
+    Result += "#pragma data_seg(pop)\n\n";
+  }
 }
 
index 896479aa5db25dde0ba35fd821cd2fbcf7b84116..5f3f168ff798a81433322e840c1cdd647ba0a1a8 100644 (file)
@@ -1032,7 +1032,7 @@ static ASTConsumer* CreateASTConsumer(const std::string& InFile,
       return CreateASTSerializer(InFile, OutputFile, Diag, LangOpts);
       
     case RewriteTest:
-      return CreateCodeRewriterTest(InFile, Diag);
+      return CreateCodeRewriterTest(InFile, Diag, LangOpts);
   }
 }