Updated to version 3.9.0

Most of the work was done in
https://abf.io/import/llvm/pull_requests/2

I have reworked clang-mandriva.patch to keeps it (as clang-rosa.patch).
It seems, it did not actually detect ROSA in the past (it checked that
/etc/lsb-release has DISTRIB_ID=Mandriva<...> while we have "Rosa<...>"
there). However, it could be useful to align the default Clang flags
with Ubuntu, Fedora and such.
This commit is contained in:
Evgenii Shatokhin 2016-09-11 17:18:35 +03:00
parent 047b84f741
commit 9b14190aa4
9 changed files with 127 additions and 1852 deletions

View file

@ -1,6 +1,6 @@
sources:
cfe-3.8.0.src.tar.xz: 2230ef962f2df3c13ec93f5b04b0e3cdff94b2ce
clang-tools-extra-3.8.0.src.tar.xz: a99d8b6fc5e593c4671424b327779318a1856acf
compiler-rt-3.8.0.src.tar.xz: 480ea09e369dac6de1f3759b27fa19417b26b69e
llvm-3.8.0.src.tar.xz: 723ac918979255706434a05f5af34b71c49c9971
polly-3.8.0.src.tar.xz: 8db242fbc4a33eacf08e11fad033b2a90c652ac9
cfe-3.9.0.src.tar.xz: 00d49ee82451130a8e1e7b1d56cffa37b783bcb2
clang-tools-extra-3.9.0.src.tar.xz: 396ad1af7a8d3cff015a644e595f35553a7548c4
compiler-rt-3.9.0.src.tar.xz: a306d576e84b7ee048ebb0ae5ca72e6ec9e1c549
llvm-3.9.0.src.tar.xz: da792f11a208d5b994c4fe1c8faa20f90ff0e4a3
polly-3.9.0.src.tar.xz: 9d5809bd413b05de18480b69fcf6dbe8d3b1f9ac

View file

@ -1,216 +0,0 @@
--- clang/lib/Driver/ToolChains.cpp.mandriva~ 2016-01-13 00:47:59.000000000 +0100
+++ clang/lib/Driver/ToolChains.cpp 2016-01-26 11:16:44.273579956 +0100
@@ -1418,16 +1418,46 @@ bool Generic_GCC::GCCInstallationDetecto
static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
static const char *const AArch64Triples[] = {
"aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
- "aarch64-redhat-linux"};
- static const char *const AArch64beLibDirs[] = {"/lib"};
- static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
- "aarch64_be-linux-gnu"};
+ "aarch64-redhat-linux", "aarch64-mandriva-linux-gnu",
+ "aarch64-openmandriva-linux-gnu", "aarch64-openmandriva-linux-musl"};
+ static const char *const AArch64beLibDirs[] = {"/lib64", "/lib"};
+ static const char *const AArch64beTriples[] = {
+ "aarch64_be-none-linux-gnu", "aarch64_be-linux-gnu",
+ "aarch64_be-linux-android", "aarch64_be-mandriva-linux-gnu",
+ "aarch64_be-openmandriva-linux-gnu", "aarch64_be-openmandriva-linux-musl"
+ };
static const char *const ARMLibDirs[] = {"/lib"};
static const char *const ARMTriples[] = {"arm-linux-gnueabi",
- "arm-linux-androideabi"};
- static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
- "armv7hl-redhat-linux-gnueabi"};
+ "arm-linux-androideabi",
+ "arm-mandriva-linux-gnueabi",
+ "arm-openmandriva-linux-gnueabi",
+ "arm-openmandriva-linux-musl",
+ "arm-openmandriva-linux-musleabi",
+ "armv6-mandriva-linux-gnueabi",
+ "armv6-openmandriva-linux-gnueabi",
+ "armv7-mandriva-linux-gnueabi",
+ "armv7-openmandriva-linux-gnueabi",
+ "armv7-openmandriva-linux-musleabi"};
+ static const char *const ARMHFTriples[] = {
+ "arm-linux-gnueabihf",
+ "armv7hl-redhat-linux-gnueabi",
+ "arm-mandriva-linux-gnueabihf",
+ "arm-openmandriva-linux-gnueabihf",
+ "arm-openmandriva-linux-musleabihf",
+ "armv7hl-openmandriva-linux-gnueabi",
+ "armv7hl-openmandriva-linux-gnueabihf",
+ "armv7hnl-openmandriva-linux-gnueabi",
+ "armv7hnl-openmandriva-linux-musleabi",
+ "armv7nl-openmandriva-linux-gnueabihf",
+ "armv7nl-openmandriva-linux-musleabihf",
+ "armv6hl-openmandriva-linux-gnueabi",
+ "armv6hl-openmandriva-linux-gnueabihf",
+ "armv6hnl-openmandriva-linux-gnueabi",
+ "armv6hnl-openmandriva-linux-musleabi",
+ "armv6nl-openmandriva-linux-gnueabihf",
+ "armv6nl-openmandriva-linux-musleabihf"
+ };
static const char *const ARMebLibDirs[] = {"/lib"};
static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
"armeb-linux-androideabi"};
@@ -1441,7 +1471,9 @@ bool Generic_GCC::GCCInstallationDetecto
"x86_64-redhat-linux", "x86_64-suse-linux",
"x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
"x86_64-slackware-linux", "x86_64-linux-android",
- "x86_64-unknown-linux"};
+ "x86_64-unknown-linux", "x86_64-mandriva-linux-gnu",
+ "x86_64-openmandriva-linux-gnu",
+ "x86_64-openmandriva-linux-musl"};
static const char *const X32LibDirs[] = {"/libx32"};
static const char *const X86LibDirs[] = {"/lib32", "/lib"};
static const char *const X86Triples[] = {
@@ -1449,7 +1481,15 @@ bool Generic_GCC::GCCInstallationDetecto
"i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
"i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
"i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
- "i586-linux-gnu"};
+ "i586-linux-gnu", "i586-mandriva-linux", "i586-mandriva-linux-gnu",
+ "i686-mandriva-linux", "i686-mandriva-linux-gnu",
+ "i586-openmandriva-linux",
+ "i586-openmandriva-linux-gnu",
+ "i586-openmandriva-linux-musl",
+ "i686-openmandriva-linux",
+ "i686-openmandriva-linux-gnu",
+ "i686-openmandriva-linux-musl"
+ };
static const char *const MIPSLibDirs[] = {"/lib"};
static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
@@ -1471,11 +1511,12 @@ bool Generic_GCC::GCCInstallationDetecto
static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
static const char *const PPCTriples[] = {
"powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
- "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
+ "powerpc-suse-linux", "powerpc-montavista-linuxspe",
+ "powerpc-mandriva-linux-gnu"};
static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
static const char *const PPC64Triples[] = {
"powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
- "powerpc64-suse-linux", "ppc64-redhat-linux"};
+ "powerpc64-suse-linux", "ppc64-redhat-linux", "powerpc64-mandriva-linux"};
static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
static const char *const PPC64LETriples[] = {
"powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
@@ -3386,6 +3427,9 @@ enum Distro {
UbuntuVivid,
UbuntuWily,
UbuntuXenial,
+ Mandriva,
+ OpenMandriva,
+ ROSA,
UnknownDistro
};
@@ -3403,6 +3447,10 @@ static bool IsUbuntu(enum Distro Distro)
return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
}
+static bool IsMandriva(enum Distro Distro) {
+ return Distro >= Mandriva && Distro < UnknownDistro;
+}
+
static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
llvm::MemoryBuffer::getFile("/etc/lsb-release");
@@ -3411,7 +3459,17 @@ static Distro DetectDistro(const Driver
SmallVector<StringRef, 16> Lines;
Data.split(Lines, "\n");
Distro Version = UnknownDistro;
- for (StringRef Line : Lines)
+ for (StringRef Line : Lines) {
+ if (Version == UnknownDistro && Line.startswith("DISTRIB_ID=MandrivaLinux"))
+ // It's either Mandriva or a close derivate, will get details
+ // from DISTRIB_DESCRIPTION
+ Version = Mandriva;
+ if (Version == Mandriva && Line.startswith("DISTRIB_DESCRIPTION=")) {
+ if(Line.substr(20).find("ROSA") != StringRef::npos)
+ Version = ROSA;
+ else if(Line.substr(20).find("Open") != StringRef::npos)
+ Version = OpenMandriva;
+ }
if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
Version = llvm::StringSwitch<Distro>(Line.substr(17))
.Case("hardy", UbuntuHardy)
@@ -3432,6 +3490,7 @@ static Distro DetectDistro(const Driver
.Case("wily", UbuntuWily)
.Case("xenial", UbuntuXenial)
.Default(UnknownDistro);
+ }
return Version;
}
@@ -3592,7 +3651,7 @@ static std::string getMultiarchTriple(co
return TargetTriple.str();
}
-static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
+static StringRef getOSLibDir(const enum Distro &Distro, const llvm::Triple &Triple, const ArgList &Args) {
if (isMipsArch(Triple.getArch())) {
// lib32 directory has a special meaning on MIPS targets.
// It contains N32 ABI binaries. Use this folder if produce
@@ -3608,11 +3667,15 @@ static StringRef getOSLibDir(const llvm:
// with a 'lib32' library search path being considered. So we only enable
// them when we know we may need it.
//
+ // Also, lib32 is highly distro-specific -- OpenMandriva for one doesn't
+ // use lib32 (64 bit libs go to lib64, 32 bit libs go to lib)
+ //
// FIXME: This is a bit of a hack. We should really unify this code for
// reasoning about oslibdir spellings with the lib dir spellings in the
// GCCInstallationDetector, but that is a more significant refactoring.
- if (Triple.getArch() == llvm::Triple::x86 ||
- Triple.getArch() == llvm::Triple::ppc)
+ if (!IsMandriva(Distro) &&
+ (Triple.getArch() == llvm::Triple::x86 ||
+ Triple.getArch() == llvm::Triple::ppc))
return "lib32";
if (Triple.getArch() == llvm::Triple::x86_64 &&
@@ -3645,7 +3708,7 @@ Linux::Linux(const Driver &D, const llvm
Distro Distro = DetectDistro(D, Arch);
- if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
+ if (IsOpenSUSE(Distro) || IsUbuntu(Distro) || IsMandriva(Distro)) {
ExtraOpts.push_back("-z");
ExtraOpts.push_back("relro");
}
@@ -3665,7 +3728,7 @@ Linux::Linux(const Driver &D, const llvm
// ABI requires a mapping between the GOT and the symbol table.
// Android loader does not support .gnu.hash.
if (!IsMips && !IsAndroid) {
- if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
+ if (IsRedhat(Distro) || IsOpenSUSE(Distro) || IsMandriva(Distro) ||
(IsUbuntu(Distro) && Distro >= UbuntuMaverick))
ExtraOpts.push_back("--hash-style=gnu");
@@ -3677,12 +3740,12 @@ Linux::Linux(const Driver &D, const llvm
if (IsRedhat(Distro))
ExtraOpts.push_back("--no-add-needed");
- if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
+ if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) || IsMandriva(Distro) ||
(IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
(IsUbuntu(Distro) && Distro >= UbuntuKarmic))
ExtraOpts.push_back("--build-id");
- if (IsOpenSUSE(Distro))
+ if (IsOpenSUSE(Distro) || IsMandriva(Distro))
ExtraOpts.push_back("--enable-new-dtags");
// The selection of paths to try here is designed to match the patterns which
@@ -3692,7 +3755,7 @@ Linux::Linux(const Driver &D, const llvm
// to the link paths.
path_list &Paths = getFilePaths();
- const std::string OSLibDir = getOSLibDir(Triple, Args);
+ const std::string OSLibDir = getOSLibDir(Distro, Triple, Args);
const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
// Add the multilib suffixed paths where they are available.

View file

@ -1,314 +0,0 @@
diff -Naur cfe-3.8.0.src.orig/docs/ItaniumMangleAbiTags.rst cfe-3.8.0.src/docs/ItaniumMangleAbiTags.rst
--- cfe-3.8.0.src.orig/docs/ItaniumMangleAbiTags.rst 1970-01-01 03:00:00.000000000 +0300
+++ cfe-3.8.0.src/docs/ItaniumMangleAbiTags.rst 2016-05-15 00:37:17.721321969 +0300
@@ -0,0 +1,101 @@
+========
+ABI tags
+========
+
+Introduction
+============
+
+This text tries to describe gcc semantic for mangling "abi_tag" attributes
+described in https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
+
+There is no guarantee the following rules are correct, complete or make sense
+in any way as they were determined empirically by experiments with gcc5.
+
+Declaration
+===========
+
+ABI tags are declared in an abi_tag attribute and can be applied to a
+function, variable, class or inline namespace declaration. The attribute takes
+one or more strings (called tags); the order does not matter.
+
+See https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html for
+details.
+
+Tags on an inline namespace are called "implicit tags", all other tags are
+"explicit tags".
+
+Mangling
+========
+
+All tags that are "active" on an <unqualified-name> are emitted after the
+<unqualified-name>, before <template-args> or <discriminator>, and are part of
+the same <substitution> the <unqualified-name> is.
+
+They are mangled as:
+
+ <abi-tags> ::= <abi-tag>* # sort by name
+ <abi-tag> ::= B <tag source-name>
+
+Example:
+
+ __attribute__((abi_tag("test")))
+ void Func();
+
+ gets mangled as: _Z4FuncB4testv (prettified as `Func[abi:test]()`)
+
+Active tags
+===========
+
+A namespace does not have any active tags. For types (class / struct / union /
+enum), the explicit tags are the active tags.
+
+For variables and functions, the active tags are the explicit tags plus any
+"required tags" which are not in the "available tags" set:
+
+ derived-tags := (required-tags - available-tags)
+ active-tags := explicit-tags + derived-tags
+
+Required tags for a function
+============================
+
+If a function is used as a local scope for another name, and is part of
+another function as local scope, it doesn't have any required tags.
+
+If a function is used as a local scope for a guard variable name, it doesn't
+have any required tags.
+
+Otherwise the function requires any implicit or explicit tag used in the name
+for the return type.
+
+Example:
+ namespace A {
+ inline namespace B __attribute__((abi_tag)) {
+ struct C { int x; };
+ }
+ }
+
+ A::C foo();
+
+ gets mangled as: _Z3fooB1Bv (prettified as `foo[abi:B]()`)
+
+Required tags for a variable
+============================
+
+A variable requires any implicit or explicit tag used in its type.
+
+Available tags
+==============
+
+All tags used in the prefix and in the template arguments for a name are
+available. Also, for functions, all tags from the <bare-function-type>
+(which might include the return type for template functions) are available.
+
+For <local-name>s all active tags used in the local part (<function-
+encoding>) are available, but not implicit tags which were not active.
+
+Implicit and explicit tags used in the <unqualified-name> for a function (as
+in the type of a cast operator) are NOT available.
+
+Example: a cast operator to std::string (which is
+std::__cxx11::basic_string<...>) will use 'cxx11' as an active tag, as it is
+required from the return type `std::string` but not available.
diff -Naur cfe-3.8.0.src.orig/include/clang/Basic/AttrDocs.td cfe-3.8.0.src/include/clang/Basic/AttrDocs.td
--- cfe-3.8.0.src.orig/include/clang/Basic/AttrDocs.td 2015-12-03 00:58:08.000000000 +0300
+++ cfe-3.8.0.src/include/clang/Basic/AttrDocs.td 2016-05-15 00:37:17.722321974 +0300
@@ -1859,3 +1859,16 @@
}];
}
+
+def AbiTagsDocs : Documentation {
+ let Content = [{
+The ``abi_tag`` attribute can be applied to a function, variable, class or
+inline namespace declaration to modify the mangled name of the entity. It gives
+the ability to distinguish between different versions of the same entity but
+with different ABI versions supported. For example, a newer version of a class
+could have a different set of data members and thus have a different size. Using
+the ``abi_tag`` attribute, it is possible to have different mangled names for
+a global variable of the class type. Therefor, the old code could keep using
+the old manged name and the new code will use the new mangled name with tags.
+ }];
+}
diff -Naur cfe-3.8.0.src.orig/include/clang/Basic/Attr.td cfe-3.8.0.src/include/clang/Basic/Attr.td
--- cfe-3.8.0.src.orig/include/clang/Basic/Attr.td 2015-12-03 00:58:08.000000000 +0300
+++ cfe-3.8.0.src/include/clang/Basic/Attr.td 2016-05-15 00:37:17.721321969 +0300
@@ -349,6 +349,14 @@
// Attributes begin here
//
+def AbiTag : Attr {
+ let Spellings = [GCC<"abi_tag">];
+ let Args = [VariadicStringArgument<"Tags">];
+ let Subjects = SubjectList<[Struct, Var, Function, Namespace], ErrorDiag,
+ "ExpectedStructClassVariableFunctionOrInlineNamespace">;
+ let Documentation = [AbiTagsDocs];
+}
+
def AddressSpace : TypeAttr {
let Spellings = [GNU<"address_space">];
let Args = [IntArgument<"AddressSpace">];
diff -Naur cfe-3.8.0.src.orig/include/clang/Basic/DiagnosticSemaKinds.td cfe-3.8.0.src/include/clang/Basic/DiagnosticSemaKinds.td
--- cfe-3.8.0.src.orig/include/clang/Basic/DiagnosticSemaKinds.td 2016-01-09 15:53:17.000000000 +0300
+++ cfe-3.8.0.src/include/clang/Basic/DiagnosticSemaKinds.td 2016-05-15 00:37:17.725321992 +0300
@@ -2434,7 +2434,8 @@
"Objective-C instance methods|init methods of interface or class extension declarations|"
"variables, functions and classes|Objective-C protocols|"
"functions and global variables|structs, unions, and typedefs|structs and typedefs|"
- "interface or protocol declarations|kernel functions|non-K&R-style functions}1">,
+ "interface or protocol declarations|kernel functions|non-K&R-style functions|"
+ "structs, classes, variables, functions, and inline namespaces}1">,
InGroup<IgnoredAttributes>;
def err_attribute_wrong_decl_type : Error<warn_attribute_wrong_decl_type.Text>;
def warn_type_attribute_wrong_type : Warning<
@@ -4144,6 +4145,13 @@
def err_redefinition_extern_inline : Error<
"redefinition of a 'extern inline' function %0 is not supported in "
"%select{C99 mode|C++}1">;
+def warn_attr_abi_tag_namespace : Warning<
+ "'abi_tag' attribute on %select{non-inline|anonymous}0 namespace ignored">,
+ InGroup<IgnoredAttributes>;
+def err_abi_tag_on_redeclaration : Error<
+ "cannot add 'abi_tag' attribute in a redeclaration">;
+def err_new_abi_tag_on_redeclaration : Error<
+ "'abi_tag' %0 missing in original declaration">;
def note_deleted_dtor_no_operator_delete : Note<
"virtual destructor requires an unambiguous, accessible 'operator delete'">;
diff -Naur cfe-3.8.0.src.orig/include/clang/Sema/AttributeList.h cfe-3.8.0.src/include/clang/Sema/AttributeList.h
--- cfe-3.8.0.src.orig/include/clang/Sema/AttributeList.h 2015-12-02 20:07:30.000000000 +0300
+++ cfe-3.8.0.src/include/clang/Sema/AttributeList.h 2016-05-15 00:37:17.726321998 +0300
@@ -855,7 +855,8 @@
ExpectedStructOrTypedef,
ExpectedObjectiveCInterfaceOrProtocol,
ExpectedKernelFunction,
- ExpectedFunctionWithProtoType
+ ExpectedFunctionWithProtoType,
+ ExpectedStructClassVariableFunctionOrInlineNamespace
};
} // end namespace clang
diff -Naur cfe-3.8.0.src.orig/lib/Sema/SemaDeclAttr.cpp cfe-3.8.0.src/lib/Sema/SemaDeclAttr.cpp
--- cfe-3.8.0.src.orig/lib/Sema/SemaDeclAttr.cpp 2016-01-13 04:07:35.000000000 +0300
+++ cfe-3.8.0.src/lib/Sema/SemaDeclAttr.cpp 2016-05-15 00:37:17.732322032 +0300
@@ -4446,6 +4446,42 @@
Attr.getRange(), S.Context, Attr.getAttributeSpellingListIndex()));
}
+static void handleAbiTagAttr(Sema &S, Decl *D, const AttributeList &Attr) {
+ SmallVector<std::string, 4> Tags;
+ for (unsigned I = 0, E = Attr.getNumArgs(); I != E; ++I) {
+ StringRef Tag;
+ if (!S.checkStringLiteralArgumentAttr(Attr, I, Tag))
+ return;
+ Tags.push_back(Tag);
+ }
+
+ if (const auto *NS = dyn_cast<NamespaceDecl>(D)) {
+ if (!NS->isInline()) {
+ S.Diag(Attr.getLoc(), diag::warn_attr_abi_tag_namespace) << 0;
+ return;
+ }
+ if (NS->isAnonymousNamespace()) {
+ S.Diag(Attr.getLoc(), diag::warn_attr_abi_tag_namespace) << 1;
+ return;
+ }
+ if (Attr.getNumArgs() == 0)
+ Tags.push_back(NS->getName());
+ } else if (!checkAttributeAtLeastNumArgs(S, Attr, 1))
+ return;
+
+ // Store tags sorted and without duplicates.
+ std::sort(Tags.begin(), Tags.end());
+ Tags.erase(std::unique(Tags.begin(), Tags.end()), Tags.end());
+
+ D->addAttr(::new (S.Context)
+ AbiTagAttr(Attr.getRange(), S.Context, Tags.data(), Tags.size(),
+ Attr.getAttributeSpellingListIndex()));
+
+ // FIXME: remove this warning as soon as mangled part is ready.
+ S.Diag(Attr.getRange().getBegin(), diag::warn_attribute_ignored)
+ << Attr.getName();
+}
+
static void handleARMInterruptAttr(Sema &S, Decl *D,
const AttributeList &Attr) {
// Check the attribute arguments.
@@ -5360,6 +5396,9 @@
case AttributeList::AT_Thread:
handleDeclspecThreadAttr(S, D, Attr);
break;
+ case AttributeList::AT_AbiTag:
+ handleAbiTagAttr(S, D, Attr);
+ break;
// Thread safety attributes:
case AttributeList::AT_AssertExclusiveLock:
diff -Naur cfe-3.8.0.src.orig/lib/Sema/SemaDecl.cpp cfe-3.8.0.src/lib/Sema/SemaDecl.cpp
--- cfe-3.8.0.src.orig/lib/Sema/SemaDecl.cpp 2016-01-12 01:41:53.000000000 +0300
+++ cfe-3.8.0.src/lib/Sema/SemaDecl.cpp 2016-05-15 00:37:17.730322021 +0300
@@ -2396,6 +2396,24 @@
}
}
+ // Re-declaration cannot add abi_tag's.
+ if (const auto *NewAbiTagAttr = New->getAttr<AbiTagAttr>()) {
+ if (const auto *OldAbiTagAttr = Old->getAttr<AbiTagAttr>()) {
+ for (const auto &NewTag : NewAbiTagAttr->tags()) {
+ if (std::find(OldAbiTagAttr->tags_begin(), OldAbiTagAttr->tags_end(),
+ NewTag) == OldAbiTagAttr->tags_end()) {
+ Diag(NewAbiTagAttr->getLocation(),
+ diag::err_new_abi_tag_on_redeclaration)
+ << NewTag;
+ Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
+ }
+ }
+ } else {
+ Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
+ Diag(Old->getLocation(), diag::note_previous_declaration);
+ }
+ }
+
if (!Old->hasAttrs())
return;
diff -Naur cfe-3.8.0.src.orig/test/SemaCXX/attr-abi-tag-syntax.cpp cfe-3.8.0.src/test/SemaCXX/attr-abi-tag-syntax.cpp
--- cfe-3.8.0.src.orig/test/SemaCXX/attr-abi-tag-syntax.cpp 1970-01-01 03:00:00.000000000 +0300
+++ cfe-3.8.0.src/test/SemaCXX/attr-abi-tag-syntax.cpp 2016-05-15 00:37:17.733322038 +0300
@@ -0,0 +1,43 @@
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
+
+namespace N1 {
+
+namespace __attribute__((__abi_tag__)) {}
+// expected-warning@-1 {{'abi_tag' attribute on non-inline namespace ignored}}
+
+namespace N __attribute__((__abi_tag__)) {}
+// expected-warning@-1 {{'abi_tag' attribute on non-inline namespace ignored}}
+
+} // namespace N1
+
+namespace N2 {
+
+inline namespace __attribute__((__abi_tag__)) {}
+// expected-warning@-1 {{'abi_tag' attribute on anonymous namespace ignored}}
+
+inline namespace N __attribute__((__abi_tag__)) {}
+// FIXME: remove this warning as soon as attribute fully supported.
+// expected-warning@-2 {{'__abi_tag__' attribute ignored}}
+
+} // namespcace N2
+
+__attribute__((abi_tag("B", "A"))) extern int a1;
+// FIXME: remove this warning as soon as attribute fully supported.
+// expected-warning@-2 {{'abi_tag' attribute ignored}}
+
+__attribute__((abi_tag("A", "B"))) extern int a1;
+// expected-note@-1 {{previous declaration is here}}
+// FIXME: remove this warning as soon as attribute fully supported.
+// expected-warning@-3 {{'abi_tag' attribute ignored}}
+
+__attribute__((abi_tag("A", "C"))) extern int a1;
+// expected-error@-1 {{'abi_tag' C missing in original declaration}}
+// FIXME: remove this warning as soon as attribute fully supported.
+// expected-warning@-3 {{'abi_tag' attribute ignored}}
+
+extern int a2;
+// expected-note@-1 {{previous declaration is here}}
+__attribute__((abi_tag("A")))extern int a2;
+// expected-error@-1 {{cannot add 'abi_tag' attribute in a redeclaration}}
+// FIXME: remove this warning as soon as attribute fully supported.
+// expected-warning@-3 {{'abi_tag' attribute ignored}}

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
--- llvm-3.5/tools/clang/lib/Driver/Driver.cpp.gcc49~ 2014-08-22 22:54:39.000000000 +0200
+++ llvm-3.5/tools/clang/lib/Driver/Driver.cpp 2014-08-25 22:24:57.688608644 +0200
@@ -683,7 +683,7 @@ bool Driver::HandleImmediateArgs(const C
@@ -910,7 +910,7 @@
// If we want to return a more correct answer some day, then we should
// introduce a non-pedantically GCC compatible mode to Clang in which we
// provide sensible definitions for -dumpversion, __VERSION__, etc.
@ -9,9 +9,10 @@
return false;
}
--- llvm-3.5/tools/clang/lib/Frontend/InitPreprocessor.cpp.gcc49~ 2014-08-22 22:54:39.000000000 +0200
+++ llvm-3.5/tools/clang/lib/Frontend/InitPreprocessor.cpp 2014-08-25 22:24:57.689608632 +0200
@@ -462,9 +462,9 @@ static void InitializePredefinedMacros(c
@@ -522,9 +522,9 @@
#undef TOSTR
#undef TOSTR2
if (!LangOpts.MSVCCompat) {
@ -23,7 +24,7 @@
Builder.defineMacro("__GNUC_PATCHLEVEL__", "1");
Builder.defineMacro("__GNUC__", "4");
Builder.defineMacro("__GXX_ABI_VERSION", "1002");
@@ -482,9 +482,9 @@ static void InitializePredefinedMacros(c
@@ -542,9 +542,9 @@
Builder.defineMacro("__PRAGMA_REDEFINE_EXTNAME", "1");
// As sad as it is, enough software depends on the __VERSION__ for version
@ -35,6 +36,7 @@
Twine(getClangFullCPPVersion()) + "\"");
// Initialize language-specific preprocessor defines.
--- llvm-3.5/tools/clang/test/Driver/immediate-options.c.gcc49~ 2014-08-22 22:54:39.000000000 +0200
+++ llvm-3.5/tools/clang/test/Driver/immediate-options.c 2014-08-25 22:24:57.690608619 +0200
@@ -7,7 +7,7 @@
@ -46,14 +48,15 @@
// RUN: %clang -print-search-dirs | FileCheck %s -check-prefix=PRINT-SEARCH-DIRS
// PRINT-SEARCH-DIRS: programs: ={{.*}}
--- llvm-3.5/tools/clang/test/Preprocessor/init.c.gcc49~ 2014-08-25 22:24:57.691608607 +0200
+++ llvm-3.5/tools/clang/test/Preprocessor/init.c 2014-08-25 22:25:27.754232772 +0200
@@ -5851,7 +5851,7 @@
@@ -7025,7 +7025,7 @@
// SPARC:#define __UINT_LEAST8_MAX__ 255
// SPARC:#define __UINT_LEAST8_TYPE__ unsigned char
// SPARC:#define __USER_LABEL_PREFIX__ _
-// SPARC:#define __VERSION__ "4.2.1 Compatible
+// SPARC:#define __VERSION__ "4.9.1 Compatible
// SPARC:#define __USER_LABEL_PREFIX__
-// SPARC:#define __VERSION__ "4.2.1 Compatible{{.*}}
+// SPARC:#define __VERSION__ "4.9.1 Compatible{{.*}}
// SPARC:#define __WCHAR_MAX__ 2147483647
// SPARC:#define __WCHAR_TYPE__ int
// SPARC:#define __WCHAR_WIDTH__ 32

95
clang-rosa.patch Normal file
View file

@ -0,0 +1,95 @@
diff -Naur cfe-3.9.0.src.orig/lib/Driver/ToolChains.cpp cfe-3.9.0.src/lib/Driver/ToolChains.cpp
--- cfe-3.9.0.src.orig/lib/Driver/ToolChains.cpp 2016-08-18 20:56:48.000000000 +0300
+++ cfe-3.9.0.src/lib/Driver/ToolChains.cpp 2016-09-11 16:47:44.240732535 +0300
@@ -3744,6 +3744,7 @@
UbuntuVivid,
UbuntuWily,
UbuntuXenial,
+ ROSA,
UnknownDistro
};
@@ -3761,6 +3762,10 @@
return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
}
+static bool IsROSA(enum Distro Distro) {
+ return Distro == ROSA;
+}
+
static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
llvm::MemoryBuffer::getFile("/etc/lsb-release");
@@ -3769,7 +3774,10 @@
SmallVector<StringRef, 16> Lines;
Data.split(Lines, "\n");
Distro Version = UnknownDistro;
- for (StringRef Line : Lines)
+ for (StringRef Line : Lines) {
+ if (Version == UnknownDistro && Line.startswith("DISTRIB_ID=Rosa"))
+ Version = ROSA;
+ }
if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
Version = llvm::StringSwitch<Distro>(Line.substr(17))
.Case("hardy", UbuntuHardy)
@@ -3790,6 +3798,7 @@
.Case("wily", UbuntuWily)
.Case("xenial", UbuntuXenial)
.Default(UnknownDistro);
+ }
if (Version != UnknownDistro)
return Version;
}
@@ -3950,7 +3959,7 @@
return TargetTriple.str();
}
-static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
+static StringRef getOSLibDir(const enum Distro &Distro, const llvm::Triple &Triple, const ArgList &Args) {
if (isMipsArch(Triple.getArch())) {
// lib32 directory has a special meaning on MIPS targets.
// It contains N32 ABI binaries. Use this folder if produce
@@ -3966,11 +3975,14 @@
// with a 'lib32' library search path being considered. So we only enable
// them when we know we may need it.
//
+ // ROSA does not use lib32: 64-bit libs go to lib64, 32- bit libs go to lib).
+ //
// FIXME: This is a bit of a hack. We should really unify this code for
// reasoning about oslibdir spellings with the lib dir spellings in the
// GCCInstallationDetector, but that is a more significant refactoring.
- if (Triple.getArch() == llvm::Triple::x86 ||
- Triple.getArch() == llvm::Triple::ppc)
+ if (!IsROSA(Distro) &&
+ (Triple.getArch() == llvm::Triple::x86 ||
+ Triple.getArch() == llvm::Triple::ppc))
return "lib32";
if (Triple.getArch() == llvm::Triple::x86_64 &&
@@ -4012,7 +4024,7 @@
Distro Distro = DetectDistro(D, Arch);
- if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
+ if (IsOpenSUSE(Distro) || IsUbuntu(Distro) || IsROSA(Distro)) {
ExtraOpts.push_back("-z");
ExtraOpts.push_back("relro");
}
@@ -4032,7 +4044,7 @@
// ABI requires a mapping between the GOT and the symbol table.
// Android loader does not support .gnu.hash.
if (!IsMips && !IsAndroid) {
- if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
+ if (IsRedhat(Distro) || IsOpenSUSE(Distro) || IsROSA(Distro) ||
(IsUbuntu(Distro) && Distro >= UbuntuMaverick))
ExtraOpts.push_back("--hash-style=gnu");
@@ -4058,7 +4070,7 @@
// to the link paths.
path_list &Paths = getFilePaths();
- const std::string OSLibDir = getOSLibDir(Triple, Args);
+ const std::string OSLibDir = getOSLibDir(Distro, Triple, Args);
const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
// Add the multilib suffixed paths where they are available.

View file

@ -1,11 +0,0 @@
--- tools/libclang/Makefile.soname~ 2014-08-25 22:21:51.899931322 +0200
+++ tools/libclang/Makefile 2014-08-25 22:22:40.725320921 +0200
@@ -34,7 +34,7 @@ include $(CLANG_LEVEL)/Makefile
# Add soname to the library.
ifeq ($(HOST_OS), $(filter $(HOST_OS), Linux FreeBSD GNU GNU/kFreeBSD))
- LLVMLibsOptions += -Wl,-soname,lib$(LIBRARYNAME)$(SHLIBEXT)
+ LLVMLibsOptions += -Wl,-soname,lib$(LIBRARYNAME)-$(LLVMVersion)$(SHLIBEXT)
endif
ifeq ($(ENABLE_CLANG_ARCMT),1)

View file

@ -11,43 +11,31 @@
%bcond_without clang
%define major_ver 3.8
%define major_ver 3.9
%define minor_ver 0
Summary: Low Level Virtual Machine (LLVM)
Name: llvm
Version: %{major_ver}.%{minor_ver}
Release: 2
Release: 1
License: NCSA
Group: Development/Other
Url: http://llvm.org/
# There's a branch of LLVM maintained at
# git://people.freedesktop.org/~tstellar/llvm
# Ir is the working branch of the AMDGPU/R600 backend needed by Mesa (and is otherwise
# more or less identical to upstream llvm).
# At times it may be necessary to package this branch instead.
Source0: http://llvm.org/releases/%{version}/llvm-%{version}.src.tar.xz
Source1: http://llvm.org/releases/%{version}/cfe-%{version}.src.tar.xz
Source2: http://llvm.org/releases/%{version}/clang-tools-extra-%{version}.src.tar.xz
Source3: http://llvm.org/releases/%{version}/polly-%{version}.src.tar.xz
Source4: http://llvm.org/releases/%{version}/compiler-rt-%{version}.src.tar.xz
Source1000: llvm.rpmlintrc
# Versionize libclang.so (Anssi 08/2012):
Patch0: clang-soname.patch
# Adjust search paths to match the OS
Patch1: 0000-clang-mandriva.patch
# Adjust the search paths to match the OS, adjust the default compiler flags
# as well.
Patch1: clang-rosa.patch
# Claim compatibility with gcc 4.9.1 rather than 4.2.1, it's
# much much closer in terms of standards supported etc.
Patch7: clang-gcc-compat.patch
# https://llvm.org/bugs/show_bug.cgi?id=23529
# These variants of the patches are similar to what ArchLinux uses.
Patch100: D17567-PR23529-Sema-part-of-attrbute-abi_tag-support.patch
Patch101: D18035-PR23529-Mangler-part-of-attrbute-abi_tag-support.patch
# Upstream fix for llvm.org/PR27305
Patch102: polly-Fix-Always-honor-LLVM_LIBDIR_SUFFIX.patch
BuildRequires: cmake
BuildRequires: bison
@ -118,6 +106,8 @@ for effective implementation, proper tail calls or garbage collection.
%{_bindir}/verify-uselistorder
%{_bindir}/obj2yaml
%{_bindir}/yaml2obj
%{_bindir}/find-all-symbols
%{_bindir}/sanstats
#----------------------------------------------------------------------------
@ -177,10 +167,10 @@ This package contains the development files for LLVM.
%{_bindir}/%{name}-config
%{_libdir}/libLLVM.so
%{_libdir}/libLLVM*.a
%{_libdir}/libfindAllSymbols.a
%{_libdir}/cmake/%{name}/*
%{_includedir}/%{name}
%{_includedir}/%{name}-c
%dir %{_datadir}/%{name}
%{_datadir}/%{name}/cmake
#----------------------------------------------------------------------------
@ -286,6 +276,8 @@ as libraries and designed to be loosely-coupled and extensible.
%{_libdir}/clang/
%{_datadir}/clang/clang-tidy-diff.py
%{_datadir}/clang/run-clang-tidy.py
%{_datadir}/clang/clang-include-fixer.py
%{_datadir}/clang/run-find-all-symbols.py
%endif
#----------------------------------------------------------------------------
@ -330,8 +322,10 @@ libclang.
%{_includedir}/clang-c
%{_libdir}/libclang.so
%{_libdir}/libclang*.a
%{_libdir}/cmake/clang/ClangConfig.cmake
%{_libdir}/cmake/clang/ClangTargets-relwithdebinfo.cmake
%{_libdir}/cmake/clang/ClangTargets.cmake
%dir %{_datadir}/clang/
%{_datadir}/clang/cmake/
%endif
#----------------------------------------------------------------------------
@ -373,17 +367,11 @@ mv polly-%{version}.src tools/polly
mv clang-tools-extra-%{version}.src tools/clang/tools/extra
mv compiler-rt-%{version}.src projects/compiler-rt
cd tools/clang
%patch0 -p0 -b .soname~
%patch1 -p1 -b .mandriva~
%patch1 -p1 -b .rosa~
cd -
%endif
%patch7 -p1 -b .gcc49~
%patch100 -d tools/clang -p1
%patch101 -d tools/clang -p0
%patch102 -d tools/polly -p1
%build
# Build with gcc/g++, not clang if it happens to be installed

View file

@ -1,33 +0,0 @@
From 76ce9e227be304bcacb94360e2f9a8a8bc81c27a Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm@meinersbur.de>
Date: Sat, 9 Apr 2016 14:09:08 +0000
Subject: [PATCH] Fix: Always honor LLVM_LIBDIR_SUFFIX.
Static libraries where installed into "lib${LLVM_LIBDIR_SUFFIX}" while
shared ones into "lib". I found no justification for this behaviour.
This patch changes both types of libraries to be install into
"lib${LLVM_LIBDIR_SUFFIX}". LLVM and clang use the same behaviour.
This fixes llvm.org/PR27305.
git-svn-id: https://llvm.org/svn/llvm-project/polly/trunk@265872 91177308-0d34-0410-b5e6-96231b3b80d8
---
cmake/polly_macros.cmake | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cmake/polly_macros.cmake b/cmake/polly_macros.cmake
index 26a3374..3ceeaec 100644
--- a/cmake/polly_macros.cmake
+++ b/cmake/polly_macros.cmake
@@ -45,7 +45,7 @@ macro(add_polly_library name)
endif( LLVM_LINK_COMPONENTS )
install(TARGETS ${name}
EXPORT LLVMExports
- LIBRARY DESTINATION lib
+ LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
endmacro(add_polly_library)
--
2.7.3