Compare commits
38 Commits
llvmorg-3.
...
llvmorg-3.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc12345cbe | ||
|
|
1b871840be | ||
|
|
a7d131fb47 | ||
|
|
0fbdb0ad4a | ||
|
|
5e5ca787a3 | ||
|
|
de9c697e1a | ||
|
|
02591c29cf | ||
|
|
ce9034fb11 | ||
|
|
5aaaf48c94 | ||
|
|
f1c66f598f | ||
|
|
afa0e6fb42 | ||
|
|
c954a30696 | ||
|
|
421c8baa5f | ||
|
|
9cab0c3e89 | ||
|
|
69c35faa45 | ||
|
|
ae95127c7e | ||
|
|
c1c82eee94 | ||
|
|
9eeddcf338 | ||
|
|
8d9c0888e2 | ||
|
|
bec38f0dc6 | ||
|
|
246dabacf2 | ||
|
|
5fe100a8b5 | ||
|
|
7507b8d3dc | ||
|
|
36cbea60ff | ||
|
|
4e61d20111 | ||
|
|
c71ec93cfd | ||
|
|
1e38f1d014 | ||
|
|
4fb21f4bd6 | ||
|
|
c0b5d07324 | ||
|
|
720a948f4c | ||
|
|
2d8f608f6c | ||
|
|
3854a32832 | ||
|
|
35d7d54446 | ||
|
|
58d9326bad | ||
|
|
90ba37cff6 | ||
|
|
5eafd41d83 | ||
|
|
75981ed191 | ||
|
|
e8bdd73f80 |
@@ -672,16 +672,16 @@ LIBBUILTIN(rindex, "c*cC*i", "f", "strings.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(bzero, "vv*z", "f", "strings.h", ALL_LANGUAGES)
|
||||
// POSIX unistd.h
|
||||
LIBBUILTIN(_exit, "vi", "fr", "unistd.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(vfork, "iJ", "fj", "unistd.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(vfork, "i", "fj", "unistd.h", ALL_LANGUAGES)
|
||||
// POSIX setjmp.h
|
||||
|
||||
// In some systems setjmp is a macro that expands to _setjmp. We undefine
|
||||
// it here to avoid having two identical LIBBUILTIN entries.
|
||||
#undef setjmp
|
||||
LIBBUILTIN(_setjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(__sigsetjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(__sigsetjmp, "iJi", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(setjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(sigsetjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(sigsetjmp, "iJi", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(setjmp_syscall, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(savectx, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(qsetjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
|
||||
@@ -642,6 +642,17 @@ def isystem : JoinedOrSeparate<"-isystem">, MetaVarName<"<directory>">,
|
||||
def iwithsysroot : JoinedOrSeparate<"-iwithsysroot">,MetaVarName<"<directory>">,
|
||||
HelpText<"Add directory to SYSTEM include search path, "
|
||||
"absolute paths are relative to -isysroot">;
|
||||
def internal_isystem : JoinedOrSeparate<"-internal-isystem">,
|
||||
MetaVarName<"<directory>">,
|
||||
HelpText<"Add directory to the internal system include search path; these "
|
||||
"are assumed to not be user-provided and are used to model system "
|
||||
"and standard headers' paths.">;
|
||||
def internal_externc_isystem : JoinedOrSeparate<"-internal-externc-isystem">,
|
||||
MetaVarName<"<directory>">,
|
||||
HelpText<"Add directory to the internal system include search path with "
|
||||
"implicit extern \"C\" semantics; these are assumed to not be "
|
||||
"user-provided and are used to model system and standard headers' "
|
||||
"paths.">;
|
||||
def iprefix : JoinedOrSeparate<"-iprefix">, MetaVarName<"<prefix>">,
|
||||
HelpText<"Set the -iwithprefix/-iwithprefixbefore prefix">;
|
||||
def iwithprefix : JoinedOrSeparate<"-iwithprefix">, MetaVarName<"<dir>">,
|
||||
|
||||
@@ -195,15 +195,21 @@ public:
|
||||
/// FIXME: this really belongs on some sort of DeploymentTarget abstraction
|
||||
virtual bool hasBlocksRuntime() const { return true; }
|
||||
|
||||
/// \brief Add the clang cc1 arguments for system include paths.
|
||||
///
|
||||
/// This routine is responsible for adding the necessary cc1 arguments to
|
||||
/// include headers from standard system header directories.
|
||||
virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const;
|
||||
|
||||
// GetCXXStdlibType - Determine the C++ standard library type to use with the
|
||||
// given compilation arguments.
|
||||
virtual CXXStdlibType GetCXXStdlibType(const ArgList &Args) const;
|
||||
|
||||
/// AddClangCXXStdlibIncludeArgs - Add the clang -cc1 level arguments to set
|
||||
/// the include paths to use for the given C++ standard library type.
|
||||
virtual void AddClangCXXStdlibIncludeArgs(const ArgList &Args,
|
||||
ArgStringList &CmdArgs,
|
||||
bool ObjCXXAutoRefCount) const;
|
||||
virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const;
|
||||
|
||||
/// AddCXXStdlibLibArgs - Add the system specific linker arguments to use
|
||||
/// for the given C++ standard library type.
|
||||
|
||||
@@ -49,10 +49,24 @@ public:
|
||||
/// path.
|
||||
unsigned IgnoreSysRoot : 1;
|
||||
|
||||
/// \brief True if this entry is an internal search path.
|
||||
///
|
||||
/// This typically indicates that users didn't directly provide it, but
|
||||
/// instead it was provided by a compatibility layer for a particular
|
||||
/// system. This isn't redundant with IsUserSupplied (even though perhaps
|
||||
/// it should be) because that is false for user provided '-iwithprefix'
|
||||
/// header search entries.
|
||||
unsigned IsInternal : 1;
|
||||
|
||||
/// \brief True if this entry's headers should be wrapped in extern "C".
|
||||
unsigned ImplicitExternC : 1;
|
||||
|
||||
Entry(StringRef path, frontend::IncludeDirGroup group,
|
||||
bool isUserSupplied, bool isFramework, bool ignoreSysRoot)
|
||||
bool isUserSupplied, bool isFramework, bool ignoreSysRoot,
|
||||
bool isInternal, bool implicitExternC)
|
||||
: Path(path), Group(group), IsUserSupplied(isUserSupplied),
|
||||
IsFramework(isFramework), IgnoreSysRoot(ignoreSysRoot) {}
|
||||
IsFramework(isFramework), IgnoreSysRoot(ignoreSysRoot),
|
||||
IsInternal(isInternal), ImplicitExternC(implicitExternC) {}
|
||||
};
|
||||
|
||||
/// If non-empty, the directory to use as a "virtual system root" for include
|
||||
@@ -98,9 +112,10 @@ public:
|
||||
|
||||
/// AddPath - Add the \arg Path path to the specified \arg Group list.
|
||||
void AddPath(StringRef Path, frontend::IncludeDirGroup Group,
|
||||
bool IsUserSupplied, bool IsFramework, bool IgnoreSysRoot) {
|
||||
bool IsUserSupplied, bool IsFramework, bool IgnoreSysRoot,
|
||||
bool IsInternal = false, bool ImplicitExternC = false) {
|
||||
UserEntries.push_back(Entry(Path, Group, IsUserSupplied, IsFramework,
|
||||
IgnoreSysRoot));
|
||||
IgnoreSysRoot, IsInternal, ImplicitExternC));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -21,5 +21,13 @@ add_clang_library(clangDriver
|
||||
Types.cpp
|
||||
)
|
||||
|
||||
IF(MSVC)
|
||||
get_target_property(NON_ANSI_COMPILE_FLAGS clangDriver COMPILE_FLAGS)
|
||||
string(REPLACE /Za
|
||||
"" NON_ANSI_COMPILE_FLAGS
|
||||
${NON_ANSI_COMPILE_FLAGS})
|
||||
set_target_properties(clangDriver PROPERTIES COMPILE_FLAGS ${NON_ANSI_COMPILE_FLAGS})
|
||||
ENDIF(MSVC)
|
||||
|
||||
add_dependencies(clangDriver ClangAttrList ClangDiagnosticDriver
|
||||
ClangDriverOptions ClangCC1Options ClangCC1AsOptions)
|
||||
|
||||
@@ -211,6 +211,11 @@ std::string ToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
|
||||
return ComputeLLVMTriple(Args, InputType);
|
||||
}
|
||||
|
||||
void ToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const {
|
||||
// Each toolchain should provide the appropriate include flags.
|
||||
}
|
||||
|
||||
ToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{
|
||||
if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
|
||||
StringRef Value = A->getValue(Args);
|
||||
@@ -225,24 +230,18 @@ ToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{
|
||||
return ToolChain::CST_Libstdcxx;
|
||||
}
|
||||
|
||||
void ToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &Args,
|
||||
ArgStringList &CmdArgs,
|
||||
bool ObjCXXAutoRefCount) const {
|
||||
CXXStdlibType Type = GetCXXStdlibType(Args);
|
||||
|
||||
// Header search paths are handled by the mass of goop in InitHeaderSearch.
|
||||
|
||||
switch (Type) {
|
||||
case ToolChain::CST_Libcxx:
|
||||
if (ObjCXXAutoRefCount)
|
||||
CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
|
||||
break;
|
||||
|
||||
case ToolChain::CST_Libstdcxx:
|
||||
if (ObjCXXAutoRefCount)
|
||||
CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
|
||||
break;
|
||||
}
|
||||
void ToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const {
|
||||
// Header search paths should be handled by each of the subclasses.
|
||||
// Historically, they have not been, and instead have been handled inside of
|
||||
// the CC1-layer frontend. As the logic is hoisted out, this generic function
|
||||
// will slowly stop being called.
|
||||
//
|
||||
// While it is being called, replicate a bit of a hack to propagate the
|
||||
// '-stdlib=' flag down to CC1 so that it can in turn customize the C++
|
||||
// header search paths with it. Once all systems are overriding this
|
||||
// function, the CC1 flag and this line can be removed.
|
||||
DriverArgs.AddAllArgs(CC1Args, options::OPT_stdlib_EQ);
|
||||
}
|
||||
|
||||
void ToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -372,6 +372,86 @@ public:
|
||||
};
|
||||
|
||||
class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF {
|
||||
/// \brief Struct to store and manipulate GCC versions.
|
||||
///
|
||||
/// We rely on assumptions about the form and structure of GCC version
|
||||
/// numbers: they consist of at most three '.'-separated components, and each
|
||||
/// component is a non-negative integer except for the last component. For
|
||||
/// the last component we are very flexible in order to tolerate release
|
||||
/// candidates or 'x' wildcards.
|
||||
///
|
||||
/// Note that the ordering established among GCCVersions is based on the
|
||||
/// preferred version string to use. For example we prefer versions without
|
||||
/// a hard-coded patch number to those with a hard coded patch number.
|
||||
///
|
||||
/// Currently this doesn't provide any logic for textual suffixes to patches
|
||||
/// in the way that (for example) Debian's version format does. If that ever
|
||||
/// becomes necessary, it can be added.
|
||||
struct GCCVersion {
|
||||
/// \brief The unparsed text of the version.
|
||||
std::string Text;
|
||||
|
||||
/// \brief The parsed major, minor, and patch numbers.
|
||||
int Major, Minor, Patch;
|
||||
|
||||
/// \brief Any textual suffix on the patch number.
|
||||
std::string PatchSuffix;
|
||||
|
||||
static GCCVersion Parse(StringRef VersionText);
|
||||
bool operator<(const GCCVersion &RHS) const;
|
||||
bool operator>(const GCCVersion &RHS) const { return RHS < *this; }
|
||||
bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); }
|
||||
bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); }
|
||||
};
|
||||
|
||||
|
||||
/// \brief This is a class to find a viable GCC installation for Clang to
|
||||
/// use.
|
||||
///
|
||||
/// This class tries to find a GCC installation on the system, and report
|
||||
/// information about it. It starts from the host information provided to the
|
||||
/// Driver, and has logic for fuzzing that where appropriate.
|
||||
class GCCInstallationDetector {
|
||||
|
||||
bool IsValid;
|
||||
std::string GccTriple;
|
||||
|
||||
// FIXME: These might be better as path objects.
|
||||
std::string GccInstallPath;
|
||||
std::string GccParentLibPath;
|
||||
|
||||
GCCVersion Version;
|
||||
|
||||
public:
|
||||
GCCInstallationDetector(const Driver &D);
|
||||
|
||||
/// \brief Check whether we detected a valid GCC install.
|
||||
bool isValid() const { return IsValid; }
|
||||
|
||||
/// \brief Get the GCC triple for the detected install.
|
||||
StringRef getTriple() const { return GccTriple; }
|
||||
|
||||
/// \brief Get the detected GCC installation path.
|
||||
StringRef getInstallPath() const { return GccInstallPath; }
|
||||
|
||||
/// \brief Get the detected GCC parent lib path.
|
||||
StringRef getParentLibPath() const { return GccParentLibPath; }
|
||||
|
||||
/// \brief Get the detected GCC version string.
|
||||
StringRef getVersion() const { return Version.Text; }
|
||||
|
||||
private:
|
||||
static void CollectLibDirsAndTriples(llvm::Triple::ArchType HostArch,
|
||||
SmallVectorImpl<StringRef> &LibDirs,
|
||||
SmallVectorImpl<StringRef> &Triples);
|
||||
|
||||
void ScanLibDirForGCCTriple(llvm::Triple::ArchType HostArch,
|
||||
const std::string &LibDir,
|
||||
StringRef CandidateTriple);
|
||||
};
|
||||
|
||||
GCCInstallationDetector GCCInstallation;
|
||||
|
||||
public:
|
||||
Linux(const HostInfo &Host, const llvm::Triple& Triple);
|
||||
|
||||
@@ -380,6 +460,11 @@ public:
|
||||
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
|
||||
const ActionList &Inputs) const;
|
||||
|
||||
virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const;
|
||||
virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const;
|
||||
|
||||
std::string Linker;
|
||||
std::vector<std::string> ExtraOpts;
|
||||
};
|
||||
@@ -417,6 +502,12 @@ public:
|
||||
virtual bool IsUnwindTablesDefault() const;
|
||||
virtual const char *GetDefaultRelocationModel() const;
|
||||
virtual const char *GetForcedPicModel() const;
|
||||
|
||||
virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const;
|
||||
virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const;
|
||||
|
||||
};
|
||||
|
||||
} // end namespace toolchains
|
||||
|
||||
@@ -364,16 +364,6 @@ void Clang::AddPreprocessingOptions(const Driver &D,
|
||||
Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
|
||||
options::OPT_index_header_map);
|
||||
|
||||
// Add C++ include arguments, if needed.
|
||||
types::ID InputType = Inputs[0].getType();
|
||||
if (types::isCXX(InputType)) {
|
||||
bool ObjCXXAutoRefCount
|
||||
= types::isObjC(InputType) && isObjCAutoRefCount(Args);
|
||||
getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs,
|
||||
ObjCXXAutoRefCount);
|
||||
Args.AddAllArgs(CmdArgs, options::OPT_stdlib_EQ);
|
||||
}
|
||||
|
||||
// Add -Wp, and -Xassembler if using the preprocessor.
|
||||
|
||||
// FIXME: There is a very unfortunate problem here, some troubled
|
||||
@@ -428,6 +418,13 @@ void Clang::AddPreprocessingOptions(const Driver &D,
|
||||
// OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
|
||||
AddIncludeDirectoryList(Args, CmdArgs, "-objcxx-isystem",
|
||||
::getenv("OBJCPLUS_INCLUDE_PATH"));
|
||||
|
||||
// Add C++ include arguments, if needed.
|
||||
if (types::isCXX(Inputs[0].getType()))
|
||||
getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
|
||||
|
||||
// Add system include arguments.
|
||||
getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
|
||||
}
|
||||
|
||||
/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
|
||||
@@ -1965,6 +1962,16 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
if (ARC) {
|
||||
CmdArgs.push_back("-fobjc-arc");
|
||||
|
||||
// FIXME: It seems like this entire block, and several around it should be
|
||||
// wrapped in isObjC, but for now we just use it here as this is where it
|
||||
// was being used previously.
|
||||
if (types::isCXX(InputType) && types::isObjC(InputType)) {
|
||||
if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
|
||||
CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
|
||||
else
|
||||
CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
|
||||
}
|
||||
|
||||
// Allow the user to enable full exceptions code emission.
|
||||
// We define off for Objective-CC, on for Objective-C++.
|
||||
if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
|
||||
|
||||
@@ -569,10 +569,18 @@ static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts,
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (E.Group != frontend::Angled && E.Group != frontend::System)
|
||||
llvm::report_fatal_error("Invalid option set!");
|
||||
Res.push_back(E.Group == frontend::Angled ? "-iwithprefixbefore" :
|
||||
"-iwithprefix");
|
||||
if (E.IsInternal) {
|
||||
assert(E.Group == frontend::System && "Unexpected header search group");
|
||||
if (E.ImplicitExternC)
|
||||
Res.push_back("-internal-externc-isystem");
|
||||
else
|
||||
Res.push_back("-internal-isystem");
|
||||
} else {
|
||||
if (E.Group != frontend::Angled && E.Group != frontend::System)
|
||||
llvm::report_fatal_error("Invalid option set!");
|
||||
Res.push_back(E.Group == frontend::Angled ? "-iwithprefixbefore" :
|
||||
"-iwithprefix");
|
||||
}
|
||||
}
|
||||
Res.push_back(E.Path);
|
||||
}
|
||||
@@ -1462,6 +1470,15 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {
|
||||
ie = Args.filtered_end(); it != ie; ++it)
|
||||
Opts.AddPath((*it)->getValue(Args), frontend::ObjCXXSystem, true, false,
|
||||
true);
|
||||
|
||||
// Add the internal paths from a driver that detects standard include paths.
|
||||
for (arg_iterator I = Args.filtered_begin(OPT_internal_isystem,
|
||||
OPT_internal_externc_isystem),
|
||||
E = Args.filtered_end();
|
||||
I != E; ++I)
|
||||
Opts.AddPath((*I)->getValue(Args), frontend::System,
|
||||
false, false, /*IgnoreSysRoot=*/true, /*IsInternal=*/true,
|
||||
(*I)->getOption().matches(OPT_internal_externc_isystem));
|
||||
}
|
||||
|
||||
void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
|
||||
|
||||
@@ -27,12 +27,9 @@
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Config/config.h"
|
||||
#ifdef _MSC_VER
|
||||
#define WIN32_LEAN_AND_MEAN 1
|
||||
#include <windows.h>
|
||||
#endif
|
||||
using namespace clang;
|
||||
using namespace clang::frontend;
|
||||
|
||||
@@ -207,219 +204,6 @@ void InitHeaderSearch::AddMinGW64CXXPaths(StringRef Base,
|
||||
CXXSystem, true, false, false);
|
||||
}
|
||||
|
||||
// FIXME: This probably should goto to some platform utils place.
|
||||
#ifdef _MSC_VER
|
||||
|
||||
// Read registry string.
|
||||
// This also supports a means to look for high-versioned keys by use
|
||||
// of a $VERSION placeholder in the key path.
|
||||
// $VERSION in the key path is a placeholder for the version number,
|
||||
// causing the highest value path to be searched for and used.
|
||||
// I.e. "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\$VERSION".
|
||||
// There can be additional characters in the component. Only the numberic
|
||||
// characters are compared.
|
||||
static bool getSystemRegistryString(const char *keyPath, const char *valueName,
|
||||
char *value, size_t maxLength) {
|
||||
HKEY hRootKey = NULL;
|
||||
HKEY hKey = NULL;
|
||||
const char* subKey = NULL;
|
||||
DWORD valueType;
|
||||
DWORD valueSize = maxLength - 1;
|
||||
long lResult;
|
||||
bool returnValue = false;
|
||||
|
||||
if (strncmp(keyPath, "HKEY_CLASSES_ROOT\\", 18) == 0) {
|
||||
hRootKey = HKEY_CLASSES_ROOT;
|
||||
subKey = keyPath + 18;
|
||||
} else if (strncmp(keyPath, "HKEY_USERS\\", 11) == 0) {
|
||||
hRootKey = HKEY_USERS;
|
||||
subKey = keyPath + 11;
|
||||
} else if (strncmp(keyPath, "HKEY_LOCAL_MACHINE\\", 19) == 0) {
|
||||
hRootKey = HKEY_LOCAL_MACHINE;
|
||||
subKey = keyPath + 19;
|
||||
} else if (strncmp(keyPath, "HKEY_CURRENT_USER\\", 18) == 0) {
|
||||
hRootKey = HKEY_CURRENT_USER;
|
||||
subKey = keyPath + 18;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
||||
const char *placeHolder = strstr(subKey, "$VERSION");
|
||||
char bestName[256];
|
||||
bestName[0] = '\0';
|
||||
// If we have a $VERSION placeholder, do the highest-version search.
|
||||
if (placeHolder) {
|
||||
const char *keyEnd = placeHolder - 1;
|
||||
const char *nextKey = placeHolder;
|
||||
// Find end of previous key.
|
||||
while ((keyEnd > subKey) && (*keyEnd != '\\'))
|
||||
keyEnd--;
|
||||
// Find end of key containing $VERSION.
|
||||
while (*nextKey && (*nextKey != '\\'))
|
||||
nextKey++;
|
||||
size_t partialKeyLength = keyEnd - subKey;
|
||||
char partialKey[256];
|
||||
if (partialKeyLength > sizeof(partialKey))
|
||||
partialKeyLength = sizeof(partialKey);
|
||||
strncpy(partialKey, subKey, partialKeyLength);
|
||||
partialKey[partialKeyLength] = '\0';
|
||||
HKEY hTopKey = NULL;
|
||||
lResult = RegOpenKeyEx(hRootKey, partialKey, 0, KEY_READ, &hTopKey);
|
||||
if (lResult == ERROR_SUCCESS) {
|
||||
char keyName[256];
|
||||
int bestIndex = -1;
|
||||
double bestValue = 0.0;
|
||||
DWORD index, size = sizeof(keyName) - 1;
|
||||
for (index = 0; RegEnumKeyEx(hTopKey, index, keyName, &size, NULL,
|
||||
NULL, NULL, NULL) == ERROR_SUCCESS; index++) {
|
||||
const char *sp = keyName;
|
||||
while (*sp && !isdigit(*sp))
|
||||
sp++;
|
||||
if (!*sp)
|
||||
continue;
|
||||
const char *ep = sp + 1;
|
||||
while (*ep && (isdigit(*ep) || (*ep == '.')))
|
||||
ep++;
|
||||
char numBuf[32];
|
||||
strncpy(numBuf, sp, sizeof(numBuf) - 1);
|
||||
numBuf[sizeof(numBuf) - 1] = '\0';
|
||||
double value = strtod(numBuf, NULL);
|
||||
if (value > bestValue) {
|
||||
bestIndex = (int)index;
|
||||
bestValue = value;
|
||||
strcpy(bestName, keyName);
|
||||
}
|
||||
size = sizeof(keyName) - 1;
|
||||
}
|
||||
// If we found the highest versioned key, open the key and get the value.
|
||||
if (bestIndex != -1) {
|
||||
// Append rest of key.
|
||||
strncat(bestName, nextKey, sizeof(bestName) - 1);
|
||||
bestName[sizeof(bestName) - 1] = '\0';
|
||||
// Open the chosen key path remainder.
|
||||
lResult = RegOpenKeyEx(hTopKey, bestName, 0, KEY_READ, &hKey);
|
||||
if (lResult == ERROR_SUCCESS) {
|
||||
lResult = RegQueryValueEx(hKey, valueName, NULL, &valueType,
|
||||
(LPBYTE)value, &valueSize);
|
||||
if (lResult == ERROR_SUCCESS)
|
||||
returnValue = true;
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
||||
RegCloseKey(hTopKey);
|
||||
}
|
||||
}
|
||||
else {
|
||||
lResult = RegOpenKeyEx(hRootKey, subKey, 0, KEY_READ, &hKey);
|
||||
if (lResult == ERROR_SUCCESS) {
|
||||
lResult = RegQueryValueEx(hKey, valueName, NULL, &valueType,
|
||||
(LPBYTE)value, &valueSize);
|
||||
if (lResult == ERROR_SUCCESS)
|
||||
returnValue = true;
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
||||
return returnValue;
|
||||
}
|
||||
#else // _MSC_VER
|
||||
// Read registry string.
|
||||
static bool getSystemRegistryString(const char*, const char*, char*, size_t) {
|
||||
return(false);
|
||||
}
|
||||
#endif // _MSC_VER
|
||||
|
||||
// Get Visual Studio installation directory.
|
||||
static bool getVisualStudioDir(std::string &path) {
|
||||
// First check the environment variables that vsvars32.bat sets.
|
||||
const char* vcinstalldir = getenv("VCINSTALLDIR");
|
||||
if (vcinstalldir) {
|
||||
char *p = const_cast<char *>(strstr(vcinstalldir, "\\VC"));
|
||||
if (p)
|
||||
*p = '\0';
|
||||
path = vcinstalldir;
|
||||
return true;
|
||||
}
|
||||
|
||||
char vsIDEInstallDir[256];
|
||||
char vsExpressIDEInstallDir[256];
|
||||
// Then try the windows registry.
|
||||
bool hasVCDir = getSystemRegistryString(
|
||||
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\$VERSION",
|
||||
"InstallDir", vsIDEInstallDir, sizeof(vsIDEInstallDir) - 1);
|
||||
bool hasVCExpressDir = getSystemRegistryString(
|
||||
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VCExpress\\$VERSION",
|
||||
"InstallDir", vsExpressIDEInstallDir, sizeof(vsExpressIDEInstallDir) - 1);
|
||||
// If we have both vc80 and vc90, pick version we were compiled with.
|
||||
if (hasVCDir && vsIDEInstallDir[0]) {
|
||||
char *p = (char*)strstr(vsIDEInstallDir, "\\Common7\\IDE");
|
||||
if (p)
|
||||
*p = '\0';
|
||||
path = vsIDEInstallDir;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (hasVCExpressDir && vsExpressIDEInstallDir[0]) {
|
||||
char *p = (char*)strstr(vsExpressIDEInstallDir, "\\Common7\\IDE");
|
||||
if (p)
|
||||
*p = '\0';
|
||||
path = vsExpressIDEInstallDir;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Try the environment.
|
||||
const char *vs100comntools = getenv("VS100COMNTOOLS");
|
||||
const char *vs90comntools = getenv("VS90COMNTOOLS");
|
||||
const char *vs80comntools = getenv("VS80COMNTOOLS");
|
||||
const char *vscomntools = NULL;
|
||||
|
||||
// Try to find the version that we were compiled with
|
||||
if(false) {}
|
||||
#if (_MSC_VER >= 1600) // VC100
|
||||
else if(vs100comntools) {
|
||||
vscomntools = vs100comntools;
|
||||
}
|
||||
#elif (_MSC_VER == 1500) // VC80
|
||||
else if(vs90comntools) {
|
||||
vscomntools = vs90comntools;
|
||||
}
|
||||
#elif (_MSC_VER == 1400) // VC80
|
||||
else if(vs80comntools) {
|
||||
vscomntools = vs80comntools;
|
||||
}
|
||||
#endif
|
||||
// Otherwise find any version we can
|
||||
else if (vs100comntools)
|
||||
vscomntools = vs100comntools;
|
||||
else if (vs90comntools)
|
||||
vscomntools = vs90comntools;
|
||||
else if (vs80comntools)
|
||||
vscomntools = vs80comntools;
|
||||
|
||||
if (vscomntools && *vscomntools) {
|
||||
const char *p = strstr(vscomntools, "\\Common7\\Tools");
|
||||
path = p ? std::string(vscomntools, p) : vscomntools;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get Windows SDK installation directory.
|
||||
static bool getWindowsSDKDir(std::string &path) {
|
||||
char windowsSDKInstallDir[256];
|
||||
// Try the Windows registry.
|
||||
bool hasSDKDir = getSystemRegistryString(
|
||||
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\$VERSION",
|
||||
"InstallationFolder",
|
||||
windowsSDKInstallDir,
|
||||
sizeof(windowsSDKInstallDir) - 1);
|
||||
// If we have both vc80 and vc90, pick version we were compiled with.
|
||||
if (hasSDKDir && windowsSDKInstallDir[0]) {
|
||||
path = windowsSDKInstallDir;
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
|
||||
const HeaderSearchOptions &HSOpts) {
|
||||
llvm::Triple::OSType os = triple.getOS();
|
||||
@@ -464,33 +248,10 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
|
||||
}
|
||||
|
||||
switch (os) {
|
||||
case llvm::Triple::Win32: {
|
||||
std::string VSDir;
|
||||
std::string WindowsSDKDir;
|
||||
if (getVisualStudioDir(VSDir)) {
|
||||
AddPath(VSDir + "\\VC\\include", System, false, false, false);
|
||||
if (getWindowsSDKDir(WindowsSDKDir))
|
||||
AddPath(WindowsSDKDir + "\\include", System, false, false, false);
|
||||
else
|
||||
AddPath(VSDir + "\\VC\\PlatformSDK\\Include",
|
||||
System, false, false, false);
|
||||
} else {
|
||||
// Default install paths.
|
||||
AddPath("C:/Program Files/Microsoft Visual Studio 10.0/VC/include",
|
||||
System, false, false, false);
|
||||
AddPath("C:/Program Files/Microsoft Visual Studio 9.0/VC/include",
|
||||
System, false, false, false);
|
||||
AddPath(
|
||||
"C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include",
|
||||
System, false, false, false);
|
||||
AddPath("C:/Program Files/Microsoft Visual Studio 8/VC/include",
|
||||
System, false, false, false);
|
||||
AddPath(
|
||||
"C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include",
|
||||
System, false, false, false);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case llvm::Triple::Linux:
|
||||
case llvm::Triple::Win32:
|
||||
llvm_unreachable("Include management is handled in the driver.");
|
||||
|
||||
case llvm::Triple::Haiku:
|
||||
AddPath("/boot/common/include", System, true, false, false);
|
||||
AddPath("/boot/develop/headers/os", System, true, false, false);
|
||||
@@ -556,20 +317,6 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
|
||||
}
|
||||
break;
|
||||
|
||||
case llvm::Triple::Linux:
|
||||
// Generic Debian multiarch support:
|
||||
if (triple.getArch() == llvm::Triple::x86_64) {
|
||||
AddPath("/usr/include/x86_64-linux-gnu", System, false, false, false);
|
||||
AddPath("/usr/include/i686-linux-gnu/64", System, false, false, false);
|
||||
AddPath("/usr/include/i486-linux-gnu/64", System, false, false, false);
|
||||
} else if (triple.getArch() == llvm::Triple::x86) {
|
||||
AddPath("/usr/include/x86_64-linux-gnu/32", System, false, false, false);
|
||||
AddPath("/usr/include/i686-linux-gnu", System, false, false, false);
|
||||
AddPath("/usr/include/i486-linux-gnu", System, false, false, false);
|
||||
AddPath("/usr/include/i386-linux-gnu", System, false, false, false);
|
||||
} else if (triple.getArch() == llvm::Triple::arm) {
|
||||
AddPath("/usr/include/arm-linux-gnueabi", System, false, false, false);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -630,6 +377,10 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOp
|
||||
}
|
||||
|
||||
switch (os) {
|
||||
case llvm::Triple::Linux:
|
||||
case llvm::Triple::Win32:
|
||||
llvm_unreachable("Include management is handled in the driver.");
|
||||
|
||||
case llvm::Triple::Cygwin:
|
||||
// Cygwin-1.7
|
||||
AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "4.3.4");
|
||||
@@ -656,257 +407,6 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOp
|
||||
break;
|
||||
case llvm::Triple::DragonFly:
|
||||
AddPath("/usr/include/c++/4.1", CXXSystem, true, false, false);
|
||||
break;
|
||||
case llvm::Triple::Linux:
|
||||
//===------------------------------------------------------------------===//
|
||||
// Debian based distros.
|
||||
// Note: these distros symlink /usr/include/c++/X.Y.Z -> X.Y
|
||||
//===------------------------------------------------------------------===//
|
||||
|
||||
// Ubuntu 11.11 "Oneiric Ocelot" -- gcc-4.6.0
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
|
||||
"x86_64-linux-gnu", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
|
||||
"i686-linux-gnu", "", "64", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
|
||||
"i486-linux-gnu", "", "64", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
|
||||
"arm-linux-gnueabi", "", "", triple);
|
||||
|
||||
// Ubuntu 11.04 "Natty Narwhal" -- gcc-4.5.2
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
|
||||
"x86_64-linux-gnu", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
|
||||
"i686-linux-gnu", "", "64", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
|
||||
"i486-linux-gnu", "", "64", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
|
||||
"arm-linux-gnueabi", "", "", triple);
|
||||
|
||||
// Ubuntu 10.10 "Maverick Meerkat" -- gcc-4.4.5
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
|
||||
"i686-linux-gnu", "", "64", triple);
|
||||
// The rest of 10.10 is the same as previous versions.
|
||||
|
||||
// Ubuntu 10.04 LTS "Lucid Lynx" -- gcc-4.4.3
|
||||
// Ubuntu 9.10 "Karmic Koala" -- gcc-4.4.1
|
||||
// Debian 6.0 "squeeze" -- gcc-4.4.2
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
|
||||
"x86_64-linux-gnu", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
|
||||
"i486-linux-gnu", "", "64", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
|
||||
"arm-linux-gnueabi", "", "", triple);
|
||||
// Ubuntu 9.04 "Jaunty Jackalope" -- gcc-4.3.3
|
||||
// Ubuntu 8.10 "Intrepid Ibex" -- gcc-4.3.2
|
||||
// Debian 5.0 "lenny" -- gcc-4.3.2
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
|
||||
"x86_64-linux-gnu", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
|
||||
"i486-linux-gnu", "", "64", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
|
||||
"arm-linux-gnueabi", "", "", triple);
|
||||
// Ubuntu 8.04.4 LTS "Hardy Heron" -- gcc-4.2.4
|
||||
// Ubuntu 8.04.[0-3] LTS "Hardy Heron" -- gcc-4.2.3
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2",
|
||||
"x86_64-linux-gnu", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2",
|
||||
"i486-linux-gnu", "", "64", triple);
|
||||
// Ubuntu 7.10 "Gutsy Gibbon" -- gcc-4.1.3
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1",
|
||||
"x86_64-linux-gnu", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1",
|
||||
"i486-linux-gnu", "", "64", triple);
|
||||
|
||||
//===------------------------------------------------------------------===//
|
||||
// Redhat based distros.
|
||||
//===------------------------------------------------------------------===//
|
||||
// Fedora 15 (GCC 4.6.1)
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.1",
|
||||
"x86_64-redhat-linux", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.1",
|
||||
"i686-redhat-linux", "", "", triple);
|
||||
// Fedora 15 (GCC 4.6.0)
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.0",
|
||||
"x86_64-redhat-linux", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.0",
|
||||
"i686-redhat-linux", "", "", triple);
|
||||
// Fedora 14
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.1",
|
||||
"x86_64-redhat-linux", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.1",
|
||||
"i686-redhat-linux", "", "", triple);
|
||||
// RHEL5(gcc44)
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.4",
|
||||
"x86_64-redhat-linux6E", "32", "", triple);
|
||||
// Fedora 13
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.4",
|
||||
"x86_64-redhat-linux", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.4",
|
||||
"i686-redhat-linux","", "", triple);
|
||||
// Fedora 12
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.3",
|
||||
"x86_64-redhat-linux", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.3",
|
||||
"i686-redhat-linux","", "", triple);
|
||||
// Fedora 12 (pre-FEB-2010)
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.2",
|
||||
"x86_64-redhat-linux", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.2",
|
||||
"i686-redhat-linux","", "", triple);
|
||||
// Fedora 11
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.1",
|
||||
"x86_64-redhat-linux", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.1",
|
||||
"i586-redhat-linux","", "", triple);
|
||||
// Fedora 10
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.2",
|
||||
"x86_64-redhat-linux", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.2",
|
||||
"i386-redhat-linux","", "", triple);
|
||||
// Fedora 9
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.0",
|
||||
"x86_64-redhat-linux", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.0",
|
||||
"i386-redhat-linux", "", "", triple);
|
||||
// Fedora 8
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.2",
|
||||
"x86_64-redhat-linux", "", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.2",
|
||||
"i386-redhat-linux", "", "", triple);
|
||||
|
||||
// RHEL 5
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.1",
|
||||
"x86_64-redhat-linux", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.1",
|
||||
"i386-redhat-linux", "", "", triple);
|
||||
|
||||
|
||||
//===------------------------------------------------------------------===//
|
||||
|
||||
// Exherbo (2010-01-25)
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.3",
|
||||
"x86_64-pc-linux-gnu", "32", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.3",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
|
||||
// openSUSE 11.1 32 bit
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
|
||||
"i586-suse-linux", "", "", triple);
|
||||
// openSUSE 11.1 64 bit
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
|
||||
"x86_64-suse-linux", "32", "", triple);
|
||||
// openSUSE 11.2
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
|
||||
"i586-suse-linux", "", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
|
||||
"x86_64-suse-linux", "", "", triple);
|
||||
|
||||
// openSUSE 11.4
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
|
||||
"i586-suse-linux", "", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
|
||||
"x86_64-suse-linux", "", "", triple);
|
||||
|
||||
// openSUSE 12.1
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
|
||||
"i586-suse-linux", "", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
|
||||
"x86_64-suse-linux", "", "", triple);
|
||||
// Arch Linux 2008-06-24
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1",
|
||||
"x86_64-unknown-linux-gnu", "", "", triple);
|
||||
|
||||
// Arch Linux gcc 4.6
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.1",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.1",
|
||||
"x86_64-unknown-linux-gnu", "", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.0",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.0",
|
||||
"x86_64-unknown-linux-gnu", "", "", triple);
|
||||
|
||||
// Slackware gcc 4.5.2 (13.37)
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.2",
|
||||
"i486-slackware-linux", "", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.2",
|
||||
"x86_64-slackware-linux", "", "", triple);
|
||||
// Slackware gcc 4.5.3 (-current)
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.3",
|
||||
"i486-slackware-linux", "", "", triple);
|
||||
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.3",
|
||||
"x86_64-slackware-linux", "", "", triple);
|
||||
|
||||
// Gentoo x86 gcc 4.5.2
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/i686-pc-linux-gnu/4.5.2/include/g++-v4",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
// Gentoo x86 gcc 4.4.5
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/i686-pc-linux-gnu/4.4.5/include/g++-v4",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
// Gentoo x86 gcc 4.4.4
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/i686-pc-linux-gnu/4.4.4/include/g++-v4",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
// Gentoo x86 2010.0 stable
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/i686-pc-linux-gnu/4.4.3/include/g++-v4",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
// Gentoo x86 2009.1 stable
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
// Gentoo x86 2009.0 stable
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
// Gentoo x86 2008.0 stable
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
// Gentoo x86 llvm-gcc trunk
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/llvm-gcc-4.2-9999/include/c++/4.2.1",
|
||||
"i686-pc-linux-gnu", "", "", triple);
|
||||
|
||||
// Gentoo amd64 gcc 4.5.2
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.2/include/g++-v4",
|
||||
"x86_64-pc-linux-gnu", "32", "", triple);
|
||||
// Gentoo amd64 gcc 4.4.5
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.5/include/g++-v4",
|
||||
"x86_64-pc-linux-gnu", "32", "", triple);
|
||||
// Gentoo amd64 gcc 4.4.4
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4",
|
||||
"x86_64-pc-linux-gnu", "32", "", triple);
|
||||
// Gentoo amd64 gcc 4.4.3
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/include/g++-v4",
|
||||
"x86_64-pc-linux-gnu", "32", "", triple);
|
||||
// Gentoo amd64 gcc 4.3.4
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4",
|
||||
"x86_64-pc-linux-gnu", "", "", triple);
|
||||
// Gentoo amd64 gcc 4.3.2
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.2/include/g++-v4",
|
||||
"x86_64-pc-linux-gnu", "", "", triple);
|
||||
// Gentoo amd64 stable
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/include/g++-v4",
|
||||
"x86_64-pc-linux-gnu", "", "", triple);
|
||||
|
||||
// Gentoo amd64 llvm-gcc trunk
|
||||
AddGnuCPlusPlusIncludePaths(
|
||||
"/usr/lib/llvm-gcc-4.2-9999/include/c++/4.2.1",
|
||||
"x86_64-pc-linux-gnu", "", "", triple);
|
||||
|
||||
break;
|
||||
case llvm::Triple::FreeBSD:
|
||||
// FreeBSD 8.0
|
||||
@@ -943,6 +443,19 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOp
|
||||
void InitHeaderSearch::AddDefaultIncludePaths(const LangOptions &Lang,
|
||||
const llvm::Triple &triple,
|
||||
const HeaderSearchOptions &HSOpts) {
|
||||
// NB: This code path is going away. All of the logic is moving into the
|
||||
// driver which has the information necessary to do target-specific
|
||||
// selections of default include paths. Each target which moves there will be
|
||||
// exempted from this logic here until we can delete the entire pile of code.
|
||||
switch (triple.getOS()) {
|
||||
default:
|
||||
break; // Everything else continues to use this routine's logic.
|
||||
|
||||
case llvm::Triple::Linux:
|
||||
case llvm::Triple::Win32:
|
||||
return;
|
||||
}
|
||||
|
||||
if (Lang.CPlusPlus && HSOpts.UseStandardCXXIncludes &&
|
||||
HSOpts.UseStandardSystemIncludes) {
|
||||
if (HSOpts.UseLibcxx) {
|
||||
@@ -1145,8 +658,8 @@ void clang::ApplyHeaderSearchOptions(HeaderSearch &HS,
|
||||
// Add the user defined entries.
|
||||
for (unsigned i = 0, e = HSOpts.UserEntries.size(); i != e; ++i) {
|
||||
const HeaderSearchOptions::Entry &E = HSOpts.UserEntries[i];
|
||||
Init.AddPath(E.Path, E.Group, false, E.IsUserSupplied, E.IsFramework,
|
||||
E.IgnoreSysRoot);
|
||||
Init.AddPath(E.Path, E.Group, !E.ImplicitExternC, E.IsUserSupplied,
|
||||
E.IsFramework, E.IgnoreSysRoot);
|
||||
}
|
||||
|
||||
Init.AddDefaultIncludePaths(Lang, Triple, HSOpts);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.cplusplus.Iterators -verify %s
|
||||
// RUN: %clang --analyze -Xclang -analyzer-checker=core,experimental.cplusplus.Iterators -Xclang -verify %s
|
||||
// XFAIL: win32
|
||||
|
||||
#include <vector>
|
||||
|
||||
@@ -170,7 +170,7 @@ void test_strcat() {
|
||||
//===----------------------------------------------------------------------===
|
||||
typedef int __int32_t;
|
||||
typedef __int32_t pid_t;
|
||||
pid_t vfork(void); //expected-warning{{declaration of built-in function 'vfork' requires inclusion of the header <setjmp.h>}}
|
||||
pid_t vfork(void);
|
||||
|
||||
void test_vfork() {
|
||||
vfork(); //expected-warning{{Call to function 'vfork' is insecure as it can lead to denial of service situations in the parent process.}}
|
||||
|
||||
@@ -137,3 +137,11 @@
|
||||
// CHECK-GCC-VERSION3: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
|
||||
// CHECK-GCC-VERSION3: "{{.*}}/Inputs/gcc_version_parsing3/bin/../lib/gcc/i386-unknown-linux/4.7.99-rc5/crtbegin.o"
|
||||
// CHECK-GCC-VERSION3: "-L{{.*}}/Inputs/gcc_version_parsing3/bin/../lib/gcc/i386-unknown-linux/4.7.99-rc5"
|
||||
// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
|
||||
// RUN: -ccc-host-triple i386-unknown-linux -m32 \
|
||||
// RUN: -ccc-install-dir %S/Inputs/gcc_version_parsing4/bin \
|
||||
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
|
||||
// RUN: | FileCheck --check-prefix=CHECK-GCC-VERSION4 %s
|
||||
// CHECK-GCC-VERSION4: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
|
||||
// CHECK-GCC-VERSION4: "{{.*}}/Inputs/gcc_version_parsing4/bin/../lib/gcc/i386-unknown-linux/4.7.99/crtbegin.o"
|
||||
// CHECK-GCC-VERSION4: "-L{{.*}}/Inputs/gcc_version_parsing4/bin/../lib/gcc/i386-unknown-linux/4.7.99"
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// RUN: %clang_cc1 -emit-pch -o %t -relocatable-pch -isysroot %S/libroot %S/libroot/usr/include/reloc.h
|
||||
// RUN: %clang_cc1 -include-pch %t -isysroot %S/libroot %s -verify
|
||||
// RUN: not %clang_cc1 -include-pch %t %s
|
||||
// RUN: %clang -ccc-host-triple x86_64-apple-darwin10 --relocatable-pch -o %t \
|
||||
// RUN: -isysroot %S/libroot %S/libroot/usr/include/reloc.h
|
||||
// RUN: %clang -ccc-host-triple x86_64-apple-darwin10 -fsyntax-only \
|
||||
// RUN: -include-pch %t -isysroot %S/libroot %s -Xclang -verify
|
||||
// RUN: not %clang -ccc-host-triple x86_64-apple-darwin10 -include-pch %t %s
|
||||
|
||||
#include <reloc.h>
|
||||
|
||||
@@ -8,7 +10,5 @@ int x = 2; // expected-error{{redefinition}}
|
||||
int y = 5; // expected-error{{redefinition}}
|
||||
|
||||
|
||||
|
||||
|
||||
// expected-note{{previous definition}}
|
||||
// expected-note{{previous definition}}
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
// RUN: %clang -fno-ms-extensions %s -E | grep 'stddef.h.*3.*4'
|
||||
// RUN: %clang -fno-ms-extensions %s -E | grep 'stddef.h.*3'
|
||||
#include <stddef.h>
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
import os
|
||||
import platform
|
||||
import re
|
||||
import subprocess
|
||||
|
||||
|
||||
# Configuration file for the 'lit' test runner.
|
||||
|
||||
@@ -141,7 +144,23 @@ if lit.useValgrind:
|
||||
config.clang = inferClang(config.environment['PATH']).replace('\\', '/')
|
||||
if not lit.quiet:
|
||||
lit.note('using clang: %r' % config.clang)
|
||||
config.substitutions.append( ('%clang_cc1', config.clang + ' -cc1') )
|
||||
|
||||
# Note that when substituting %clang_cc1 also fill in the include directory of
|
||||
# the builtin headers. Those are part of even a freestanding environment, but
|
||||
# Clang relies on the driver to locate them.
|
||||
def getClangBuiltinIncludeDir(clang):
|
||||
# FIXME: Rather than just getting the version, we should have clang print
|
||||
# out its resource dir here in an easy to scrape form.
|
||||
cmd = subprocess.Popen([clang, '-print-file-name=include'],
|
||||
stdout=subprocess.PIPE)
|
||||
if not cmd.stdout:
|
||||
lit.fatal("Couldn't find the include dir for Clang ('%s')" % clang)
|
||||
return cmd.stdout.read().strip()
|
||||
|
||||
config.substitutions.append( ('%clang_cc1', '%s -cc1 -internal-isystem %s'
|
||||
% (config.clang,
|
||||
getClangBuiltinIncludeDir(config.clang))) )
|
||||
|
||||
config.substitutions.append( ('%clangxx', ' ' + config.clang +
|
||||
' -ccc-clang-cxx -ccc-cxx '))
|
||||
config.substitutions.append( ('%clang', ' ' + config.clang + ' ') )
|
||||
@@ -175,10 +194,6 @@ if platform.system() not in ['Windows'] or lit.getBashPath() != '':
|
||||
config.available_features.add('shell')
|
||||
|
||||
# Registered Targets
|
||||
import subprocess
|
||||
import re
|
||||
import os
|
||||
|
||||
def getRegisteredTargets(tool):
|
||||
set_of_targets = set()
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>LLVM Alias Analysis Infrastructure</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>LLVM Branch Weight Metadata</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>LLVM bugpoint tool: design and usage</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>Building LLVM with CMake</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -1813,6 +1813,8 @@ $ llc -regalloc=pbqp file.bc -o pbqp.s;
|
||||
<a name="proepicode">Prolog/Epilog Code Insertion</a>
|
||||
</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<!-- _______________________________________________________________________ -->
|
||||
<h4>
|
||||
<a name="compact_unwind">Compact Unwind</a>
|
||||
@@ -1927,6 +1929,8 @@ $ llc -regalloc=pbqp file.bc -o pbqp.s;
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- ======================================================================= -->
|
||||
<h3>
|
||||
<a name="latemco">Late Machine Code Optimizations</a>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
<title>LLVM Coding Standards</title>
|
||||
</head>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>Debugging JITed Code With GDB</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>Extending LLVM: Adding instructions, intrinsics, types, etc.</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -746,7 +746,7 @@ idx3 = (char*) &MyVar + 8
|
||||
src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
|
||||
<a href="http://validator.w3.org/check/referer"><img
|
||||
src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>
|
||||
<a href="http://llvm.org/">The LLVM Compiler Infrastructure</a><br/>
|
||||
<a href="http://llvm.org/">The LLVM Compiler Infrastructure</a><br>
|
||||
Last modified: $Date$
|
||||
</address>
|
||||
</body>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>LLVM gold plugin</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>How To Release LLVM To The Public</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>How to submit an LLVM bug report</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -1898,9 +1898,6 @@ in signal handlers).</p>
|
||||
possible to have a two dimensional array, using an array as the element type
|
||||
of another array.</p>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!-- _______________________________________________________________________ -->
|
||||
<h4>
|
||||
<a name="t_aggregate">Aggregate Types</a>
|
||||
@@ -2208,6 +2205,8 @@ in signal handlers).</p>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- *********************************************************************** -->
|
||||
<h2><a name="constants">Constants</a></h2>
|
||||
<!-- *********************************************************************** -->
|
||||
@@ -6304,8 +6303,6 @@ declare void @llvm.va_end(i8*)
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- ======================================================================= -->
|
||||
<h3>
|
||||
<a name="int_gc">Accurate Garbage Collection Intrinsics</a>
|
||||
@@ -7001,8 +6998,6 @@ LLVM</a>.</p>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- _______________________________________________________________________ -->
|
||||
<h4>
|
||||
<a name="int_exp">'<tt>llvm.exp.*</tt>' Intrinsic</a>
|
||||
@@ -7067,6 +7062,9 @@ LLVM</a>.</p>
|
||||
<p>This function returns the same values as the libm <tt>log</tt> functions
|
||||
would, and handles error conditions in the same way.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- _______________________________________________________________________ -->
|
||||
<h4>
|
||||
<a name="int_fma">'<tt>llvm.fma.*</tt>' Intrinsic</a>
|
||||
</h4>
|
||||
@@ -7100,6 +7098,8 @@ LLVM</a>.</p>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- ======================================================================= -->
|
||||
<h3>
|
||||
<a name="int_manip">Bit Manipulation Intrinsics</a>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>LLVM Link Time Optimization: Design and Implementation</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>Advice on Packaging LLVM</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -226,11 +226,8 @@ perl -e '$/ = undef; for (split(/\n/, <>)) { s:^ *///? ?::; print " <p>\n" if !
|
||||
<a name="basicaa">-basicaa: Basic Alias Analysis (stateless AA impl)</a>
|
||||
</h3>
|
||||
<div>
|
||||
<p>
|
||||
This is the default implementation of the Alias Analysis interface
|
||||
that simply implements a few identities (two different globals cannot alias,
|
||||
etc), but otherwise does no analysis.
|
||||
</p>
|
||||
<p>A basic alias analysis pass that implements identities (two different
|
||||
globals cannot alias, etc), but does no stateful analysis.</p>
|
||||
</div>
|
||||
|
||||
<!-------------------------------------------------------------------------- -->
|
||||
@@ -527,9 +524,10 @@ perl -e '$/ = undef; for (split(/\n/, <>)) { s:^ *///? ?::; print " <p>\n" if !
|
||||
</h3>
|
||||
<div>
|
||||
<p>
|
||||
Always returns "I don't know" for alias queries. NoAA is unlike other alias
|
||||
analysis implementations, in that it does not chain to a previous analysis. As
|
||||
such it doesn't follow many of the rules that other alias analyses must.
|
||||
This is the default implementation of the Alias Analysis interface. It always
|
||||
returns "I don't know" for alias queries. NoAA is unlike other alias analysis
|
||||
implementations, in that it does not chain to a previous analysis. As such it
|
||||
doesn't follow many of the rules that other alias analyses must.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -879,9 +879,6 @@ elements (but could contain many), for example, it's much better to use
|
||||
. Doing so avoids (relatively) expensive malloc/free calls, which dwarf the
|
||||
cost of adding the elements to the container. </p>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!-- ======================================================================= -->
|
||||
<h3>
|
||||
<a name="ds_sequential">Sequential Containers (std::vector, std::list, etc)</a>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>Creating an LLVM Project</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>System Library</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>TableGen Fundamentals</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>LLVM Testing Infrastructure Guide</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>Using The LLVM Libraries</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>Using The LLVM Libraries</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>Documentation for the LLVM System at SVN head</title>
|
||||
<link rel="stylesheet" href="llvm.css" type="text/css">
|
||||
</head>
|
||||
|
||||
@@ -1016,6 +1016,27 @@ std::string CppWriter::getOpName(const Value* V) {
|
||||
return result;
|
||||
}
|
||||
|
||||
static StringRef ConvertAtomicOrdering(AtomicOrdering Ordering) {
|
||||
switch (Ordering) {
|
||||
case NotAtomic: return "NotAtomic";
|
||||
case Unordered: return "Unordered";
|
||||
case Monotonic: return "Monotonic";
|
||||
case Acquire: return "Acquire";
|
||||
case Release: return "Release";
|
||||
case AcquireRelease: return "AcquireRelease";
|
||||
case SequentiallyConsistent: return "SequentiallyConsistent";
|
||||
}
|
||||
llvm_unreachable("Unknown ordering");
|
||||
}
|
||||
|
||||
static StringRef ConvertAtomicSynchScope(SynchronizationScope SynchScope) {
|
||||
switch (SynchScope) {
|
||||
case SingleThread: return "SingleThread";
|
||||
case CrossThread: return "CrossThread";
|
||||
}
|
||||
llvm_unreachable("Unknown synch scope");
|
||||
}
|
||||
|
||||
// printInstruction - This member is called for each Instruction in a function.
|
||||
void CppWriter::printInstruction(const Instruction *I,
|
||||
const std::string& bbname) {
|
||||
@@ -1237,15 +1258,33 @@ void CppWriter::printInstruction(const Instruction *I,
|
||||
printEscapedString(load->getName());
|
||||
Out << "\", " << (load->isVolatile() ? "true" : "false" )
|
||||
<< ", " << bbname << ");";
|
||||
if (load->getAlignment())
|
||||
nl(Out) << iName << "->setAlignment("
|
||||
<< load->getAlignment() << ");";
|
||||
if (load->isAtomic()) {
|
||||
StringRef Ordering = ConvertAtomicOrdering(load->getOrdering());
|
||||
StringRef CrossThread = ConvertAtomicSynchScope(load->getSynchScope());
|
||||
nl(Out) << iName << "->setAtomic("
|
||||
<< Ordering << ", " << CrossThread << ");";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Instruction::Store: {
|
||||
const StoreInst* store = cast<StoreInst>(I);
|
||||
Out << " new StoreInst("
|
||||
Out << "StoreInst* " << iName << " = new StoreInst("
|
||||
<< opNames[0] << ", "
|
||||
<< opNames[1] << ", "
|
||||
<< (store->isVolatile() ? "true" : "false")
|
||||
<< ", " << bbname << ");";
|
||||
if (store->getAlignment())
|
||||
nl(Out) << iName << "->setAlignment("
|
||||
<< store->getAlignment() << ");";
|
||||
if (store->isAtomic()) {
|
||||
StringRef Ordering = ConvertAtomicOrdering(store->getOrdering());
|
||||
StringRef CrossThread = ConvertAtomicSynchScope(store->getSynchScope());
|
||||
nl(Out) << iName << "->setAtomic("
|
||||
<< Ordering << ", " << CrossThread << ");";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Instruction::GetElementPtr: {
|
||||
@@ -1447,6 +1486,60 @@ void CppWriter::printInstruction(const Instruction *I,
|
||||
Out << "\", " << bbname << ");";
|
||||
break;
|
||||
}
|
||||
case Instruction::Fence: {
|
||||
const FenceInst *fi = cast<FenceInst>(I);
|
||||
StringRef Ordering = ConvertAtomicOrdering(fi->getOrdering());
|
||||
StringRef CrossThread = ConvertAtomicSynchScope(fi->getSynchScope());
|
||||
Out << "FenceInst* " << iName
|
||||
<< " = new FenceInst(mod->getContext(), "
|
||||
<< Ordering << ", " << CrossThread << ", " << bbname
|
||||
<< ");";
|
||||
break;
|
||||
}
|
||||
case Instruction::AtomicCmpXchg: {
|
||||
const AtomicCmpXchgInst *cxi = cast<AtomicCmpXchgInst>(I);
|
||||
StringRef Ordering = ConvertAtomicOrdering(cxi->getOrdering());
|
||||
StringRef CrossThread = ConvertAtomicSynchScope(cxi->getSynchScope());
|
||||
Out << "AtomicCmpXchgInst* " << iName
|
||||
<< " = new AtomicCmpXchgInst("
|
||||
<< opNames[0] << ", " << opNames[1] << ", " << opNames[2] << ", "
|
||||
<< Ordering << ", " << CrossThread << ", " << bbname
|
||||
<< ");";
|
||||
nl(Out) << iName << "->setName(\"";
|
||||
printEscapedString(cxi->getName());
|
||||
Out << "\");";
|
||||
break;
|
||||
}
|
||||
case Instruction::AtomicRMW: {
|
||||
const AtomicRMWInst *rmwi = cast<AtomicRMWInst>(I);
|
||||
StringRef Ordering = ConvertAtomicOrdering(rmwi->getOrdering());
|
||||
StringRef CrossThread = ConvertAtomicSynchScope(rmwi->getSynchScope());
|
||||
StringRef Operation;
|
||||
switch (rmwi->getOperation()) {
|
||||
case AtomicRMWInst::Xchg: Operation = "AtomicRMWInst::Xchg"; break;
|
||||
case AtomicRMWInst::Add: Operation = "AtomicRMWInst::Add"; break;
|
||||
case AtomicRMWInst::Sub: Operation = "AtomicRMWInst::Sub"; break;
|
||||
case AtomicRMWInst::And: Operation = "AtomicRMWInst::And"; break;
|
||||
case AtomicRMWInst::Nand: Operation = "AtomicRMWInst::Nand"; break;
|
||||
case AtomicRMWInst::Or: Operation = "AtomicRMWInst::Or"; break;
|
||||
case AtomicRMWInst::Xor: Operation = "AtomicRMWInst::Xor"; break;
|
||||
case AtomicRMWInst::Max: Operation = "AtomicRMWInst::Max"; break;
|
||||
case AtomicRMWInst::Min: Operation = "AtomicRMWInst::Min"; break;
|
||||
case AtomicRMWInst::UMax: Operation = "AtomicRMWInst::UMax"; break;
|
||||
case AtomicRMWInst::UMin: Operation = "AtomicRMWInst::UMin"; break;
|
||||
case AtomicRMWInst::BAD_BINOP: llvm_unreachable("Bad atomic operation");
|
||||
}
|
||||
Out << "AtomicRMWInst* " << iName
|
||||
<< " = new AtomicRMWInst("
|
||||
<< Operation << ", "
|
||||
<< opNames[0] << ", " << opNames[1] << ", "
|
||||
<< Ordering << ", " << CrossThread << ", " << bbname
|
||||
<< ");";
|
||||
nl(Out) << iName << "->setName(\"";
|
||||
printEscapedString(rmwi->getName());
|
||||
Out << "\");";
|
||||
break;
|
||||
}
|
||||
}
|
||||
DefinedValues.insert(I);
|
||||
nl(Out);
|
||||
@@ -1623,7 +1716,9 @@ void CppWriter::printFunctionBody(const Function *F) {
|
||||
Out << "Value* " << getCppName(AI) << " = args++;";
|
||||
nl(Out);
|
||||
if (AI->hasName()) {
|
||||
Out << getCppName(AI) << "->setName(\"" << AI->getName() << "\");";
|
||||
Out << getCppName(AI) << "->setName(\"";
|
||||
printEscapedString(AI->getName());
|
||||
Out << "\");";
|
||||
nl(Out);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user