Commit 1cbe0038 authored by Adrian Prantl's avatar Adrian Prantl
Browse files

[-gmodules] Let LLDB log a warning if the Clang module hash mismatches.

This feature is mostly there to aid debugging of Clang module issues,
since the only useful actual the end-user can to is to recompile their
program.

Differential Revision: https://reviews.llvm.org/D70272
parent 7d71dd92
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -166,10 +166,10 @@ public:

  bool GetVerbose() const;

private:
  void VAPrintf(const char *format, va_list args);
  void VAError(const char *format, va_list args);

private:
  Channel &m_channel;

  // The mutex makes sure enable/disable operations are thread-safe. The
+16 −0
Original line number Diff line number Diff line
OBJC_SOURCES := main.m
CFLAGS_EXTRAS = -I$(BUILDDIR)
USE_PRIVATE_MODULE_CACHE = YES

.PHONY: update-module

all: $(EXE)
	$(MAKE) -f $(SRCDIR)/Makefile update-module

include Makefile.rules

update-module:
	echo "forcing an update of f.pcm"
	echo "typedef int something_other;" > $(BUILDDIR)/f.h
	$(CC) $(CFLAGS) $(MANDATORY_MODULE_BUILD_CFLAGS) \
		-c $(SRCDIR)/other.m -o $(BUILDDIR)/other.o
+49 −0
Original line number Diff line number Diff line
from __future__ import print_function

import unittest2
import os
import shutil

import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class TestClangModuleHashMismatch(TestBase):
    mydir = TestBase.compute_mydir(__file__)

    def setUp(self):
        TestBase.setUp(self)

    @skipUnlessDarwin
    @skipIf(debug_info=no_match(["gmodules"]))
    def test_expr(self):
        with open(self.getBuildArtifact("module.modulemap"), "w") as f:
            f.write("""
                    module Foo { header "f.h" }
                    """)
        with open(self.getBuildArtifact("f.h"), "w") as f:
            f.write("""
                    typedef int my_int;
                    void f() {}
                    """)

        mod_cache = self.getBuildArtifact("private-module-cache")
        if os.path.isdir(mod_cache):
          shutil.rmtree(mod_cache)
        self.build()
        self.assertTrue(os.path.isdir(mod_cache), "module cache exists")

        logfile = self.getBuildArtifact("host.log")
        self.runCmd("log enable -v -f %s lldb host" % logfile)
        target, _, _, _ = lldbutil.run_to_source_breakpoint(
            self, "break here", lldb.SBFileSpec("main.m"))
        target.GetModuleAtIndex(0).FindTypes('my_int') 

        found = False
        with open(logfile, 'r') as f:
            for line in f:
                if "hash mismatch" in line and "Foo" in line:
                    found = True
        self.assertTrue(found)
+6 −0
Original line number Diff line number Diff line
#include "f.h"
int main(int argc, char **argv) {
  my_int i = argc;
  f(); // break here
  return 0;
}
+4 −0
Original line number Diff line number Diff line
#include "f.h"
something_other f() {
  return 0;
}
Loading