[llvm] r301697 - [IR] Make add/remove Attributes use AttrBuilder instead of AttributeList
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 28 15:29:15 PDT 2017
I think this broke the clang build.
~Craig
On Fri, Apr 28, 2017 at 2:48 PM, Reid Kleckner via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: rnk
> Date: Fri Apr 28 16:48:28 2017
> New Revision: 301697
>
> URL: http://llvm.org/viewvc/llvm-project?rev=301697&view=rev
> Log:
> [IR] Make add/remove Attributes use AttrBuilder instead of AttributeList
>
> This change cleans up call sites and avoids creating temporary
> AttributeList objects.
>
> NFC
>
> Modified:
> llvm/trunk/include/llvm/CodeGen/CommandFlags.h
> llvm/trunk/include/llvm/IR/Attributes.h
> llvm/trunk/include/llvm/IR/Function.h
> llvm/trunk/lib/CodeGen/GlobalISel/CallLowering.cpp
> llvm/trunk/lib/IR/Attributes.cpp
> llvm/trunk/lib/IR/Function.cpp
> llvm/trunk/lib/Target/Mips/Mips16HardFloat.cpp
> llvm/trunk/lib/Transforms/Coroutines/CoroSplit.cpp
> llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
> llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp
> llvm/trunk/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
> llvm/trunk/unittests/IR/AttributesTest.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/CommandFlags.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/CodeGen/CommandFlags.h?rev=301697&r1=301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/CodeGen/CommandFlags.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/CommandFlags.h Fri Apr 28 16:48:28
> 2017
> @@ -346,29 +346,21 @@ static inline void setFunctionAttributes
> Module &M) {
> for (auto &F : M) {
> auto &Ctx = F.getContext();
> - AttributeList Attrs = F.getAttributes(), NewAttrs;
> + AttributeList Attrs = F.getAttributes();
> + AttrBuilder NewAttrs;
>
> if (!CPU.empty())
> - NewAttrs = NewAttrs.addAttribute(Ctx, AttributeList::FunctionIndex,
> - "target-cpu", CPU);
> -
> + NewAttrs.addAttribute("target-cpu", CPU);
> if (!Features.empty())
> - NewAttrs = NewAttrs.addAttribute(Ctx, AttributeList::FunctionIndex,
> - "target-features", Features);
> -
> + NewAttrs.addAttribute("target-features", Features);
> if (DisableFPElim.getNumOccurrences() > 0)
> - NewAttrs = NewAttrs.addAttribute(Ctx, AttributeList::FunctionIndex,
> - "no-frame-pointer-elim",
> - DisableFPElim ? "true" : "false");
> -
> + NewAttrs.addAttribute("no-frame-pointer-elim",
> + DisableFPElim ? "true" : "false");
> if (DisableTailCalls.getNumOccurrences() > 0)
> - NewAttrs = NewAttrs.addAttribute(Ctx, AttributeList::FunctionIndex,
> - "disable-tail-calls",
> - toStringRef(DisableTailCalls));
> -
> + NewAttrs.addAttribute("disable-tail-calls",
> + toStringRef(DisableTailCalls));
> if (StackRealign)
> - NewAttrs = NewAttrs.addAttribute(Ctx, AttributeList::FunctionIndex,
> - "stackrealign");
> + NewAttrs.addAttribute("stackrealign");
>
> if (TrapFuncName.getNumOccurrences() > 0)
> for (auto &B : F)
> @@ -382,8 +374,8 @@ static inline void setFunctionAttributes
> Attribute::get(Ctx, "trap-func-name", TrapFuncName));
>
> // Let NewAttrs override Attrs.
> - NewAttrs = Attrs.addAttributes(Ctx, AttributeList::FunctionIndex,
> NewAttrs);
> - F.setAttributes(NewAttrs);
> + F.setAttributes(
> + Attrs.addAttributes(Ctx, AttributeList::FunctionIndex, NewAttrs));
> }
> }
>
>
> Modified: llvm/trunk/include/llvm/IR/Attributes.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/IR/Attributes.h?rev=301697&r1=301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/IR/Attributes.h (original)
> +++ llvm/trunk/include/llvm/IR/Attributes.h Fri Apr 28 16:48:28 2017
> @@ -354,9 +354,6 @@ public:
> /// \brief Add attributes to the attribute set at the given index.
> Because
> /// attribute sets are immutable, this returns a new set.
> AttributeList addAttributes(LLVMContext &C, unsigned Index,
> - AttributeList Attrs) const;
> -
> - AttributeList addAttributes(LLVMContext &C, unsigned Index,
> const AttrBuilder &B) const;
>
> /// \brief Remove the specified attribute at the specified index from
> this
> @@ -375,13 +372,7 @@ public:
> /// attribute list. Because attribute lists are immutable, this returns
> the
> /// new list.
> AttributeList removeAttributes(LLVMContext &C, unsigned Index,
> - AttributeList Attrs) const;
> -
> - /// \brief Remove the specified attributes at the specified index from
> this
> - /// attribute list. Because attribute lists are immutable, this returns
> the
> - /// new list.
> - AttributeList removeAttributes(LLVMContext &C, unsigned Index,
> - const AttrBuilder &Attrs) const;
> + const AttrBuilder &AttrsToRemove) const;
>
> /// \brief Remove all attributes at the specified index from this
> /// attribute list. Because attribute lists are immutable, this returns
> the
>
> Modified: llvm/trunk/include/llvm/IR/Function.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/IR/Function.h?rev=301697&r1=301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/IR/Function.h (original)
> +++ llvm/trunk/include/llvm/IR/Function.h Fri Apr 28 16:48:28 2017
> @@ -279,7 +279,7 @@ public:
> void addAttribute(unsigned i, Attribute Attr);
>
> /// @brief adds the attributes to the list of attributes.
> - void addAttributes(unsigned i, AttributeList Attrs);
> + void addAttributes(unsigned i, const AttrBuilder &Attrs);
>
> /// @brief removes the attribute from the list of attributes.
> void removeAttribute(unsigned i, Attribute::AttrKind Kind);
> @@ -288,7 +288,7 @@ public:
> void removeAttribute(unsigned i, StringRef Kind);
>
> /// @brief removes the attributes from the list of attributes.
> - void removeAttributes(unsigned i, AttributeList Attrs);
> + void removeAttributes(unsigned i, const AttrBuilder &Attrs);
>
> /// @brief check if an attributes is in the list of attributes.
> bool hasAttribute(unsigned i, Attribute::AttrKind Kind) const {
>
> Modified: llvm/trunk/lib/CodeGen/GlobalISel/CallLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> CodeGen/GlobalISel/CallLowering.cpp?rev=301697&
> r1=301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/CodeGen/GlobalISel/CallLowering.cpp (original)
> +++ llvm/trunk/lib/CodeGen/GlobalISel/CallLowering.cpp Fri Apr 28
> 16:48:28 2017
> @@ -83,8 +83,8 @@ void CallLowering::setArgFlags(CallLower
> // For ByVal, alignment should be passed from FE. BE will guess if
> // this info is not there but there are cases it cannot get right.
> unsigned FrameAlign;
> - if (FuncInfo.getParamAlignment(OpIdx - 1))
> - FrameAlign = FuncInfo.getParamAlignment(OpIdx - 1);
> + if (FuncInfo.getParamAlignment(OpIdx - 2))
> + FrameAlign = FuncInfo.getParamAlignment(OpIdx - 2);
> else
> FrameAlign = getTLI()->getByValTypeAlignment(ElementTy, DL);
> Arg.Flags.setByValAlign(FrameAlign);
>
> Modified: llvm/trunk/lib/IR/Attributes.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/
> Attributes.cpp?rev=301697&r1=301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/IR/Attributes.cpp (original)
> +++ llvm/trunk/lib/IR/Attributes.cpp Fri Apr 28 16:48:28 2017
> @@ -936,7 +936,9 @@ AttributeList AttributeList::get(LLVMCon
> AttributeList AttributeList::addAttribute(LLVMContext &C, unsigned Index,
> Attribute::AttrKind Kind) const
> {
> if (hasAttribute(Index, Kind)) return *this;
> - return addAttributes(C, Index, AttributeList::get(C, Index, Kind));
> + AttrBuilder B;
> + B.addAttribute(Kind);
> + return addAttributes(C, Index, B);
> }
>
> AttributeList AttributeList::addAttribute(LLVMContext &C, unsigned Index,
> @@ -944,7 +946,7 @@ AttributeList AttributeList::addAttribut
> StringRef Value) const {
> AttrBuilder B;
> B.addAttribute(Kind, Value);
> - return addAttributes(C, Index, AttributeList::get(C, Index, B));
> + return addAttributes(C, Index, B);
> }
>
> AttributeList AttributeList::addAttribute(LLVMContext &C,
> @@ -978,14 +980,6 @@ AttributeList AttributeList::addAttribut
> }
>
> AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned
> Index,
> - AttributeList Attrs) const {
> - if (!pImpl) return Attrs;
> - if (!Attrs.pImpl) return *this;
> -
> - return addAttributes(C, Index, Attrs.getAttributes(Index));
> -}
> -
> -AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned
> Index,
> const AttrBuilder &B) const {
> if (!B.hasAttributes())
> return *this;
> @@ -1034,18 +1028,17 @@ AttributeList AttributeList::addAttribut
> AttributeList AttributeList::removeAttribute(LLVMContext &C, unsigned
> Index,
> Attribute::AttrKind Kind)
> const {
> if (!hasAttribute(Index, Kind)) return *this;
> - return removeAttributes(C, Index, AttributeList::get(C, Index, Kind));
> + AttrBuilder B;
> + B.addAttribute(Kind);
> + return removeAttributes(C, Index, B);
> }
>
> AttributeList AttributeList::removeAttribute(LLVMContext &C, unsigned
> Index,
> StringRef Kind) const {
> if (!hasAttribute(Index, Kind)) return *this;
> - return removeAttributes(C, Index, AttributeList::get(C, Index, Kind));
> -}
> -
> -AttributeList AttributeList::removeAttributes(LLVMContext &C, unsigned
> Index,
> - AttributeList Attrs) const {
> - return removeAttributes(C, Index, AttrBuilder(Attrs.
> getAttributes(Index)));
> + AttrBuilder B;
> + B.addAttribute(Kind);
> + return removeAttributes(C, Index, B);
> }
>
> AttributeList AttributeList::removeAttributes(LLVMContext &C, unsigned
> Index,
> @@ -1103,7 +1096,7 @@ AttributeList AttributeList::addDerefere
> uint64_t Bytes) const
> {
> AttrBuilder B;
> B.addDereferenceableAttr(Bytes);
> - return addAttributes(C, Index, AttributeList::get(C, Index, B));
> + return addAttributes(C, Index, B);
> }
>
> AttributeList
> @@ -1111,7 +1104,7 @@ AttributeList::addDereferenceableOrNullA
> uint64_t Bytes) const {
> AttrBuilder B;
> B.addDereferenceableOrNullAttr(Bytes);
> - return addAttributes(C, Index, AttributeList::get(C, Index, B));
> + return addAttributes(C, Index, B);
> }
>
> AttributeList
> @@ -1120,7 +1113,7 @@ AttributeList::addAllocSizeAttr(LLVMCont
> const Optional<unsigned> &NumElemsArg) {
> AttrBuilder B;
> B.addAllocSizeAttr(ElemSizeArg, NumElemsArg);
> - return addAttributes(C, Index, AttributeList::get(C, Index, B));
> + return addAttributes(C, Index, B);
> }
>
> //===-------------------------------------------------------
> ---------------===//
> @@ -1610,12 +1603,10 @@ static void adjustCallerSSPLevel(Functio
> // If upgrading the SSP attribute, clear out the old SSP Attributes
> first.
> // Having multiple SSP attributes doesn't actually hurt, but it adds
> useless
> // clutter to the IR.
> - AttrBuilder B;
> - B.addAttribute(Attribute::StackProtect)
> - .addAttribute(Attribute::StackProtectStrong)
> - .addAttribute(Attribute::StackProtectReq);
> - AttributeList OldSSPAttr =
> - AttributeList::get(Caller.getContext(),
> AttributeList::FunctionIndex, B);
> + AttrBuilder OldSSPAttr;
> + OldSSPAttr.addAttribute(Attribute::StackProtect)
> + .addAttribute(Attribute::StackProtectStrong)
> + .addAttribute(Attribute::StackProtectReq);
>
> if (Callee.hasFnAttribute(Attribute::StackProtectReq)) {
> Caller.removeAttributes(AttributeList::FunctionIndex, OldSSPAttr);
>
> Modified: llvm/trunk/lib/IR/Function.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/
> Function.cpp?rev=301697&r1=301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/IR/Function.cpp (original)
> +++ llvm/trunk/lib/IR/Function.cpp Fri Apr 28 16:48:28 2017
> @@ -328,7 +328,7 @@ void Function::addAttribute(unsigned i,
> setAttributes(PAL);
> }
>
> -void Function::addAttributes(unsigned i, AttributeList Attrs) {
> +void Function::addAttributes(unsigned i, const AttrBuilder &Attrs) {
> AttributeList PAL = getAttributes();
> PAL = PAL.addAttributes(getContext(), i, Attrs);
> setAttributes(PAL);
> @@ -346,7 +346,7 @@ void Function::removeAttribute(unsigned
> setAttributes(PAL);
> }
>
> -void Function::removeAttributes(unsigned i, AttributeList Attrs) {
> +void Function::removeAttributes(unsigned i, const AttrBuilder &Attrs) {
> AttributeList PAL = getAttributes();
> PAL = PAL.removeAttributes(getContext(), i, Attrs);
> setAttributes(PAL);
>
> Modified: llvm/trunk/lib/Target/Mips/Mips16HardFloat.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/
> Mips/Mips16HardFloat.cpp?rev=301697&r1=301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Target/Mips/Mips16HardFloat.cpp (original)
> +++ llvm/trunk/lib/Target/Mips/Mips16HardFloat.cpp Fri Apr 28 16:48:28
> 2017
> @@ -490,15 +490,14 @@ static void createFPFnStub(Function *F,
> // remove the use-soft-float attribute
> //
> static void removeUseSoftFloat(Function &F) {
> - AttributeList A;
> + AttrBuilder B;
> DEBUG(errs() << "removing -use-soft-float\n");
> - A = A.addAttribute(F.getContext(), AttributeList::FunctionIndex,
> - "use-soft-float", "false");
> - F.removeAttributes(AttributeList::FunctionIndex, A);
> + B.addAttribute("use-soft-float", "false");
> + F.removeAttributes(AttributeList::FunctionIndex, B);
> if (F.hasFnAttribute("use-soft-float")) {
> DEBUG(errs() << "still has -use-soft-float\n");
> }
> - F.addAttributes(AttributeList::FunctionIndex, A);
> + F.addAttributes(AttributeList::FunctionIndex, B);
> }
>
>
>
> Modified: llvm/trunk/lib/Transforms/Coroutines/CoroSplit.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> Transforms/Coroutines/CoroSplit.cpp?rev=301697&r1=
> 301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Transforms/Coroutines/CoroSplit.cpp (original)
> +++ llvm/trunk/lib/Transforms/Coroutines/CoroSplit.cpp Fri Apr 28
> 16:48:28 2017
> @@ -245,9 +245,7 @@ static Function *createClone(Function &F
> // Remove old return attributes.
> NewF->removeAttributes(
> AttributeList::ReturnIndex,
> - AttributeList::get(
> - NewF->getContext(), AttributeList::ReturnIndex,
> - AttributeFuncs::typeIncompatible(NewF->getReturnType())));
> + AttributeFuncs::typeIncompatible(NewF->getReturnType()));
>
> // Make AllocaSpillBlock the new entry block.
> auto *SwitchBB = cast<BasicBlock>(VMap[ResumeEntry]);
>
> Modified: llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> Transforms/Instrumentation/DataFlowSanitizer.cpp?rev=
> 301697&r1=301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp Fri
> Apr 28 16:48:28 2017
> @@ -254,7 +254,7 @@ class DataFlowSanitizer : public ModuleP
> MDNode *ColdCallWeights;
> DFSanABIList ABIList;
> DenseMap<Value *, Function *> UnwrappedFnMap;
> - AttributeList ReadOnlyNoneAttrs;
> + AttrBuilder ReadOnlyNoneAttrs;
> bool DFSanRuntimeShadowMask;
>
> Value *getShadowAddress(Value *Addr, Instruction *Pos);
> @@ -544,16 +544,12 @@ DataFlowSanitizer::buildWrapperFunction(
> NewF->copyAttributesFrom(F);
> NewF->removeAttributes(
> AttributeList::ReturnIndex,
> - AttributeList::get(
> - F->getContext(), AttributeList::ReturnIndex,
> - AttributeFuncs::typeIncompatible(NewFT->getReturnType())));
> + AttributeFuncs::typeIncompatible(NewFT->getReturnType()));
>
> BasicBlock *BB = BasicBlock::Create(*Ctx, "entry", NewF);
> if (F->isVarArg()) {
> - NewF->removeAttributes(
> - AttributeList::FunctionIndex,
> - AttributeList().addAttribute(*Ctx, AttributeList::FunctionIndex,
> - "split-stack"));
> + NewF->removeAttributes(AttributeList::FunctionIndex,
> + AttrBuilder().addAttribute("split-stack"));
> CallInst::Create(DFSanVarargWrapperFn,
> IRBuilder<>(BB).CreateGlobalStringPtr(F->getName()),
> "",
> BB);
> @@ -698,9 +694,8 @@ bool DataFlowSanitizer::runOnModule(Modu
> }
> }
>
> - AttrBuilder B;
> - B.addAttribute(Attribute::ReadOnly).addAttribute(Attribute::ReadNone);
> - ReadOnlyNoneAttrs = AttributeList::get(*Ctx,
> AttributeList::FunctionIndex, B);
> + ReadOnlyNoneAttrs.addAttribute(Attribute::ReadOnly)
> + .addAttribute(Attribute::ReadNone);
>
> // First, change the ABI of every function in the module. ABI-listed
> // functions keep their original ABI and get a wrapper function.
> @@ -722,9 +717,7 @@ bool DataFlowSanitizer::runOnModule(Modu
> NewF->copyAttributesFrom(&F);
> NewF->removeAttributes(
> AttributeList::ReturnIndex,
> - AttributeList::get(
> - NewF->getContext(), AttributeList::ReturnIndex,
> - AttributeFuncs::typeIncompatible(NewFT->
> getReturnType())));
> + AttributeFuncs::typeIncompatible(NewFT->getReturnType()));
> for (Function::arg_iterator FArg = F.arg_begin(),
> NewFArg = NewF->arg_begin(),
> FArgEnd = F.arg_end();
>
> Modified: llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> Transforms/Instrumentation/MemorySanitizer.cpp?rev=
> 301697&r1=301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp Fri Apr
> 28 16:48:28 2017
> @@ -2607,10 +2607,7 @@ struct MemorySanitizerVisitor : public I
> AttrBuilder B;
> B.addAttribute(Attribute::ReadOnly)
> .addAttribute(Attribute::ReadNone);
> - Func->removeAttributes(AttributeList::FunctionIndex,
> - AttributeList::get(Func->getContext(),
> -
> AttributeList::FunctionIndex,
> - B));
> + Func->removeAttributes(AttributeList::FunctionIndex, B);
> }
>
> maybeMarkSanitizerLibraryCallNoBuiltin(Call, TLI);
> @@ -3659,9 +3656,7 @@ bool MemorySanitizer::runOnFunction(Func
> AttrBuilder B;
> B.addAttribute(Attribute::ReadOnly)
> .addAttribute(Attribute::ReadNone);
> - F.removeAttributes(
> - AttributeList::FunctionIndex,
> - AttributeList::get(F.getContext(), AttributeList::FunctionIndex,
> B));
> + F.removeAttributes(AttributeList::FunctionIndex, B);
>
> return Visitor.runOnFunction();
> }
>
> Modified: llvm/trunk/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/
> RewriteStatepointsForGC.cpp?rev=301697&r1=301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp Fri Apr
> 28 16:48:28 2017
> @@ -2290,8 +2290,7 @@ static void RemoveNonValidAttrAtIndex(LL
> R.addAttribute(Attribute::NoAlias);
>
> if (!R.empty())
> - AH.setAttributes(AH.getAttributes().removeAttributes(
> - Ctx, Index, AttributeList::get(Ctx, Index, R)));
> + AH.setAttributes(AH.getAttributes().removeAttributes(Ctx, Index, R));
> }
>
> void
>
> Modified: llvm/trunk/unittests/IR/AttributesTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/
> IR/AttributesTest.cpp?rev=301697&r1=301696&r2=301697&view=diff
> ============================================================
> ==================
> --- llvm/trunk/unittests/IR/AttributesTest.cpp (original)
> +++ llvm/trunk/unittests/IR/AttributesTest.cpp Fri Apr 28 16:48:28 2017
> @@ -45,7 +45,7 @@ TEST(Attributes, Ordering) {
> AttributeList::get(C, 1, Attribute::SExt)};
>
> AttributeList SetA = AttributeList::get(C, ASs);
> - AttributeList SetB = SetA.removeAttributes(C, 1, ASs[1]);
> + AttributeList SetB = SetA.removeAttributes(C, 1,
> ASs[1].getAttributes(1));
> EXPECT_NE(SetA, SetB);
> }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170428/770e62aa/attachment.html>
More information about the llvm-commits
mailing list