summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/tools/clang
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/tools/clang')
-rw-r--r--third_party/libwebrtc/tools/clang/OWNERS2
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/ChromeClassTester.cpp294
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/ChromeClassTester.h84
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/FindBadConstructs.cpp435
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/Makefile19
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/OWNERS1
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/README.chromium4
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.cpp72
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.h121
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.txt23
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.cpp5
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.h12
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.txt5
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.cpp25
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.h21
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.txt8
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.cpp23
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.h19
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.txt6
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.cpp5
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.h22
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.txt8
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.cpp38
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.h54
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.txt20
-rwxr-xr-xthird_party/libwebrtc/tools/clang/plugins/tests/test.sh72
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.cpp36
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.h39
-rw-r--r--third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.txt8
-rwxr-xr-xthird_party/libwebrtc/tools/clang/scripts/package.sh87
-rwxr-xr-xthird_party/libwebrtc/tools/clang/scripts/plugin_flags.sh24
-rwxr-xr-xthird_party/libwebrtc/tools/clang/scripts/update.py34
-rwxr-xr-xthird_party/libwebrtc/tools/clang/scripts/update.sh286
33 files changed, 0 insertions, 1912 deletions
diff --git a/third_party/libwebrtc/tools/clang/OWNERS b/third_party/libwebrtc/tools/clang/OWNERS
deleted file mode 100644
index d86ef9424a..0000000000
--- a/third_party/libwebrtc/tools/clang/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-hans@chromium.org
-thakis@chromium.org
diff --git a/third_party/libwebrtc/tools/clang/plugins/ChromeClassTester.cpp b/third_party/libwebrtc/tools/clang/plugins/ChromeClassTester.cpp
deleted file mode 100644
index 055866c5c5..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/ChromeClassTester.cpp
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// A general interface for filtering and only acting on classes in Chromium C++
-// code.
-
-#include "ChromeClassTester.h"
-
-#include <sys/param.h>
-
-#include "clang/AST/AST.h"
-#include "clang/Basic/FileManager.h"
-#include "clang/Basic/SourceManager.h"
-
-using namespace clang;
-
-namespace {
-
-bool starts_with(const std::string& one, const std::string& two) {
- return one.compare(0, two.size(), two) == 0;
-}
-
-std::string lstrip(const std::string& one, const std::string& two) {
- if (starts_with(one, two))
- return one.substr(two.size());
- return one;
-}
-
-bool ends_with(const std::string& one, const std::string& two) {
- if (two.size() > one.size())
- return false;
-
- return one.compare(one.size() - two.size(), two.size(), two) == 0;
-}
-
-} // namespace
-
-ChromeClassTester::ChromeClassTester(CompilerInstance& instance)
- : instance_(instance),
- diagnostic_(instance.getDiagnostics()) {
- BuildBannedLists();
-}
-
-ChromeClassTester::~ChromeClassTester() {}
-
-void ChromeClassTester::HandleTagDeclDefinition(TagDecl* tag) {
- pending_class_decls_.push_back(tag);
-}
-
-bool ChromeClassTester::HandleTopLevelDecl(DeclGroupRef group_ref) {
- for (size_t i = 0; i < pending_class_decls_.size(); ++i)
- CheckTag(pending_class_decls_[i]);
- pending_class_decls_.clear();
-
- return true; // true means continue parsing.
-}
-
-void ChromeClassTester::CheckTag(TagDecl* tag) {
- // We handle class types here where we have semantic information. We can only
- // check structs/classes/enums here, but we get a bunch of nice semantic
- // information instead of just parsing information.
-
- if (CXXRecordDecl* record = dyn_cast<CXXRecordDecl>(tag)) {
- // If this is a POD or a class template or a type dependent on a
- // templated class, assume there's no ctor/dtor/virtual method
- // optimization that we can do.
- if (record->isPOD() ||
- record->getDescribedClassTemplate() ||
- record->getTemplateSpecializationKind() ||
- record->isDependentType())
- return;
-
- if (InBannedNamespace(record))
- return;
-
- SourceLocation record_location = record->getInnerLocStart();
- if (InBannedDirectory(record_location))
- return;
-
- // We sadly need to maintain a blacklist of types that violate these
- // rules, but do so for good reason or due to limitations of this
- // checker (i.e., we don't handle extern templates very well).
- std::string base_name = record->getNameAsString();
- if (IsIgnoredType(base_name))
- return;
-
- // We ignore all classes that end with "Matcher" because they're probably
- // GMock artifacts.
- if (ends_with(base_name, "Matcher"))
- return;
-
- CheckChromeClass(record_location, record);
- }
-}
-
-void ChromeClassTester::emitWarning(SourceLocation loc,
- const char* raw_error) {
- FullSourceLoc full(loc, instance().getSourceManager());
- std::string err;
- err = "[chromium-style] ";
- err += raw_error;
- DiagnosticsEngine::Level level =
- diagnostic().getWarningsAsErrors() ?
- DiagnosticsEngine::Error :
- DiagnosticsEngine::Warning;
- unsigned id = diagnostic().getCustomDiagID(level, err);
- DiagnosticBuilder builder = diagnostic().Report(full, id);
-}
-
-bool ChromeClassTester::InBannedNamespace(const Decl* record) {
- std::string n = GetNamespace(record);
- if (!n.empty()) {
- return std::find(banned_namespaces_.begin(), banned_namespaces_.end(), n)
- != banned_namespaces_.end();
- }
-
- return false;
-}
-
-std::string ChromeClassTester::GetNamespace(const Decl* record) {
- return GetNamespaceImpl(record->getDeclContext(), "");
-}
-
-bool ChromeClassTester::InImplementationFile(SourceLocation record_location) {
- std::string filename;
- if (!GetFilename(record_location, &filename))
- return false;
-
- if (ends_with(filename, ".cc") || ends_with(filename, ".cpp") ||
- ends_with(filename, ".mm")) {
- return true;
- }
-
- return false;
-}
-
-void ChromeClassTester::BuildBannedLists() {
- banned_namespaces_.push_back("std");
- banned_namespaces_.push_back("__gnu_cxx");
- banned_namespaces_.push_back("WebKit");
-
- banned_directories_.push_back("third_party/");
- banned_directories_.push_back("native_client/");
- banned_directories_.push_back("breakpad/");
- banned_directories_.push_back("courgette/");
- banned_directories_.push_back("pdf/");
- banned_directories_.push_back("ppapi/");
- banned_directories_.push_back("usr/");
- banned_directories_.push_back("testing/");
- banned_directories_.push_back("googleurl/");
- banned_directories_.push_back("v8/");
- banned_directories_.push_back("dart/");
- banned_directories_.push_back("sdch/");
- banned_directories_.push_back("icu4c/");
- banned_directories_.push_back("frameworks/");
-
- // Don't check autogenerated headers.
- // Make puts them below $(builddir_name)/.../gen and geni.
- // Ninja puts them below OUTPUT_DIR/.../gen
- // Xcode has a fixed output directory for everything.
- banned_directories_.push_back("gen/");
- banned_directories_.push_back("geni/");
- banned_directories_.push_back("xcodebuild/");
-
- // You are standing in a mazy of twisty dependencies, all resolved by
- // putting everything in the header.
- banned_directories_.push_back("automation/");
-
- // Don't check system headers.
- banned_directories_.push_back("/Developer/");
-
- // Used in really low level threading code that probably shouldn't be out of
- // lined.
- ignored_record_names_.insert("ThreadLocalBoolean");
-
- // A complicated pickle derived struct that is all packed integers.
- ignored_record_names_.insert("Header");
-
- // Part of the GPU system that uses multiple included header
- // weirdness. Never getting this right.
- ignored_record_names_.insert("Validators");
-
- // Has a UNIT_TEST only constructor. Isn't *terribly* complex...
- ignored_record_names_.insert("AutocompleteController");
- ignored_record_names_.insert("HistoryURLProvider");
-
- // Because of chrome frame
- ignored_record_names_.insert("ReliabilityTestSuite");
-
- // Used over in the net unittests. A large enough bundle of integers with 1
- // non-pod class member. Probably harmless.
- ignored_record_names_.insert("MockTransaction");
-
- // Used heavily in ui_unittests and once in views_unittests. Fixing this
- // isn't worth the overhead of an additional library.
- ignored_record_names_.insert("TestAnimationDelegate");
-
- // Part of our public interface that nacl and friends use. (Arguably, this
- // should mean that this is a higher priority but fixing this looks hard.)
- ignored_record_names_.insert("PluginVersionInfo");
-}
-
-std::string ChromeClassTester::GetNamespaceImpl(const DeclContext* context,
- const std::string& candidate) {
- switch (context->getDeclKind()) {
- case Decl::TranslationUnit: {
- return candidate;
- }
- case Decl::Namespace: {
- const NamespaceDecl* decl = dyn_cast<NamespaceDecl>(context);
- std::string name_str;
- llvm::raw_string_ostream OS(name_str);
- if (decl->isAnonymousNamespace())
- OS << "<anonymous namespace>";
- else
- OS << *decl;
- return GetNamespaceImpl(context->getParent(),
- OS.str());
- }
- default: {
- return GetNamespaceImpl(context->getParent(), candidate);
- }
- }
-}
-
-bool ChromeClassTester::InBannedDirectory(SourceLocation loc) {
- std::string filename;
- if (!GetFilename(loc, &filename)) {
- // If the filename cannot be determined, simply treat this as a banned
- // location, instead of going through the full lookup process.
- return true;
- }
-
- // We need to special case scratch space; which is where clang does its
- // macro expansion. We explicitly want to allow people to do otherwise bad
- // things through macros that were defined due to third party libraries.
- if (filename == "<scratch space>")
- return true;
-
- // Don't complain about autogenerated protobuf files.
- if (ends_with(filename, ".pb.h")) {
- return true;
- }
-
- // We need to munge the paths so that they are relative to the repository
- // srcroot. We first resolve the symlinktastic relative path and then
- // remove our known srcroot from it if needed.
- char resolvedPath[MAXPATHLEN];
- if (realpath(filename.c_str(), resolvedPath)) {
- filename = resolvedPath;
- }
-
- // On linux, chrome is often checked out to /usr/local/google. Due to the
- // "usr" rule in banned_directories_, all diagnostics would be suppressed
- // in that case. As a workaround, strip that prefix.
- filename = lstrip(filename, "/usr/local/google");
-
- for (std::vector<std::string>::const_iterator it =
- banned_directories_.begin();
- it != banned_directories_.end(); ++it) {
- // If we can find any of the banned path components in this path, then
- // this file is rejected.
- size_t index = filename.find(*it);
- if (index != std::string::npos) {
- bool matches_full_dir_name = index == 0 || filename[index - 1] == '/';
- if ((*it)[0] == '/')
- matches_full_dir_name = true;
- if (matches_full_dir_name)
- return true;
- }
- }
-
- return false;
-}
-
-bool ChromeClassTester::IsIgnoredType(const std::string& base_name) {
- return ignored_record_names_.find(base_name) != ignored_record_names_.end();
-}
-
-bool ChromeClassTester::GetFilename(SourceLocation loc,
- std::string* filename) {
- const SourceManager& source_manager = instance_.getSourceManager();
- SourceLocation spelling_location = source_manager.getSpellingLoc(loc);
- PresumedLoc ploc = source_manager.getPresumedLoc(spelling_location);
- if (ploc.isInvalid()) {
- // If we're in an invalid location, we're looking at things that aren't
- // actually stated in the source.
- return false;
- }
-
- *filename = ploc.getFilename();
- return true;
-}
diff --git a/third_party/libwebrtc/tools/clang/plugins/ChromeClassTester.h b/third_party/libwebrtc/tools/clang/plugins/ChromeClassTester.h
deleted file mode 100644
index 588ae9cae5..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/ChromeClassTester.h
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef TOOLS_CLANG_PLUGINS_CHROMECLASSTESTER_H_
-#define TOOLS_CLANG_PLUGINS_CHROMECLASSTESTER_H_
-
-#include <set>
-#include <vector>
-
-#include "clang/AST/ASTConsumer.h"
-#include "clang/AST/TypeLoc.h"
-#include "clang/Frontend/CompilerInstance.h"
-
-// A class on top of ASTConsumer that forwards classes defined in Chromium
-// headers to subclasses which implement CheckChromeClass().
-class ChromeClassTester : public clang::ASTConsumer {
- public:
- explicit ChromeClassTester(clang::CompilerInstance& instance);
- virtual ~ChromeClassTester();
-
- // clang::ASTConsumer:
- virtual void HandleTagDeclDefinition(clang::TagDecl* tag);
- virtual bool HandleTopLevelDecl(clang::DeclGroupRef group_ref);
-
- protected:
- clang::CompilerInstance& instance() { return instance_; }
- clang::DiagnosticsEngine& diagnostic() { return diagnostic_; }
-
- // Emits a simple warning; this shouldn't be used if you require printf-style
- // printing.
- void emitWarning(clang::SourceLocation loc, const char* error);
-
- // Utility method for subclasses to check if this class is in a banned
- // namespace.
- bool InBannedNamespace(const clang::Decl* record);
-
- // Utility method for subclasses to determine the namespace of the
- // specified record, if any. Unnamed namespaces will be identified as
- // "<anonymous namespace>".
- std::string GetNamespace(const clang::Decl* record);
-
- // Utility method for subclasses to check if this class is within an
- // implementation (.cc, .cpp, .mm) file.
- bool InImplementationFile(clang::SourceLocation location);
-
- private:
- void BuildBannedLists();
-
- void CheckTag(clang::TagDecl*);
-
- // Filtered versions of tags that are only called with things defined in
- // chrome header files.
- virtual void CheckChromeClass(clang::SourceLocation record_location,
- clang::CXXRecordDecl* record) = 0;
-
- // Utility methods used for filtering out non-chrome classes (and ones we
- // deliberately ignore) in HandleTagDeclDefinition().
- std::string GetNamespaceImpl(const clang::DeclContext* context,
- const std::string& candidate);
- bool InBannedDirectory(clang::SourceLocation loc);
- bool IsIgnoredType(const std::string& base_name);
-
- // Attempts to determine the filename for the given SourceLocation.
- // Returns false if the filename could not be determined.
- bool GetFilename(clang::SourceLocation loc, std::string* filename);
-
- clang::CompilerInstance& instance_;
- clang::DiagnosticsEngine& diagnostic_;
-
- // List of banned namespaces.
- std::vector<std::string> banned_namespaces_;
-
- // List of banned directories.
- std::vector<std::string> banned_directories_;
-
- // List of types that we don't check.
- std::set<std::string> ignored_record_names_;
-
- // List of decls to check once the current top-level decl is parsed.
- std::vector<clang::TagDecl*> pending_class_decls_;
-};
-
-#endif // TOOLS_CLANG_PLUGINS_CHROMECLASSTESTER_H_
diff --git a/third_party/libwebrtc/tools/clang/plugins/FindBadConstructs.cpp b/third_party/libwebrtc/tools/clang/plugins/FindBadConstructs.cpp
deleted file mode 100644
index b79a64dbd1..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/FindBadConstructs.cpp
+++ /dev/null
@@ -1,435 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file defines a bunch of recurring problems in the Chromium C++ code.
-//
-// Checks that are implemented:
-// - Constructors/Destructors should not be inlined if they are of a complex
-// class type.
-// - Missing "virtual" keywords on methods that should be virtual.
-// - Non-annotated overriding virtual methods.
-// - Virtual methods with nonempty implementations in their headers.
-// - Classes that derive from base::RefCounted / base::RefCountedThreadSafe
-// should have protected or private destructors.
-
-#include "clang/Frontend/FrontendPluginRegistry.h"
-#include "clang/AST/ASTConsumer.h"
-#include "clang/AST/AST.h"
-#include "clang/AST/CXXInheritance.h"
-#include "clang/AST/TypeLoc.h"
-#include "clang/Basic/SourceManager.h"
-#include "clang/Frontend/CompilerInstance.h"
-#include "llvm/Support/raw_ostream.h"
-
-#include "ChromeClassTester.h"
-
-using namespace clang;
-
-namespace {
-
-bool TypeHasNonTrivialDtor(const Type* type) {
- if (const CXXRecordDecl* cxx_r = type->getCXXRecordDeclForPointerType())
- return cxx_r->hasTrivialDestructor();
-
- return false;
-}
-
-// Returns the underlying Type for |type| by expanding typedefs and removing
-// any namespace qualifiers.
-const Type* UnwrapType(const Type* type) {
- if (const ElaboratedType* elaborated = dyn_cast<ElaboratedType>(type))
- return UnwrapType(elaborated->getNamedType().getTypePtr());
- if (const TypedefType* typedefed = dyn_cast<TypedefType>(type))
- return UnwrapType(typedefed->desugar().getTypePtr());
- return type;
-}
-
-// Searches for constructs that we know we don't want in the Chromium code base.
-class FindBadConstructsConsumer : public ChromeClassTester {
- public:
- FindBadConstructsConsumer(CompilerInstance& instance,
- bool check_refcounted_dtors,
- bool check_virtuals_in_implementations)
- : ChromeClassTester(instance),
- check_refcounted_dtors_(check_refcounted_dtors),
- check_virtuals_in_implementations_(check_virtuals_in_implementations) {
- }
-
- virtual void CheckChromeClass(SourceLocation record_location,
- CXXRecordDecl* record) {
- bool implementation_file = InImplementationFile(record_location);
-
- if (!implementation_file) {
- // Only check for "heavy" constructors/destructors in header files;
- // within implementation files, there is no performance cost.
- CheckCtorDtorWeight(record_location, record);
- }
-
- if (!implementation_file || check_virtuals_in_implementations_) {
- bool warn_on_inline_bodies = !implementation_file;
-
- // Check that all virtual methods are marked accordingly with both
- // virtual and OVERRIDE.
- CheckVirtualMethods(record_location, record, warn_on_inline_bodies);
- }
-
- if (check_refcounted_dtors_)
- CheckRefCountedDtors(record_location, record);
- }
-
- private:
- bool check_refcounted_dtors_;
- bool check_virtuals_in_implementations_;
-
- // Returns true if |base| specifies one of the Chromium reference counted
- // classes (base::RefCounted / base::RefCountedThreadSafe). |user_data| is
- // ignored.
- static bool IsRefCountedCallback(const CXXBaseSpecifier* base,
- CXXBasePath& path,
- void* user_data) {
- FindBadConstructsConsumer* self =
- static_cast<FindBadConstructsConsumer*>(user_data);
-
- const TemplateSpecializationType* base_type =
- dyn_cast<TemplateSpecializationType>(
- UnwrapType(base->getType().getTypePtr()));
- if (!base_type) {
- // Base-most definition is not a template, so this cannot derive from
- // base::RefCounted. However, it may still be possible to use with a
- // scoped_refptr<> and support ref-counting, so this is not a perfect
- // guarantee of safety.
- return false;
- }
-
- TemplateName name = base_type->getTemplateName();
- if (TemplateDecl* decl = name.getAsTemplateDecl()) {
- std::string base_name = decl->getNameAsString();
-
- // Check for both base::RefCounted and base::RefCountedThreadSafe.
- if (base_name.compare(0, 10, "RefCounted") == 0 &&
- self->GetNamespace(decl) == "base") {
- return true;
- }
- }
- return false;
- }
-
- // Prints errors if the destructor of a RefCounted class is public.
- void CheckRefCountedDtors(SourceLocation record_location,
- CXXRecordDecl* record) {
- // Skip anonymous structs.
- if (record->getIdentifier() == NULL)
- return;
-
- CXXBasePaths paths;
- if (!record->lookupInBases(
- &FindBadConstructsConsumer::IsRefCountedCallback, this, paths)) {
- return; // Class does not derive from a ref-counted base class.
- }
-
- if (!record->hasUserDeclaredDestructor()) {
- emitWarning(
- record_location,
- "Classes that are ref-counted should have explicit "
- "destructors that are protected or private.");
- } else if (CXXDestructorDecl* dtor = record->getDestructor()) {
- if (dtor->getAccess() == AS_public) {
- emitWarning(
- dtor->getInnerLocStart(),
- "Classes that are ref-counted should not have "
- "public destructors.");
- }
- }
- }
-
- // Prints errors if the constructor/destructor weight is too heavy.
- void CheckCtorDtorWeight(SourceLocation record_location,
- CXXRecordDecl* record) {
- // We don't handle anonymous structs. If this record doesn't have a
- // name, it's of the form:
- //
- // struct {
- // ...
- // } name_;
- if (record->getIdentifier() == NULL)
- return;
-
- // Count the number of templated base classes as a feature of whether the
- // destructor can be inlined.
- int templated_base_classes = 0;
- for (CXXRecordDecl::base_class_const_iterator it = record->bases_begin();
- it != record->bases_end(); ++it) {
- if (it->getTypeSourceInfo()->getTypeLoc().getTypeLocClass() ==
- TypeLoc::TemplateSpecialization) {
- ++templated_base_classes;
- }
- }
-
- // Count the number of trivial and non-trivial member variables.
- int trivial_member = 0;
- int non_trivial_member = 0;
- int templated_non_trivial_member = 0;
- for (RecordDecl::field_iterator it = record->field_begin();
- it != record->field_end(); ++it) {
- CountType(it->getType().getTypePtr(),
- &trivial_member,
- &non_trivial_member,
- &templated_non_trivial_member);
- }
-
- // Check to see if we need to ban inlined/synthesized constructors. Note
- // that the cutoffs here are kind of arbitrary. Scores over 10 break.
- int dtor_score = 0;
- // Deriving from a templated base class shouldn't be enough to trigger
- // the ctor warning, but if you do *anything* else, it should.
- //
- // TODO(erg): This is motivated by templated base classes that don't have
- // any data members. Somehow detect when templated base classes have data
- // members and treat them differently.
- dtor_score += templated_base_classes * 9;
- // Instantiating a template is an insta-hit.
- dtor_score += templated_non_trivial_member * 10;
- // The fourth normal class member should trigger the warning.
- dtor_score += non_trivial_member * 3;
-
- int ctor_score = dtor_score;
- // You should be able to have 9 ints before we warn you.
- ctor_score += trivial_member;
-
- if (ctor_score >= 10) {
- if (!record->hasUserDeclaredConstructor()) {
- emitWarning(record_location,
- "Complex class/struct needs an explicit out-of-line "
- "constructor.");
- } else {
- // Iterate across all the constructors in this file and yell if we
- // find one that tries to be inline.
- for (CXXRecordDecl::ctor_iterator it = record->ctor_begin();
- it != record->ctor_end(); ++it) {
- if (it->hasInlineBody()) {
- if (it->isCopyConstructor() &&
- !record->hasUserDeclaredCopyConstructor()) {
- emitWarning(record_location,
- "Complex class/struct needs an explicit out-of-line "
- "copy constructor.");
- } else {
- emitWarning(it->getInnerLocStart(),
- "Complex constructor has an inlined body.");
- }
- }
- }
- }
- }
-
- // The destructor side is equivalent except that we don't check for
- // trivial members; 20 ints don't need a destructor.
- if (dtor_score >= 10 && !record->hasTrivialDestructor()) {
- if (!record->hasUserDeclaredDestructor()) {
- emitWarning(
- record_location,
- "Complex class/struct needs an explicit out-of-line "
- "destructor.");
- } else if (CXXDestructorDecl* dtor = record->getDestructor()) {
- if (dtor->hasInlineBody()) {
- emitWarning(dtor->getInnerLocStart(),
- "Complex destructor has an inline body.");
- }
- }
- }
- }
-
- void CheckVirtualMethod(const CXXMethodDecl* method,
- bool warn_on_inline_bodies) {
- if (!method->isVirtual())
- return;
-
- if (!method->isVirtualAsWritten()) {
- SourceLocation loc = method->getTypeSpecStartLoc();
- if (isa<CXXDestructorDecl>(method))
- loc = method->getInnerLocStart();
- emitWarning(loc, "Overriding method must have \"virtual\" keyword.");
- }
-
- // Virtual methods should not have inline definitions beyond "{}". This
- // only matters for header files.
- if (warn_on_inline_bodies && method->hasBody() &&
- method->hasInlineBody()) {
- if (CompoundStmt* cs = dyn_cast<CompoundStmt>(method->getBody())) {
- if (cs->size()) {
- emitWarning(
- cs->getLBracLoc(),
- "virtual methods with non-empty bodies shouldn't be "
- "declared inline.");
- }
- }
- }
- }
-
- bool InTestingNamespace(const Decl* record) {
- return GetNamespace(record).find("testing") != std::string::npos;
- }
-
- bool IsMethodInBannedNamespace(const CXXMethodDecl* method) {
- if (InBannedNamespace(method))
- return true;
- for (CXXMethodDecl::method_iterator i = method->begin_overridden_methods();
- i != method->end_overridden_methods();
- ++i) {
- const CXXMethodDecl* overridden = *i;
- if (IsMethodInBannedNamespace(overridden))
- return true;
- }
-
- return false;
- }
-
- void CheckOverriddenMethod(const CXXMethodDecl* method) {
- if (!method->size_overridden_methods() || method->getAttr<OverrideAttr>())
- return;
-
- if (isa<CXXDestructorDecl>(method) || method->isPure())
- return;
-
- if (IsMethodInBannedNamespace(method))
- return;
-
- SourceLocation loc = method->getTypeSpecStartLoc();
- emitWarning(loc, "Overriding method must be marked with OVERRIDE.");
- }
-
- // Makes sure there is a "virtual" keyword on virtual methods.
- //
- // Gmock objects trigger these for each MOCK_BLAH() macro used. So we have a
- // trick to get around that. If a class has member variables whose types are
- // in the "testing" namespace (which is how gmock works behind the scenes),
- // there's a really high chance we won't care about these errors
- void CheckVirtualMethods(SourceLocation record_location,
- CXXRecordDecl* record,
- bool warn_on_inline_bodies) {
- for (CXXRecordDecl::field_iterator it = record->field_begin();
- it != record->field_end(); ++it) {
- CXXRecordDecl* record_type =
- it->getTypeSourceInfo()->getTypeLoc().getTypePtr()->
- getAsCXXRecordDecl();
- if (record_type) {
- if (InTestingNamespace(record_type)) {
- return;
- }
- }
- }
-
- for (CXXRecordDecl::method_iterator it = record->method_begin();
- it != record->method_end(); ++it) {
- if (it->isCopyAssignmentOperator() || isa<CXXConstructorDecl>(*it)) {
- // Ignore constructors and assignment operators.
- } else if (isa<CXXDestructorDecl>(*it) &&
- !record->hasUserDeclaredDestructor()) {
- // Ignore non-user-declared destructors.
- } else {
- CheckVirtualMethod(*it, warn_on_inline_bodies);
- CheckOverriddenMethod(*it);
- }
- }
- }
-
- void CountType(const Type* type,
- int* trivial_member,
- int* non_trivial_member,
- int* templated_non_trivial_member) {
- switch (type->getTypeClass()) {
- case Type::Record: {
- // Simplifying; the whole class isn't trivial if the dtor is, but
- // we use this as a signal about complexity.
- if (TypeHasNonTrivialDtor(type))
- (*trivial_member)++;
- else
- (*non_trivial_member)++;
- break;
- }
- case Type::TemplateSpecialization: {
- TemplateName name =
- dyn_cast<TemplateSpecializationType>(type)->getTemplateName();
- bool whitelisted_template = false;
-
- // HACK: I'm at a loss about how to get the syntax checker to get
- // whether a template is exterened or not. For the first pass here,
- // just do retarded string comparisons.
- if (TemplateDecl* decl = name.getAsTemplateDecl()) {
- std::string base_name = decl->getNameAsString();
- if (base_name == "basic_string")
- whitelisted_template = true;
- }
-
- if (whitelisted_template)
- (*non_trivial_member)++;
- else
- (*templated_non_trivial_member)++;
- break;
- }
- case Type::Elaborated: {
- CountType(
- dyn_cast<ElaboratedType>(type)->getNamedType().getTypePtr(),
- trivial_member, non_trivial_member, templated_non_trivial_member);
- break;
- }
- case Type::Typedef: {
- while (const TypedefType* TT = dyn_cast<TypedefType>(type)) {
- type = TT->getDecl()->getUnderlyingType().getTypePtr();
- }
- CountType(type, trivial_member, non_trivial_member,
- templated_non_trivial_member);
- break;
- }
- default: {
- // Stupid assumption: anything we see that isn't the above is one of
- // the 20 integer types.
- (*trivial_member)++;
- break;
- }
- }
- }
-};
-
-class FindBadConstructsAction : public PluginASTAction {
- public:
- FindBadConstructsAction()
- : check_refcounted_dtors_(true),
- check_virtuals_in_implementations_(true) {
- }
-
- protected:
- // Overridden from PluginASTAction:
- virtual ASTConsumer* CreateASTConsumer(CompilerInstance& instance,
- llvm::StringRef ref) {
- return new FindBadConstructsConsumer(
- instance, check_refcounted_dtors_, check_virtuals_in_implementations_);
- }
-
- virtual bool ParseArgs(const CompilerInstance& instance,
- const std::vector<std::string>& args) {
- bool parsed = true;
-
- for (size_t i = 0; i < args.size() && parsed; ++i) {
- if (args[i] == "skip-refcounted-dtors") {
- check_refcounted_dtors_ = false;
- } else if (args[i] == "skip-virtuals-in-implementations") {
- check_virtuals_in_implementations_ = false;
- } else {
- parsed = false;
- llvm::errs() << "Unknown argument: " << args[i] << "\n";
- }
- }
-
- return parsed;
- }
-
- private:
- bool check_refcounted_dtors_;
- bool check_virtuals_in_implementations_;
-};
-
-} // namespace
-
-static FrontendPluginRegistry::Add<FindBadConstructsAction>
-X("find-bad-constructs", "Finds bad C++ constructs");
diff --git a/third_party/libwebrtc/tools/clang/plugins/Makefile b/third_party/libwebrtc/tools/clang/plugins/Makefile
deleted file mode 100644
index 0cfec71159..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-# This file requires the clang build system, at least for now. So to use this
-# Makefile, you should execute the following commands to copy this directory
-# into a clang checkout:
-#
-# cp -R <this directory> third_party/llvm/tools/clang/tools/chrome-plugin
-# cd third_party/llvm/tools/clang/tools/chrome-plugin
-# make
-
-CLANG_LEVEL := ../..
-LIBRARYNAME = FindBadConstructs
-
-LINK_LIBS_IN_SHARED = 0
-SHARED_LIBRARY = 1
-
-include $(CLANG_LEVEL)/Makefile
-
-ifeq ($(OS),Darwin)
- LDFLAGS=-Wl,-undefined,dynamic_lookup
-endif
diff --git a/third_party/libwebrtc/tools/clang/plugins/OWNERS b/third_party/libwebrtc/tools/clang/plugins/OWNERS
deleted file mode 100644
index 4733a4f06b..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-erg@chromium.org
diff --git a/third_party/libwebrtc/tools/clang/plugins/README.chromium b/third_party/libwebrtc/tools/clang/plugins/README.chromium
deleted file mode 100644
index a2ce0ff557..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/README.chromium
+++ /dev/null
@@ -1,4 +0,0 @@
-Documentation for this code is:
-
-- http://code.google.com/p/chromium/wiki/Clang
-- http://code.google.com/p/chromium/wiki/WritingClangPlugins
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.cpp b/third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.cpp
deleted file mode 100644
index 364a3e888c..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base_refcounted.h"
-
-#include <cstddef>
-
-namespace {
-
-// Unsafe; should error.
-class AnonymousDerivedProtectedToPublicInImpl
- : public ProtectedRefCountedDtorInHeader {
- public:
- AnonymousDerivedProtectedToPublicInImpl() {}
- ~AnonymousDerivedProtectedToPublicInImpl() {}
-};
-
-} // namespace
-
-// Unsafe; should error.
-class PublicRefCountedDtorInImpl
- : public base::RefCounted<PublicRefCountedDtorInImpl> {
- public:
- PublicRefCountedDtorInImpl() {}
- ~PublicRefCountedDtorInImpl() {}
-
- private:
- friend class base::RefCounted<PublicRefCountedDtorInImpl>;
-};
-
-class Foo {
- public:
- class BarInterface {
- protected:
- virtual ~BarInterface() {}
- };
-
- typedef base::RefCounted<BarInterface> RefCountedBar;
- typedef RefCountedBar AnotherTypedef;
-};
-
-class Baz {
- public:
- typedef typename Foo::AnotherTypedef MyLocalTypedef;
-};
-
-// Unsafe; should error.
-class UnsafeTypedefChainInImpl : public Baz::MyLocalTypedef {
- public:
- UnsafeTypedefChainInImpl() {}
- ~UnsafeTypedefChainInImpl() {}
-};
-
-int main() {
- PublicRefCountedDtorInHeader bad;
- PublicRefCountedDtorInImpl also_bad;
-
- ProtectedRefCountedDtorInHeader* protected_ok = NULL;
- PrivateRefCountedDtorInHeader* private_ok = NULL;
-
- DerivedProtectedToPublicInHeader still_bad;
- PublicRefCountedThreadSafeDtorInHeader another_bad_variation;
- AnonymousDerivedProtectedToPublicInImpl and_this_is_bad_too;
- ImplicitDerivedProtectedToPublicInHeader bad_yet_again;
- UnsafeTypedefChainInImpl and_again_this_is_bad;
-
- WebKitPublicDtorInHeader ignored;
- WebKitDerivedPublicDtorInHeader still_ignored;
-
- return 0;
-}
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.h b/third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.h
deleted file mode 100644
index 1e53215997..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_REFCOUNTED_H_
-#define BASE_REFCOUNTED_H_
-
-namespace base {
-
-template <typename T>
-class RefCounted {
- public:
- RefCounted() {}
- ~RefCounted() {}
-};
-
-template <typename T>
-class RefCountedThreadSafe {
- public:
- RefCountedThreadSafe() {}
- ~RefCountedThreadSafe() {}
-};
-
-} // namespace base
-
-// Ignore classes whose inheritance tree ends in WebKit's RefCounted base
-// class. Though prone to error, this pattern is very prevalent in WebKit
-// code, so do not issue any warnings.
-namespace WebKit {
-
-template <typename T>
-class RefCounted {
- public:
- RefCounted() {}
- ~RefCounted() {}
-};
-
-} // namespace WebKit
-
-// Unsafe; should error.
-class PublicRefCountedDtorInHeader
- : public base::RefCounted<PublicRefCountedDtorInHeader> {
- public:
- PublicRefCountedDtorInHeader() {}
- ~PublicRefCountedDtorInHeader() {}
-
- private:
- friend class base::RefCounted<PublicRefCountedDtorInHeader>;
-};
-
-// Unsafe; should error.
-class PublicRefCountedThreadSafeDtorInHeader
- : public base::RefCountedThreadSafe<
- PublicRefCountedThreadSafeDtorInHeader> {
- public:
- PublicRefCountedThreadSafeDtorInHeader() {}
- ~PublicRefCountedThreadSafeDtorInHeader() {}
-
- private:
- friend class base::RefCountedThreadSafe<
- PublicRefCountedThreadSafeDtorInHeader>;
-};
-
-// Safe; should not have errors.
-class ProtectedRefCountedDtorInHeader
- : public base::RefCounted<ProtectedRefCountedDtorInHeader> {
- public:
- ProtectedRefCountedDtorInHeader() {}
-
- protected:
- ~ProtectedRefCountedDtorInHeader() {}
-
- private:
- friend class base::RefCounted<ProtectedRefCountedDtorInHeader>;
-};
-
-// Safe; should not have errors.
-class PrivateRefCountedDtorInHeader
- : public base::RefCounted<PrivateRefCountedDtorInHeader> {
- public:
- PrivateRefCountedDtorInHeader() {}
-
- private:
- ~PrivateRefCountedDtorInHeader() {}
- friend class base::RefCounted<PrivateRefCountedDtorInHeader>;
-};
-
-// Unsafe; A grandchild class ends up exposing their parent and grandparent's
-// destructors.
-class DerivedProtectedToPublicInHeader
- : public ProtectedRefCountedDtorInHeader {
- public:
- DerivedProtectedToPublicInHeader() {}
- ~DerivedProtectedToPublicInHeader() {}
-};
-
-// Unsafe; A grandchild ends up implicitly exposing their parent and
-// grantparent's destructors.
-class ImplicitDerivedProtectedToPublicInHeader
- : public ProtectedRefCountedDtorInHeader {
- public:
- ImplicitDerivedProtectedToPublicInHeader() {}
-};
-
-// Unsafe-but-ignored; should not have errors.
-class WebKitPublicDtorInHeader
- : public WebKit::RefCounted<WebKitPublicDtorInHeader> {
- public:
- WebKitPublicDtorInHeader() {}
- ~WebKitPublicDtorInHeader() {}
-};
-
-// Unsafe-but-ignored; should not have errors.
-class WebKitDerivedPublicDtorInHeader
- : public WebKitPublicDtorInHeader {
- public:
- WebKitDerivedPublicDtorInHeader() {}
- ~WebKitDerivedPublicDtorInHeader() {}
-};
-
-#endif // BASE_REFCOUNTED_H_
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.txt b/third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.txt
deleted file mode 100644
index 4626424177..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/base_refcounted.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-In file included from base_refcounted.cpp:5:
-./base_refcounted.h:45:3: warning: [chromium-style] Classes that are ref-counted should not have public destructors.
- ~PublicRefCountedDtorInHeader() {}
- ^
-./base_refcounted.h:57:3: warning: [chromium-style] Classes that are ref-counted should not have public destructors.
- ~PublicRefCountedThreadSafeDtorInHeader() {}
- ^
-./base_refcounted.h:94:3: warning: [chromium-style] Classes that are ref-counted should not have public destructors.
- ~DerivedProtectedToPublicInHeader() {}
- ^
-./base_refcounted.h:99:1: warning: [chromium-style] Classes that are ref-counted should have explicit destructors that are protected or private.
-class ImplicitDerivedProtectedToPublicInHeader
-^
-base_refcounted.cpp:16:3: warning: [chromium-style] Classes that are ref-counted should not have public destructors.
- ~AnonymousDerivedProtectedToPublicInImpl() {}
- ^
-base_refcounted.cpp:26:3: warning: [chromium-style] Classes that are ref-counted should not have public destructors.
- ~PublicRefCountedDtorInImpl() {}
- ^
-base_refcounted.cpp:52:3: warning: [chromium-style] Classes that are ref-counted should not have public destructors.
- ~UnsafeTypedefChainInImpl() {}
- ^
-7 warnings generated.
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.cpp b/third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.cpp
deleted file mode 100644
index dcd90020c5..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.cpp
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "inline_copy_ctor.h"
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.h b/third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.h
deleted file mode 100644
index 619a18392b..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-struct C {
- C();
- ~C();
-
- static C foo() { return C(); }
-
- int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p , q, r, s, t, u, v, w, x;
-};
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.txt b/third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.txt
deleted file mode 100644
index bc4bd8911e..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/inline_copy_ctor.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-In file included from inline_copy_ctor.cpp:5:
-./inline_copy_ctor.h:5:1: warning: [chromium-style] Complex class/struct needs an explicit out-of-line copy constructor.
-struct C {
-^
-1 warning generated.
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.cpp b/third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.cpp
deleted file mode 100644
index 6a751fb405..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "inline_ctor.h"
-
-#include <string>
-#include <vector>
-
-// We don't warn on classes that are in CPP files.
-class InlineInCPPOK {
- public:
- InlineInCPPOK() {}
- ~InlineInCPPOK() {}
-
- private:
- std::vector<int> one_;
- std::vector<std::string> two_;
-};
-
-int main() {
- InlineInCPPOK one;
- InlineCtorsArentOKInHeader two;
- return 0;
-}
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.h b/third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.h
deleted file mode 100644
index d053b2f57d..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef INLINE_CTOR_H_
-#define INLINE_CTOR_H_
-
-#include <string>
-#include <vector>
-
-class InlineCtorsArentOKInHeader {
- public:
- InlineCtorsArentOKInHeader() {}
- ~InlineCtorsArentOKInHeader() {}
-
- private:
- std::vector<int> one_;
- std::vector<std::string> two_;
-};
-
-#endif // INLINE_CTOR_H_
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.txt b/third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.txt
deleted file mode 100644
index caa0cb4e3b..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/inline_ctor.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-In file included from inline_ctor.cpp:5:
-./inline_ctor.h:13:3: warning: [chromium-style] Complex constructor has an inlined body.
- InlineCtorsArentOKInHeader() {}
- ^
-./inline_ctor.h:14:3: warning: [chromium-style] Complex destructor has an inline body.
- ~InlineCtorsArentOKInHeader() {}
- ^
-2 warnings generated.
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.cpp b/third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.cpp
deleted file mode 100644
index 8ee2fb2ac8..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "missing_ctor.h"
-
-#include <string>
-#include <vector>
-
-// We don't warn on classes that use default ctors in cpp files.
-class MissingInCPPOK {
- public:
-
- private:
- std::vector<int> one_;
- std::vector<std::string> two_;
-};
-
-int main() {
- MissingInCPPOK one;
- MissingCtorsArentOKInHeader two;
- return 0;
-}
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.h b/third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.h
deleted file mode 100644
index 1050457a1a..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MISSING_CTOR_H_
-#define MISSING_CTOR_H_
-
-#include <string>
-#include <vector>
-
-class MissingCtorsArentOKInHeader {
- public:
-
- private:
- std::vector<int> one_;
- std::vector<std::string> two_;
-};
-
-#endif // MISSING_CTOR_H_
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.txt b/third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.txt
deleted file mode 100644
index 301449c4ac..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/missing_ctor.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-In file included from missing_ctor.cpp:5:
-./missing_ctor.h:11:1: warning: [chromium-style] Complex class/struct needs an explicit out-of-line constructor.
-class MissingCtorsArentOKInHeader {
-^
-./missing_ctor.h:11:1: warning: [chromium-style] Complex class/struct needs an explicit out-of-line destructor.
-2 warnings generated.
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.cpp b/third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.cpp
deleted file mode 100644
index aa90a95eb3..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.cpp
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "nested_class_inline_ctor.h"
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.h b/third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.h
deleted file mode 100644
index 01cfea9232..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef NESTED_CLASS_INLINE_CTOR_H_
-#define NESTED_CLASS_INLINE_CTOR_H_
-
-#include <string>
-#include <vector>
-
-// See crbug.com/136863.
-
-class Foo {
- class Bar {
- Bar() {}
- ~Bar() {}
-
- std::vector<std::string> a;
- };
-};
-
-#endif // NESTED_CLASS_INLINE_CTOR_H_
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.txt b/third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.txt
deleted file mode 100644
index 39bd6e1dce..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/nested_class_inline_ctor.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-In file included from nested_class_inline_ctor.cpp:5:
-./nested_class_inline_ctor.h:15:5: warning: [chromium-style] Complex constructor has an inlined body.
- Bar() {}
- ^
-./nested_class_inline_ctor.h:16:5: warning: [chromium-style] Complex destructor has an inline body.
- ~Bar() {}
- ^
-2 warnings generated.
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.cpp b/third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.cpp
deleted file mode 100644
index f572a41733..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "overridden_methods.h"
-
-// Fill in the implementations
-void DerivedClass::SomeMethod() {}
-void DerivedClass::SomeOtherMethod() {}
-void DerivedClass::WebKitModifiedSomething() {}
-
-class ImplementationInterimClass : public BaseClass {
- public:
- // Should not warn about pure virtual methods.
- virtual void SomeMethod() = 0;
-};
-
-class ImplementationDerivedClass : public ImplementationInterimClass,
- public webkit_glue::WebKitObserverImpl {
- public:
- // Should not warn about destructors.
- virtual ~ImplementationDerivedClass() {}
- // Should warn.
- virtual void SomeMethod();
- // Should not warn if marked as override.
- virtual void SomeOtherMethod() override;
- // Should not warn for inline implementations in implementation files.
- virtual void SomeInlineMethod() {}
- // Should not warn if overriding a method whose origin is WebKit.
- virtual void WebKitModifiedSomething();
- // Should warn if overridden method isn't pure.
- virtual void SomeNonPureBaseMethod() {}
-};
-
-int main() {
- DerivedClass something;
- ImplementationDerivedClass something_else;
-}
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.h b/third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.h
deleted file mode 100644
index 150c79913f..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef OVERRIDDEN_METHODS_H_
-#define OVERRIDDEN_METHODS_H_
-
-// Should warn about overriding of methods.
-class BaseClass {
- public:
- virtual ~BaseClass() {}
- virtual void SomeMethod() = 0;
- virtual void SomeOtherMethod() = 0;
- virtual void SomeInlineMethod() = 0;
- virtual void SomeNonPureBaseMethod() {}
-};
-
-class InterimClass : public BaseClass {
- // Should not warn about pure virtual methods.
- virtual void SomeMethod() = 0;
-};
-
-namespace WebKit {
-class WebKitObserver {
- public:
- virtual void WebKitModifiedSomething() {};
-};
-} // namespace WebKit
-
-namespace webkit_glue {
-class WebKitObserverImpl : WebKit::WebKitObserver {
- public:
- virtual void WebKitModifiedSomething() {};
-};
-} // namespace webkit_glue
-
-class DerivedClass : public InterimClass,
- public webkit_glue::WebKitObserverImpl {
- public:
- // Should not warn about destructors.
- virtual ~DerivedClass() {}
- // Should warn.
- virtual void SomeMethod();
- // Should not warn if marked as override.
- virtual void SomeOtherMethod() override;
- // Should warn for inline implementations.
- virtual void SomeInlineMethod() {}
- // Should not warn if overriding a method whose origin is WebKit.
- virtual void WebKitModifiedSomething();
- // Should warn if overridden method isn't pure.
- virtual void SomeNonPureBaseMethod() {}
-};
-
-#endif // OVERRIDDEN_METHODS_H_
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.txt b/third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.txt
deleted file mode 100644
index 7553ade70e..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/overridden_methods.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-In file included from overridden_methods.cpp:5:
-./overridden_methods.h:43:11: warning: [chromium-style] Overriding method must be marked with OVERRIDE.
- virtual void SomeMethod();
- ^
-./overridden_methods.h:47:11: warning: [chromium-style] Overriding method must be marked with OVERRIDE.
- virtual void SomeInlineMethod() {}
- ^
-./overridden_methods.h:51:11: warning: [chromium-style] Overriding method must be marked with OVERRIDE.
- virtual void SomeNonPureBaseMethod() {}
- ^
-overridden_methods.cpp:24:11: warning: [chromium-style] Overriding method must be marked with OVERRIDE.
- virtual void SomeMethod();
- ^
-overridden_methods.cpp:28:11: warning: [chromium-style] Overriding method must be marked with OVERRIDE.
- virtual void SomeInlineMethod() {}
- ^
-overridden_methods.cpp:32:11: warning: [chromium-style] Overriding method must be marked with OVERRIDE.
- virtual void SomeNonPureBaseMethod() {}
- ^
-6 warnings generated.
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/test.sh b/third_party/libwebrtc/tools/clang/plugins/tests/test.sh
deleted file mode 100755
index 262ebbba29..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/test.sh
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/bin/bash
-#
-# Copyright (c) 2011 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# Hacky, primitive testing: This runs the style plugin for a set of input files
-# and compares the output with golden result files.
-
-E_BADARGS=65
-E_FAILEDTEST=1
-
-failed_any_test=
-
-# Prints usage information.
-usage() {
- echo "Usage: $(basename "${0}")" \
- "<Path to the llvm build dir, usually Release+Asserts>"
- echo ""
- echo " Runs all the libFindBadConstructs unit tests"
- echo ""
-}
-
-# Runs a single test case.
-do_testcase() {
- local output="$("${CLANG_DIR}"/bin/clang -c -Wno-c++11-extensions \
- -Xclang -load -Xclang "${CLANG_DIR}"/lib/libFindBadConstructs.${LIB} \
- -Xclang -plugin -Xclang find-bad-constructs ${1} 2>&1)"
- local diffout="$(echo "${output}" | diff - "${2}")"
- if [ "${diffout}" = "" ]; then
- echo "PASS: ${1}"
- else
- failed_any_test=yes
- echo "FAIL: ${1}"
- echo "Output of compiler:"
- echo "${output}"
- echo "Expected output:"
- cat "${2}"
- echo
- fi
-}
-
-# Validate input to the script.
-if [[ -z "${1}" ]]; then
- usage
- exit ${E_BADARGS}
-elif [[ ! -d "${1}" ]]; then
- echo "${1} is not a directory."
- usage
- exit ${E_BADARGS}
-else
- export CLANG_DIR="${PWD}/${1}"
- echo "Using clang directory ${CLANG_DIR}..."
-
- # The golden files assume that the cwd is this directory. To make the script
- # work no matter what the cwd is, explicitly cd to there.
- cd "$(dirname "${0}")"
-
- if [ "$(uname -s)" = "Linux" ]; then
- export LIB=so
- elif [ "$(uname -s)" = "Darwin" ]; then
- export LIB=dylib
- fi
-fi
-
-for input in *.cpp; do
- do_testcase "${input}" "${input%cpp}txt"
-done
-
-if [[ "${failed_any_test}" ]]; then
- exit ${E_FAILEDTEST}
-fi
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.cpp b/third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.cpp
deleted file mode 100644
index a07cbe4875..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "virtual_methods.h"
-
-// Shouldn't warn about method usage in the implementation file.
-class VirtualMethodsInImplementation {
- public:
- virtual void MethodIsAbstract() = 0;
- virtual void MethodHasNoArguments();
- virtual void MethodHasEmptyDefaultImpl() {}
- virtual bool ComplainAboutThis() { return true; }
-};
-
-// Stubs to fill in the abstract method
-class ConcreteVirtualMethodsInHeaders : public VirtualMethodsInHeaders {
- public:
- virtual void MethodIsAbstract() override {}
-};
-
-class ConcreteVirtualMethodsInImplementation
- : public VirtualMethodsInImplementation {
- public:
- virtual void MethodIsAbstract() override {}
-};
-
-// Fill in the implementations
-void VirtualMethodsInHeaders::MethodHasNoArguments() {}
-void WarnOnMissingVirtual::MethodHasNoArguments() {}
-void VirtualMethodsInImplementation::MethodHasNoArguments() {}
-
-int main() {
- ConcreteVirtualMethodsInHeaders one;
- ConcreteVirtualMethodsInImplementation two;
-}
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.h b/third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.h
deleted file mode 100644
index d9fbf96ed3..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef VIRTUAL_METHODS_H_
-#define VIRTUAL_METHODS_H_
-
-// Should warn about virtual method usage.
-class VirtualMethodsInHeaders {
- public:
- // Don't complain about these.
- virtual void MethodIsAbstract() = 0;
- virtual void MethodHasNoArguments();
- virtual void MethodHasEmptyDefaultImpl() {}
-
- // But complain about this:
- virtual bool ComplainAboutThis() { return true; }
-};
-
-// Complain on missing 'virtual' keyword in overrides.
-class WarnOnMissingVirtual : public VirtualMethodsInHeaders {
- public:
- void MethodHasNoArguments() override;
-};
-
-// Don't complain about things in a 'testing' namespace.
-namespace testing {
-struct TestStruct {};
-} // namespace testing
-
-class VirtualMethodsInHeadersTesting : public VirtualMethodsInHeaders {
- public:
- // Don't complain about no virtual testing methods.
- void MethodHasNoArguments();
- private:
- testing::TestStruct tester_;
-};
-
-#endif // VIRTUAL_METHODS_H_
diff --git a/third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.txt b/third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.txt
deleted file mode 100644
index 571d6d667d..0000000000
--- a/third_party/libwebrtc/tools/clang/plugins/tests/virtual_methods.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-In file included from virtual_methods.cpp:5:
-./virtual_methods.h:17:36: warning: [chromium-style] virtual methods with non-empty bodies shouldn't be declared inline.
- virtual bool ComplainAboutThis() { return true; }
- ^
-./virtual_methods.h:23:3: warning: [chromium-style] Overriding method must have "virtual" keyword.
- void MethodHasNoArguments() override;
- ^
-2 warnings generated.
diff --git a/third_party/libwebrtc/tools/clang/scripts/package.sh b/third_party/libwebrtc/tools/clang/scripts/package.sh
deleted file mode 100755
index eb345810b9..0000000000
--- a/third_party/libwebrtc/tools/clang/scripts/package.sh
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/bash
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This script will check out llvm and clang, and then package the results up
-# to a tgz file.
-
-THIS_DIR="$(dirname "${0}")"
-LLVM_DIR="${THIS_DIR}/../../../third_party/llvm"
-LLVM_BOOTSTRAP_DIR="${THIS_DIR}/../../../third_party/llvm-bootstrap"
-LLVM_BUILD_DIR="${THIS_DIR}/../../../third_party/llvm-build"
-LLVM_BIN_DIR="${LLVM_BUILD_DIR}/Release+Asserts/bin"
-LLVM_LIB_DIR="${LLVM_BUILD_DIR}/Release+Asserts/lib"
-
-echo "Diff in llvm:" | tee buildlog.txt
-svn stat "${LLVM_DIR}" 2>&1 | tee -a buildlog.txt
-svn diff "${LLVM_DIR}" 2>&1 | tee -a buildlog.txt
-echo "Diff in llvm/tools/clang:" | tee -a buildlog.txt
-svn stat "${LLVM_DIR}/tools/clang" 2>&1 | tee -a buildlog.txt
-svn diff "${LLVM_DIR}/tools/clang" 2>&1 | tee -a buildlog.txt
-echo "Diff in llvm/projects/compiler-rt:" | tee -a buildlog.txt
-svn stat "${LLVM_DIR}/projects/compiler-rt" 2>&1 | tee -a buildlog.txt
-svn diff "${LLVM_DIR}/projects/compiler-rt" 2>&1 | tee -a buildlog.txt
-
-echo "Starting build" | tee -a buildlog.txt
-
-set -ex
-
-# Do a clobber build.
-rm -rf "${LLVM_BOOTSTRAP_DIR}"
-rm -rf "${LLVM_BUILD_DIR}"
-"${THIS_DIR}"/update.sh --run-tests --bootstrap --force-local-build 2>&1 | \
- tee -a buildlog.txt
-
-R=$("${LLVM_BIN_DIR}/clang" --version | \
- sed -ne 's/clang version .*(trunk \([0-9]*\))/\1/p')
-
-PDIR=clang-$R
-rm -rf $PDIR
-mkdir $PDIR
-mkdir $PDIR/bin
-mkdir $PDIR/lib
-
-# Copy buildlog over.
-cp buildlog.txt $PDIR/
-
-# Copy clang into pdir, symlink clang++ to it.
-cp "${LLVM_BIN_DIR}/clang" $PDIR/bin/
-(cd $PDIR/bin && ln -sf clang clang++ && cd -)
-
-# Copy plugins. Some of the dylibs are pretty big, so copy only the ones we
-# care about.
-if [ "$(uname -s)" = "Darwin" ]; then
- cp "${LLVM_LIB_DIR}/libFindBadConstructs.dylib" $PDIR/lib
-else
- cp "${LLVM_LIB_DIR}/libFindBadConstructs.so" $PDIR/lib
-fi
-
-# Copy built-in headers (lib/clang/3.2/include).
-# libcompiler-rt puts all kinds of libraries there too, but we want only ASan.
-if [ "$(uname -s)" = "Darwin" ]; then
- # Keep only Release+Asserts/lib/clang/3.2/lib/darwin/libclang_rt.asan_osx.a
- find "${LLVM_LIB_DIR}/clang" -type f -path '*lib/darwin*' | grep -v asan | \
- xargs rm
-else
- # Keep only
- # Release+Asserts/lib/clang/3.2/lib/linux/libclang_rt.{asan,tsan}-x86_64.a
- # TODO(thakis): Make sure the 32bit version of ASan runtime is kept too once
- # that's built. TSan runtime exists only for 64 bits.
- find "${LLVM_LIB_DIR}/clang" -type f -path '*lib/linux*' | \
- grep -v "asan\|tsan" | xargs rm
-fi
-
-cp -R "${LLVM_LIB_DIR}/clang" $PDIR/lib
-
-tar zcf $PDIR.tgz -C $PDIR bin lib buildlog.txt
-
-if [ "$(uname -s)" = "Darwin" ]; then
- PLATFORM=Mac
-else
- PLATFORM=Linux_x64
-fi
-
-echo To upload, run:
-echo gsutil cp -a public-read $PDIR.tgz \
- gs://chromium-browser-clang/$PLATFORM/$PDIR.tgz
diff --git a/third_party/libwebrtc/tools/clang/scripts/plugin_flags.sh b/third_party/libwebrtc/tools/clang/scripts/plugin_flags.sh
deleted file mode 100755
index 217c5c3bd6..0000000000
--- a/third_party/libwebrtc/tools/clang/scripts/plugin_flags.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This script returns the flags that should be used when GYP_DEFINES contains
-# clang_use_chrome_plugins. The flags are stored in a script so that they can
-# be changed on the bots without requiring a master restart.
-
-THIS_ABS_DIR=$(cd $(dirname $0) && echo $PWD)
-CLANG_LIB_PATH=$THIS_ABS_DIR/../../../third_party/llvm-build/Release+Asserts/lib
-
-if uname -s | grep -q Darwin; then
- LIBSUFFIX=dylib
-else
- LIBSUFFIX=so
-fi
-
-echo -Xclang -load -Xclang $CLANG_LIB_PATH/libFindBadConstructs.$LIBSUFFIX \
- -Xclang -add-plugin -Xclang find-bad-constructs \
- -Xclang -plugin-arg-find-bad-constructs \
- -Xclang skip-virtuals-in-implementations \
- -Xclang -plugin-arg-find-bad-constructs \
- -Xclang check-cc-directory
diff --git a/third_party/libwebrtc/tools/clang/scripts/update.py b/third_party/libwebrtc/tools/clang/scripts/update.py
deleted file mode 100755
index bdc781f715..0000000000
--- a/third_party/libwebrtc/tools/clang/scripts/update.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Windows can't run .sh files, so this is a small python wrapper around
-update.sh.
-"""
-
-import os
-import subprocess
-import sys
-
-
-def main():
- if sys.platform in ['win32', 'cygwin']:
- return 0
-
- # This script is called by gclient. gclient opens its hooks subprocesses with
- # (stdout=subprocess.PIPE, stderr=subprocess.STDOUT) and then does custom
- # output processing that breaks printing '\r' characters for single-line
- # updating status messages as printed by curl and wget.
- # Work around this by setting stderr of the update.sh process to stdin (!):
- # gclient doesn't redirect stdin, and while stdin itself is read-only, a
- # dup()ed sys.stdin is writable, try
- # fd2 = os.dup(sys.stdin.fileno()); os.write(fd2, 'hi')
- # TODO: Fix gclient instead, http://crbug.com/95350
- return subprocess.call(
- [os.path.join(os.path.dirname(__file__), 'update.sh')] + sys.argv[1:],
- stderr=os.fdopen(os.dup(sys.stdin.fileno())))
-
-
-if __name__ == '__main__':
- sys.exit(main())
diff --git a/third_party/libwebrtc/tools/clang/scripts/update.sh b/third_party/libwebrtc/tools/clang/scripts/update.sh
deleted file mode 100755
index e9448236c8..0000000000
--- a/third_party/libwebrtc/tools/clang/scripts/update.sh
+++ /dev/null
@@ -1,286 +0,0 @@
-#!/usr/bin/env bash
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This script will check out llvm and clang into third_party/llvm and build it.
-
-# Do NOT CHANGE this if you don't know what you're doing -- see
-# https://code.google.com/p/chromium/wiki/UpdatingClang
-# Reverting problematic clang rolls is safe, though.
-CLANG_REVISION=163674
-
-THIS_DIR="$(dirname "${0}")"
-LLVM_DIR="${THIS_DIR}/../../../third_party/llvm"
-LLVM_BUILD_DIR="${LLVM_DIR}/../llvm-build"
-LLVM_BOOTSTRAP_DIR="${LLVM_DIR}/../llvm-bootstrap"
-CLANG_DIR="${LLVM_DIR}/tools/clang"
-COMPILER_RT_DIR="${LLVM_DIR}/projects/compiler-rt"
-STAMP_FILE="${LLVM_BUILD_DIR}/cr_build_revision"
-
-# ${A:-a} returns $A if it's set, a else.
-LLVM_REPO_URL=${LLVM_URL:-https://llvm.org/svn/llvm-project}
-
-# Die if any command dies.
-set -e
-
-OS="$(uname -s)"
-
-# Parse command line options.
-force_local_build=
-mac_only=
-run_tests=
-bootstrap=
-while [[ $# > 0 ]]; do
- case $1 in
- --bootstrap)
- bootstrap=yes
- ;;
- --force-local-build)
- force_local_build=yes
- ;;
- --mac-only)
- mac_only=yes
- ;;
- --run-tests)
- run_tests=yes
- ;;
- --help)
- echo "usage: $0 [--force-local-build] [--mac-only] [--run-tests] "
- echo "--bootstrap: First build clang with CC, then with itself."
- echo "--force-local-build: Don't try to download prebuilt binaries."
- echo "--mac-only: Do initial download only on Mac systems."
- echo "--run-tests: Run tests after building. Only for local builds."
- exit 1
- ;;
- esac
- shift
-done
-
-# --mac-only prevents the initial download on non-mac systems, but if clang has
-# already been downloaded in the past, this script keeps it up to date even if
-# --mac-only is passed in and the system isn't a mac. People who don't like this
-# can just delete their third_party/llvm-build directory.
-if [[ -n "$mac_only" ]] && [[ "${OS}" != "Darwin" ]] &&
- [[ "$GYP_DEFINES" != *clang=1* ]] && ! [[ -d "${LLVM_BUILD_DIR}" ]]; then
- exit 0
-fi
-
-# Xcode and clang don't get along when predictive compilation is enabled.
-# http://crbug.com/96315
-if [[ "${OS}" = "Darwin" ]] && xcodebuild -version | grep -q 'Xcode 3.2' ; then
- XCONF=com.apple.Xcode
- if [[ "${GYP_GENERATORS}" != "make" ]] && \
- [ "$(defaults read "${XCONF}" EnablePredictiveCompilation)" != "0" ]; then
- echo
- echo " HEARKEN!"
- echo "You're using Xcode3 and you have 'Predictive Compilation' enabled."
- echo "This does not work well with clang (http://crbug.com/96315)."
- echo "Disable it in Preferences->Building (lower right), or run"
- echo " defaults write ${XCONF} EnablePredictiveCompilation -boolean NO"
- echo "while Xcode is not running."
- echo
- fi
-
- SUB_VERSION=$(xcodebuild -version | sed -Ene 's/Xcode 3\.2\.([0-9]+)/\1/p')
- if [[ "${SUB_VERSION}" < 6 ]]; then
- echo
- echo " YOUR LD IS BUGGY!"
- echo "Please upgrade Xcode to at least 3.2.6."
- echo
- fi
-fi
-
-
-# Check if there's anything to be done, exit early if not.
-if [[ -f "${STAMP_FILE}" ]]; then
- PREVIOUSLY_BUILT_REVISON=$(cat "${STAMP_FILE}")
- if [[ -z "$force_local_build" ]] && \
- [[ "${PREVIOUSLY_BUILT_REVISON}" = "${CLANG_REVISION}" ]]; then
- echo "Clang already at ${CLANG_REVISION}"
- exit 0
- fi
-fi
-# To always force a new build if someone interrupts their build half way.
-rm -f "${STAMP_FILE}"
-
-# Clobber pch files, since they only work with the compiler version that
-# created them. Also clobber .o files, to make sure everything will be built
-# with the new compiler.
-if [[ "${OS}" = "Darwin" ]]; then
- XCODEBUILD_DIR="${THIS_DIR}/../../../xcodebuild"
-
- # Xcode groups .o files by project first, configuration second.
- if [[ -d "${XCODEBUILD_DIR}" ]]; then
- echo "Clobbering .o files for Xcode build"
- find "${XCODEBUILD_DIR}" -name '*.o' -exec rm {} +
- fi
-fi
-
-if [ -f "${THIS_DIR}/../../../WebKit.gyp" ]; then
- # We're inside a WebKit checkout.
- # TODO(thakis): try to unify the directory layout of the xcode- and
- # make-based builds. http://crbug.com/110455
- MAKE_DIR="${THIS_DIR}/../../../../../../out"
-else
- # We're inside a Chromium checkout.
- MAKE_DIR="${THIS_DIR}/../../../out"
-fi
-
-for CONFIG in Debug Release; do
- if [[ -d "${MAKE_DIR}/${CONFIG}/obj.target" ||
- -d "${MAKE_DIR}/${CONFIG}/obj.host" ]]; then
- echo "Clobbering ${CONFIG} PCH and .o files for make build"
- if [[ -d "${MAKE_DIR}/${CONFIG}/obj.target" ]]; then
- find "${MAKE_DIR}/${CONFIG}/obj.target" -name '*.gch' -exec rm {} +
- find "${MAKE_DIR}/${CONFIG}/obj.target" -name '*.o' -exec rm {} +
- fi
- if [[ -d "${MAKE_DIR}/${CONFIG}/obj.host" ]]; then
- find "${MAKE_DIR}/${CONFIG}/obj.host" -name '*.o' -exec rm {} +
- fi
- fi
-
- # ninja puts its output below ${MAKE_DIR} as well.
- if [[ -d "${MAKE_DIR}/${CONFIG}/obj" ]]; then
- echo "Clobbering ${CONFIG} PCH and .o files for ninja build"
- find "${MAKE_DIR}/${CONFIG}/obj" -name '*.gch' -exec rm {} +
- find "${MAKE_DIR}/${CONFIG}/obj" -name '*.o' -exec rm {} +
- find "${MAKE_DIR}/${CONFIG}/obj" -name '*.o.d' -exec rm {} +
- fi
-
- if [[ "${OS}" = "Darwin" ]]; then
- if [[ -d "${XCODEBUILD_DIR}/${CONFIG}/SharedPrecompiledHeaders" ]]; then
- echo "Clobbering ${CONFIG} PCH files for Xcode build"
- rm -rf "${XCODEBUILD_DIR}/${CONFIG}/SharedPrecompiledHeaders"
- fi
- fi
-done
-
-if [[ -z "$force_local_build" ]]; then
- # Check if there's a prebuilt binary and if so just fetch that. That's faster,
- # and goma relies on having matching binary hashes on client and server too.
- CDS_URL=https://commondatastorage.googleapis.com/chromium-browser-clang
- CDS_FILE="clang-${CLANG_REVISION}.tgz"
- CDS_OUT_DIR=$(mktemp -d -t clang_download.XXXXXX)
- CDS_OUTPUT="${CDS_OUT_DIR}/${CDS_FILE}"
- if [ "${OS}" = "Linux" ]; then
- CDS_FULL_URL="${CDS_URL}/Linux_x64/${CDS_FILE}"
- elif [ "${OS}" = "Darwin" ]; then
- CDS_FULL_URL="${CDS_URL}/Mac/${CDS_FILE}"
- fi
- echo Trying to download prebuilt clang
- if which curl > /dev/null; then
- curl -L --fail "${CDS_FULL_URL}" -o "${CDS_OUTPUT}" || \
- rm -rf "${CDS_OUT_DIR}"
- elif which wget > /dev/null; then
- wget "${CDS_FULL_URL}" -O "${CDS_OUTPUT}" || rm -rf "${CDS_OUT_DIR}"
- else
- echo "Neither curl nor wget found. Please install one of these."
- exit 1
- fi
- if [ -f "${CDS_OUTPUT}" ]; then
- rm -rf "${LLVM_BUILD_DIR}/Release+Asserts"
- mkdir -p "${LLVM_BUILD_DIR}/Release+Asserts"
- tar -xzf "${CDS_OUTPUT}" -C "${LLVM_BUILD_DIR}/Release+Asserts"
- echo clang "${CLANG_REVISION}" unpacked
- echo "${CLANG_REVISION}" > "${STAMP_FILE}"
- rm -rf "${CDS_OUT_DIR}"
- exit 0
- else
- echo Did not find prebuilt clang at r"${CLANG_REVISION}", building
- fi
-fi
-
-echo Getting LLVM r"${CLANG_REVISION}" in "${LLVM_DIR}"
-if ! svn co --force "${LLVM_REPO_URL}/llvm/trunk@${CLANG_REVISION}" \
- "${LLVM_DIR}"; then
- echo Checkout failed, retrying
- rm -rf "${LLVM_DIR}"
- svn co --force "${LLVM_REPO_URL}/llvm/trunk@${CLANG_REVISION}" "${LLVM_DIR}"
-fi
-
-echo Getting clang r"${CLANG_REVISION}" in "${CLANG_DIR}"
-svn co --force "${LLVM_REPO_URL}/cfe/trunk@${CLANG_REVISION}" "${CLANG_DIR}"
-
-echo Getting compiler-rt r"${CLANG_REVISION}" in "${COMPILER_RT_DIR}"
-svn co --force "${LLVM_REPO_URL}/compiler-rt/trunk@${CLANG_REVISION}" \
- "${COMPILER_RT_DIR}"
-
-# Echo all commands.
-set -x
-
-NUM_JOBS=3
-if [[ "${OS}" = "Linux" ]]; then
- NUM_JOBS="$(grep -c "^processor" /proc/cpuinfo)"
-elif [ "${OS}" = "Darwin" ]; then
- NUM_JOBS="$(sysctl -n hw.ncpu)"
-fi
-
-# Build bootstrap clang if requested.
-if [[ -n "${bootstrap}" ]]; then
- echo "Building bootstrap compiler"
- mkdir -p "${LLVM_BOOTSTRAP_DIR}"
- cd "${LLVM_BOOTSTRAP_DIR}"
- if [[ ! -f ./config.status ]]; then
- # The bootstrap compiler only needs to be able to build the real compiler,
- # so it needs no cross-compiler output support. In general, the host
- # compiler should be as similar to the final compiler as possible, so do
- # keep --disable-threads & co.
- ../llvm/configure \
- --enable-optimized \
- --enable-targets=host-only \
- --disable-threads \
- --disable-pthreads \
- --without-llvmgcc \
- --without-llvmgxx
- MACOSX_DEPLOYMENT_TARGET=10.5 make -j"${NUM_JOBS}"
- fi
- if [[ -n "${run_tests}" ]]; then
- make check-all
- fi
- cd -
- export CC="${PWD}/${LLVM_BOOTSTRAP_DIR}/Release+Asserts/bin/clang"
- export CXX="${PWD}/${LLVM_BOOTSTRAP_DIR}/Release+Asserts/bin/clang++"
- echo "Building final compiler"
-fi
-
-# Build clang (in a separate directory).
-# The clang bots have this path hardcoded in built/scripts/slave/compile.py,
-# so if you change it you also need to change these links.
-mkdir -p "${LLVM_BUILD_DIR}"
-cd "${LLVM_BUILD_DIR}"
-if [[ ! -f ./config.status ]]; then
- ../llvm/configure \
- --enable-optimized \
- --disable-threads \
- --disable-pthreads \
- --without-llvmgcc \
- --without-llvmgxx
-fi
-
-MACOSX_DEPLOYMENT_TARGET=10.5 make -j"${NUM_JOBS}"
-cd -
-
-# Build plugin.
-# Copy it into the clang tree and use clang's build system to compile the
-# plugin.
-PLUGIN_SRC_DIR="${THIS_DIR}/../plugins"
-PLUGIN_DST_DIR="${LLVM_DIR}/tools/clang/tools/chrome-plugin"
-PLUGIN_BUILD_DIR="${LLVM_BUILD_DIR}/tools/clang/tools/chrome-plugin"
-rm -rf "${PLUGIN_DST_DIR}"
-cp -R "${PLUGIN_SRC_DIR}" "${PLUGIN_DST_DIR}"
-rm -rf "${PLUGIN_BUILD_DIR}"
-mkdir -p "${PLUGIN_BUILD_DIR}"
-cp "${PLUGIN_SRC_DIR}/Makefile" "${PLUGIN_BUILD_DIR}"
-MACOSX_DEPLOYMENT_TARGET=10.5 make -j"${NUM_JOBS}" -C "${PLUGIN_BUILD_DIR}"
-
-if [[ -n "$run_tests" ]]; then
- # Run a few tests.
- "${PLUGIN_SRC_DIR}/tests/test.sh" "${LLVM_BUILD_DIR}/Release+Asserts"
- cd "${LLVM_BUILD_DIR}"
- make check-all
- cd -
-fi
-
-# After everything is done, log success for this revision.
-echo "${CLANG_REVISION}" > "${STAMP_FILE}"