diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index 24323e0a492033a0c7192fd7845bbf8aac3dc60a..7f48ace6883ae15c4a9ae52780d84e8635140736 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -26,7 +26,7 @@ if(NOT DEFINED LLVM_VERSION_MINOR) set(LLVM_VERSION_MINOR 0) endif() if(NOT DEFINED LLVM_VERSION_PATCH) - set(LLVM_VERSION_PATCH 0) + set(LLVM_VERSION_PATCH 1) endif() if(NOT DEFINED LLVM_VERSION_SUFFIX) set(LLVM_VERSION_SUFFIX "") diff --git a/llvm/cmake/config-ix.cmake b/llvm/cmake/config-ix.cmake index 4288cf4bdd044e58e72900785718025d58a9a143..5e017e75a7582cb61b50af14d19bdf80ec2c6eac 100755 --- a/llvm/cmake/config-ix.cmake +++ b/llvm/cmake/config-ix.cmake @@ -115,7 +115,7 @@ if(HAVE_LIBPTHREAD) set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_HAVE_PTHREAD_ARG Off) find_package(Threads REQUIRED) - set(PTHREAD_LIB ${CMAKE_THREAD_LIBS_INIT}) + set(LLVM_PTHREAD_LIB ${CMAKE_THREAD_LIBS_INIT}) endif() # Don't look for these libraries on Windows. Also don't look for them if we're diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index b3c7746c480ade18bbd1f688ca5f323711fc00aa..cb4171c9bc8825a1c8ef88a812c42d27d2d0cb3a 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -718,11 +718,11 @@ macro(add_llvm_executable name) if(NOT ARG_IGNORE_EXTERNALIZE_DEBUGINFO) llvm_externalize_debuginfo(${name}) endif() - if (PTHREAD_LIB) + if (LLVM_PTHREAD_LIB) # libpthreads overrides some standard library symbols, so main # executable must be linked with it in order to provide consistent # API for all shared libaries loaded by this executable. - target_link_libraries(${name} ${PTHREAD_LIB}) + target_link_libraries(${name} ${LLVM_PTHREAD_LIB}) endif() endmacro(add_llvm_executable name) @@ -1027,7 +1027,7 @@ function(add_unittest test_suite test_name) # libpthreads overrides some standard library symbols, so main # executable must be linked with it in order to provide consistent # API for all shared libaries loaded by this executable. - target_link_libraries(${test_name} gtest_main gtest ${PTHREAD_LIB}) + target_link_libraries(${test_name} gtest_main gtest ${LLVM_PTHREAD_LIB}) add_dependencies(${test_suite} ${test_name}) get_target_property(test_suite_folder ${test_suite} FOLDER) diff --git a/llvm/cmake/modules/LLVMConfig.cmake.in b/llvm/cmake/modules/LLVMConfig.cmake.in index c30c92b66d8af9bf535c6651ff2ebe8be4b7fdff..80522b2de4ea834a937f91ac2a331efe4fb17c34 100644 --- a/llvm/cmake/modules/LLVMConfig.cmake.in +++ b/llvm/cmake/modules/LLVMConfig.cmake.in @@ -45,6 +45,10 @@ set(LLVM_ENABLE_PIC @LLVM_ENABLE_PIC@) set(LLVM_BUILD_32_BITS @LLVM_BUILD_32_BITS@) +if (NOT "@LLVM_PTHREAD_LIB@" STREQUAL "") + set(LLVM_PTHREAD_LIB "@LLVM_PTHREAD_LIB@") +endif() + set(LLVM_ENABLE_PLUGINS @LLVM_ENABLE_PLUGINS@) set(LLVM_EXPORT_SYMBOLS_FOR_PLUGINS @LLVM_EXPORT_SYMBOLS_FOR_PLUGINS@) set(LLVM_PLUGIN_EXT @LLVM_PLUGIN_EXT@) diff --git a/llvm/cmake/modules/TableGen.cmake b/llvm/cmake/modules/TableGen.cmake index 9682002c2abd93e76e968163be0f9ee84e412698..3bb8aaab4073eeb98db25c835bff569ad20f39ff 100644 --- a/llvm/cmake/modules/TableGen.cmake +++ b/llvm/cmake/modules/TableGen.cmake @@ -92,7 +92,7 @@ macro(add_tablegen target project) set(LLVM_ENABLE_OBJLIB ON) endif() - add_llvm_utility(${target} ${ARGN}) + add_llvm_executable(${target} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN}) set(LLVM_LINK_COMPONENTS ${${target}_OLD_LLVM_LINK_COMPONENTS}) set(${project}_TABLEGEN "${target}" CACHE diff --git a/llvm/examples/ParallelJIT/CMakeLists.txt b/llvm/examples/ParallelJIT/CMakeLists.txt index e85b470f5036b8c5b9ade0b707e8b5cdd79475f0..deeee072b33caa3896a10b9550d1bb8ad1875979 100644 --- a/llvm/examples/ParallelJIT/CMakeLists.txt +++ b/llvm/examples/ParallelJIT/CMakeLists.txt @@ -11,4 +11,4 @@ add_llvm_example(ParallelJIT ParallelJIT.cpp ) -target_link_libraries(ParallelJIT ${PTHREAD_LIB}) +target_link_libraries(ParallelJIT ${LLVM_PTHREAD_LIB}) diff --git a/llvm/include/llvm/ADT/DenseSet.h b/llvm/include/llvm/ADT/DenseSet.h index b25d3b7cba6f4dae8dc8e2aae565de01adeb722c..9ab91507928b6c010812612860841310631d4dc1 100644 --- a/llvm/include/llvm/ADT/DenseSet.h +++ b/llvm/include/llvm/ADT/DenseSet.h @@ -104,7 +104,9 @@ public: Iterator(const typename MapTy::iterator &i) : I(i) {} ValueT &operator*() { return I->getFirst(); } + const ValueT &operator*() const { return I->getFirst(); } ValueT *operator->() { return &I->getFirst(); } + const ValueT *operator->() const { return &I->getFirst(); } Iterator& operator++() { ++I; return *this; } Iterator operator++(int) { auto T = *this; ++I; return T; } @@ -126,7 +128,9 @@ public: ConstIterator(const typename MapTy::const_iterator &i) : I(i) {} const ValueT &operator*() { return I->getFirst(); } + const ValueT &operator*() const { return I->getFirst(); } const ValueT *operator->() { return &I->getFirst(); } + const ValueT *operator->() const { return &I->getFirst(); } ConstIterator& operator++() { ++I; return *this; } ConstIterator operator++(int) { auto T = *this; ++I; return T; } diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt index 398ea88363b64c232df4f67fade950bcd08d0562..d28a679e127e0d3595d4663c8fd68701580346fd 100644 --- a/llvm/lib/CodeGen/CMakeLists.txt +++ b/llvm/lib/CodeGen/CMakeLists.txt @@ -147,7 +147,7 @@ add_llvm_library(LLVMCodeGen ${LLVM_MAIN_INCLUDE_DIR}/llvm/CodeGen ${LLVM_MAIN_INCLUDE_DIR}/llvm/CodeGen/PBQP - LINK_LIBS ${PTHREAD_LIB} + LINK_LIBS ${LLVM_PTHREAD_LIB} DEPENDS intrinsics_gen diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 2c7bffe76503f2b20fad4693da0add39d3cfc246..0126b889506e8b34647e5b19d6af7ee05e9ee684 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -6677,13 +6677,14 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) { LN0->getChain(), LN0->getBasePtr(), N0.getValueType(), LN0->getMemOperand()); - CombineTo(N, ExtLoad); + SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(N0), N0.getValueType(), ExtLoad); CombineTo(N0.getNode(), Trunc, ExtLoad.getValue(1)); ExtendSetCCUses(SetCCs, Trunc, ExtLoad, SDLoc(N), ISD::ZERO_EXTEND); + CombineTo(N, ExtLoad); return SDValue(N, 0); // Return N so it doesn't get rechecked! } } diff --git a/llvm/lib/ExecutionEngine/IntelJITEvents/CMakeLists.txt b/llvm/lib/ExecutionEngine/IntelJITEvents/CMakeLists.txt index 3b8c4b973e689dbc4eb8d25216c689af4e6a4869..e6c33b2ecc2a06b4d0ae0645cbae8c1ac42cc1d4 100644 --- a/llvm/lib/ExecutionEngine/IntelJITEvents/CMakeLists.txt +++ b/llvm/lib/ExecutionEngine/IntelJITEvents/CMakeLists.txt @@ -4,7 +4,7 @@ if( HAVE_LIBDL ) set(LLVM_INTEL_JIT_LIBS ${CMAKE_DL_LIBS}) endif() -set(LLVM_INTEL_JIT_LIBS ${PTHREAD_LIB} ${LLVM_INTEL_JIT_LIBS}) +set(LLVM_INTEL_JIT_LIBS ${LLVM_PTHREAD_LIB} ${LLVM_INTEL_JIT_LIBS}) add_llvm_library(LLVMIntelJITEvents diff --git a/llvm/lib/Fuzzer/CMakeLists.txt b/llvm/lib/Fuzzer/CMakeLists.txt index 70bd017bae6b6b5773f3c3bc41621571e4f358b9..4ad7e5e5812607ec407976741fc00f6c012ead75 100644 --- a/llvm/lib/Fuzzer/CMakeLists.txt +++ b/llvm/lib/Fuzzer/CMakeLists.txt @@ -32,12 +32,12 @@ if( LLVM_USE_SANITIZE_COVERAGE ) add_library(LLVMFuzzerNoMain STATIC $<TARGET_OBJECTS:LLVMFuzzerNoMainObjects> ) - target_link_libraries(LLVMFuzzerNoMain ${PTHREAD_LIB}) + target_link_libraries(LLVMFuzzerNoMain ${LLVM_PTHREAD_LIB}) add_library(LLVMFuzzer STATIC FuzzerMain.cpp $<TARGET_OBJECTS:LLVMFuzzerNoMainObjects> ) - target_link_libraries(LLVMFuzzer ${PTHREAD_LIB}) + target_link_libraries(LLVMFuzzer ${LLVM_PTHREAD_LIB}) if( LLVM_INCLUDE_TESTS ) add_subdirectory(test) diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt index 15418ad2fd064f356d7c768dc15066d6695dda17..a077a9ffd9b332fd1767524d5fe8156d7ef0d293 100644 --- a/llvm/lib/Support/CMakeLists.txt +++ b/llvm/lib/Support/CMakeLists.txt @@ -17,7 +17,7 @@ elseif( CMAKE_HOST_UNIX ) if( LLVM_ENABLE_THREADS AND HAVE_LIBATOMIC ) set(system_libs ${system_libs} atomic) endif() - set(system_libs ${system_libs} ${PTHREAD_LIB}) + set(system_libs ${system_libs} ${LLVM_PTHREAD_LIB}) if ( LLVM_ENABLE_ZLIB AND HAVE_LIBZ ) set(system_libs ${system_libs} z) endif() diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp index 6783b40a125d1489a0423effc78a0f03d8c7e4fc..9cf2d5d3fcd4a4343db07e40e98e70ec9c9355f8 100644 --- a/llvm/lib/Support/Triple.cpp +++ b/llvm/lib/Support/Triple.cpp @@ -1511,6 +1511,7 @@ StringRef Triple::getARMCPUForArch(StringRef MArch) const { return "strongarm"; } case llvm::Triple::NaCl: + case llvm::Triple::OpenBSD: return "cortex-a8"; default: switch (getEnvironment()) { diff --git a/llvm/lib/Target/AMDGPU/AMDGPURuntimeMetadata.h b/llvm/lib/Target/AMDGPU/AMDGPURuntimeMetadata.h index ecd2ac72bf1bfa14bf7a36d59ab4e07e4abfc987..79ce60a546ec4c4a54ffb1f021ea504f4628e007 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPURuntimeMetadata.h +++ b/llvm/lib/Target/AMDGPU/AMDGPURuntimeMetadata.h @@ -41,8 +41,8 @@ namespace AMDGPU { namespace RuntimeMD { // Version and revision of runtime metadata - const unsigned char MDVersion = 2; - const unsigned char MDRevision = 0; + const uint32_t MDVersion = 2; + const uint32_t MDRevision = 0; // Name of keys for runtime metadata. namespace KeyName { @@ -157,7 +157,7 @@ namespace RuntimeMD { struct Metadata { std::string Name; std::string Language; - std::vector<uint8_t> LanguageVersion; + std::vector<uint32_t> LanguageVersion; std::vector<uint32_t> ReqdWorkGroupSize; std::vector<uint32_t> WorkGroupSizeHint; std::string VecTypeHint; @@ -171,7 +171,7 @@ namespace RuntimeMD { namespace Program { // In-memory representation of program information. struct Metadata { - std::vector<uint8_t> MDVersionSeq; + std::vector<uint32_t> MDVersionSeq; std::vector<std::string> PrintfInfo; std::vector<Kernel::Metadata> Kernels; diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.cpp index 95387ad1627c974b97c9df8043a606ff53202a3b..57ea789b0b363876c63e615b8d4dfcd1974dd6c7 100644 --- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.cpp +++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPURuntimeMD.cpp @@ -38,7 +38,6 @@ static cl::opt<bool> CheckRuntimeMDParser("amdgpu-check-rtmd-parser", cl::Hidden, cl::desc("Check AMDGPU runtime metadata YAML parser")); -LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(uint8_t) LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(uint32_t) LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(std::string) LLVM_YAML_IS_SEQUENCE_VECTOR(Kernel::Metadata) @@ -266,9 +265,9 @@ static Kernel::Metadata getRuntimeMDForKernel(const Function &F) { auto Node = MD->getOperand(0); if (Node->getNumOperands() > 1) { Kernel.Language = "OpenCL C"; - uint16_t Major = mdconst::extract<ConstantInt>(Node->getOperand(0)) + uint32_t Major = mdconst::extract<ConstantInt>(Node->getOperand(0)) ->getZExtValue(); - uint16_t Minor = mdconst::extract<ConstantInt>(Node->getOperand(1)) + uint32_t Minor = mdconst::extract<ConstantInt>(Node->getOperand(1)) ->getZExtValue(); Kernel.LanguageVersion.push_back(Major); Kernel.LanguageVersion.push_back(Minor); diff --git a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp index e87e1e6a7e0fefcfbc75560a3ac7bcdf19de960f..be70e1464e552c0fdf4c63f2092bf70a307caa4f 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp @@ -256,7 +256,9 @@ static bool CC_Hexagon (unsigned ValNo, MVT ValVT, MVT LocVT, return false; } - if (LocVT == MVT::i1 || LocVT == MVT::i8 || LocVT == MVT::i16) { + if (LocVT == MVT::i1) { + LocVT = MVT::i32; + } else if (LocVT == MVT::i8 || LocVT == MVT::i16) { LocVT = MVT::i32; ValVT = MVT::i32; if (ArgFlags.isSExt()) @@ -1140,10 +1142,25 @@ SDValue HexagonTargetLowering::LowerFormalArguments( EVT RegVT = VA.getLocVT(); if (RegVT == MVT::i8 || RegVT == MVT::i16 || RegVT == MVT::i32 || RegVT == MVT::f32) { - unsigned VReg = + unsigned VReg = RegInfo.createVirtualRegister(&Hexagon::IntRegsRegClass); RegInfo.addLiveIn(VA.getLocReg(), VReg); - InVals.push_back(DAG.getCopyFromReg(Chain, dl, VReg, RegVT)); + SDValue Copy = DAG.getCopyFromReg(Chain, dl, VReg, RegVT); + // Treat values of type MVT::i1 specially: they are passed in + // registers of type i32, but they need to remain as values of + // type i1 for consistency of the argument lowering. + if (VA.getValVT() == MVT::i1) { + // Generate a copy into a predicate register and use the value + // of the register as the "InVal". + unsigned PReg = + RegInfo.createVirtualRegister(&Hexagon::PredRegsRegClass); + SDNode *T = DAG.getMachineNode(Hexagon::C2_tfrrp, dl, MVT::i1, + Copy.getValue(0)); + Copy = DAG.getCopyToReg(Copy.getValue(1), dl, PReg, SDValue(T, 0)); + Copy = DAG.getCopyFromReg(Copy, dl, PReg, MVT::i1); + } + InVals.push_back(Copy); + Chain = Copy.getValue(1); } else if (RegVT == MVT::i64 || RegVT == MVT::f64) { unsigned VReg = RegInfo.createVirtualRegister(&Hexagon::DoubleRegsRegClass); diff --git a/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp b/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp index f80efb18507b1e0d479864157f68568756831640..04c81029382dcafbf73208e0c54d952848a8c3d1 100644 --- a/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp +++ b/llvm/lib/Target/Mips/Disassembler/MipsDisassembler.cpp @@ -1106,6 +1106,7 @@ DecodeStatus MipsDisassembler::getInstruction(MCInst &Instr, uint64_t &Size, raw_ostream &CStream) const { uint32_t Insn; DecodeStatus Result; + Size = 0; if (IsMicroMips) { Result = readInstruction16(Bytes, Address, Size, Insn, IsBigEndian); @@ -1168,98 +1169,88 @@ DecodeStatus MipsDisassembler::getInstruction(MCInst &Instr, uint64_t &Size, } } - // This is an invalid instruction. Let the disassembler move forward by the - // minimum instruction size. + // This is an invalid instruction. Claim that the Size is 2 bytes. Since + // microMIPS instructions have a minimum alignment of 2, the next 2 bytes + // could form a valid instruction. The two bytes we rejected as an + // instruction could have actually beeen an inline constant pool that is + // unconditionally branched over. Size = 2; return MCDisassembler::Fail; } + // Attempt to read the instruction so that we can attempt to decode it. If + // the buffer is not 4 bytes long, let the higher level logic figure out + // what to do with a size of zero and MCDisassembler::Fail. Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, false); - if (Result == MCDisassembler::Fail) { - Size = 4; + if (Result == MCDisassembler::Fail) return MCDisassembler::Fail; - } + + // The only instruction size for standard encoded MIPS. + Size = 4; if (hasCOP3()) { DEBUG(dbgs() << "Trying COP3_ table (32-bit opcodes):\n"); Result = decodeInstruction(DecoderTableCOP3_32, Instr, Insn, Address, this, STI); - if (Result != MCDisassembler::Fail) { - Size = 4; + if (Result != MCDisassembler::Fail) return Result; - } } if (hasMips32r6() && isGP64()) { DEBUG(dbgs() << "Trying Mips32r6_64r6 (GPR64) table (32-bit opcodes):\n"); Result = decodeInstruction(DecoderTableMips32r6_64r6_GP6432, Instr, Insn, Address, this, STI); - if (Result != MCDisassembler::Fail) { - Size = 4; + if (Result != MCDisassembler::Fail) return Result; - } } if (hasMips32r6() && isPTR64()) { DEBUG(dbgs() << "Trying Mips32r6_64r6 (PTR64) table (32-bit opcodes):\n"); Result = decodeInstruction(DecoderTableMips32r6_64r6_PTR6432, Instr, Insn, Address, this, STI); - if (Result != MCDisassembler::Fail) { - Size = 4; + if (Result != MCDisassembler::Fail) return Result; - } } if (hasMips32r6()) { DEBUG(dbgs() << "Trying Mips32r6_64r6 table (32-bit opcodes):\n"); Result = decodeInstruction(DecoderTableMips32r6_64r632, Instr, Insn, Address, this, STI); - if (Result != MCDisassembler::Fail) { - Size = 4; + if (Result != MCDisassembler::Fail) return Result; - } } if (hasMips2() && isPTR64()) { DEBUG(dbgs() << "Trying Mips32r6_64r6 (PTR64) table (32-bit opcodes):\n"); Result = decodeInstruction(DecoderTableMips32_64_PTR6432, Instr, Insn, Address, this, STI); - if (Result != MCDisassembler::Fail) { - Size = 4; + if (Result != MCDisassembler::Fail) return Result; - } } if (hasCnMips()) { DEBUG(dbgs() << "Trying CnMips table (32-bit opcodes):\n"); Result = decodeInstruction(DecoderTableCnMips32, Instr, Insn, Address, this, STI); - if (Result != MCDisassembler::Fail) { - Size = 4; + if (Result != MCDisassembler::Fail) return Result; - } } if (isGP64()) { DEBUG(dbgs() << "Trying Mips64 (GPR64) table (32-bit opcodes):\n"); Result = decodeInstruction(DecoderTableMips6432, Instr, Insn, Address, this, STI); - if (Result != MCDisassembler::Fail) { - Size = 4; + if (Result != MCDisassembler::Fail) return Result; - } } DEBUG(dbgs() << "Trying Mips table (32-bit opcodes):\n"); // Calling the auto-generated decoder function. Result = decodeInstruction(DecoderTableMips32, Instr, Insn, Address, this, STI); - if (Result != MCDisassembler::Fail) { - Size = 4; + if (Result != MCDisassembler::Fail) return Result; - } - Size = 4; return MCDisassembler::Fail; } diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 08fe2bad281e5d7751698be8dd160a87899a0b60..de6c9a67ed850e4cb2dc0c0855a3bcd785858a1b 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -34717,10 +34717,17 @@ X86TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, return Res; } - // 'A' means EAX + EDX. + // 'A' means [ER]AX + [ER]DX. if (Constraint == "A") { - Res.first = X86::EAX; - Res.second = &X86::GR32_ADRegClass; + if (Subtarget.is64Bit()) { + Res.first = X86::RAX; + Res.second = &X86::GR64_ADRegClass; + } else { + assert((Subtarget.is32Bit() || Subtarget.is16Bit()) && + "Expecting 64, 32 or 16 bit subtarget"); + Res.first = X86::EAX; + Res.second = &X86::GR32_ADRegClass; + } return Res; } return Res; diff --git a/llvm/lib/Target/X86/X86RegisterInfo.td b/llvm/lib/Target/X86/X86RegisterInfo.td index 372a15aff15a03c9154e77bfbe97de39de46f60e..ad02a940f22c7b42aafe8bd6d1768d0a5e7ab3ef 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.td +++ b/llvm/lib/Target/X86/X86RegisterInfo.td @@ -437,8 +437,9 @@ def LOW32_ADDR_ACCESS : RegisterClass<"X86", [i32], 32, (add GR32, RIP)>; def LOW32_ADDR_ACCESS_RBP : RegisterClass<"X86", [i32], 32, (add LOW32_ADDR_ACCESS, RBP)>; -// A class to support the 'A' assembler constraint: EAX then EDX. +// A class to support the 'A' assembler constraint: [ER]AX then [ER]DX. def GR32_AD : RegisterClass<"X86", [i32], 32, (add EAX, EDX)>; +def GR64_AD : RegisterClass<"X86", [i64], 64, (add RAX, RDX)>; // Scalar SSE2 floating point registers. def FR32 : RegisterClass<"X86", [f32], 32, (sequence "XMM%u", 0, 15)>; diff --git a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h index 2847ce858e79181adfbf778064c94c5abcbf3fd1..432df8b1e6176b0abdab2effcb881ce41ffafa90 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h +++ b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h @@ -313,6 +313,11 @@ public: bool replacedSelectWithOperand(SelectInst *SI, const ICmpInst *Icmp, const unsigned SIOpd); + /// Try to replace instruction \p I with value \p V which are pointers + /// in different address space. + /// \return true if successful. + bool replacePointer(Instruction &I, Value *V); + private: bool ShouldChangeType(unsigned FromBitWidth, unsigned ToBitWidth) const; bool ShouldChangeType(Type *From, Type *To) const; diff --git a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp index 49e516e9c1761696a9802bae539256222a56e71a..5789296b1ec98a2403c78de4eaede85d6db6cad3 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -12,13 +12,14 @@ //===----------------------------------------------------------------------===// #include "InstCombineInternal.h" +#include "llvm/ADT/MapVector.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/Statistic.h" #include "llvm/Analysis/Loads.h" #include "llvm/IR/ConstantRange.h" #include "llvm/IR/DataLayout.h" -#include "llvm/IR/LLVMContext.h" #include "llvm/IR/IntrinsicInst.h" +#include "llvm/IR/LLVMContext.h" #include "llvm/IR/MDBuilder.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/Local.h" @@ -223,6 +224,103 @@ static Instruction *simplifyAllocaArraySize(InstCombiner &IC, AllocaInst &AI) { return nullptr; } +// If I and V are pointers in different address space, it is not allowed to +// use replaceAllUsesWith since I and V have different types. A +// non-target-specific transformation should not use addrspacecast on V since +// the two address space may be disjoint depending on target. +// +// This class chases down uses of the old pointer until reaching the load +// instructions, then replaces the old pointer in the load instructions with +// the new pointer. If during the chasing it sees bitcast or GEP, it will +// create new bitcast or GEP with the new pointer and use them in the load +// instruction. +class PointerReplacer { +public: + PointerReplacer(InstCombiner &IC) : IC(IC) {} + void replacePointer(Instruction &I, Value *V); + +private: + void findLoadAndReplace(Instruction &I); + void replace(Instruction *I); + Value *getReplacement(Value *I); + + SmallVector<Instruction *, 4> Path; + MapVector<Value *, Value *> WorkMap; + InstCombiner &IC; +}; + +void PointerReplacer::findLoadAndReplace(Instruction &I) { + for (auto U : I.users()) { + auto *Inst = dyn_cast<Instruction>(&*U); + if (!Inst) + return; + DEBUG(dbgs() << "Found pointer user: " << *U << '\n'); + if (isa<LoadInst>(Inst)) { + for (auto P : Path) + replace(P); + replace(Inst); + } else if (isa<GetElementPtrInst>(Inst) || isa<BitCastInst>(Inst)) { + Path.push_back(Inst); + findLoadAndReplace(*Inst); + Path.pop_back(); + } else { + return; + } + } +} + +Value *PointerReplacer::getReplacement(Value *V) { + auto Loc = WorkMap.find(V); + if (Loc != WorkMap.end()) + return Loc->second; + return nullptr; +} + +void PointerReplacer::replace(Instruction *I) { + if (getReplacement(I)) + return; + + if (auto *LT = dyn_cast<LoadInst>(I)) { + auto *V = getReplacement(LT->getPointerOperand()); + assert(V && "Operand not replaced"); + auto *NewI = new LoadInst(V); + NewI->takeName(LT); + IC.InsertNewInstWith(NewI, *LT); + IC.replaceInstUsesWith(*LT, NewI); + WorkMap[LT] = NewI; + } else if (auto *GEP = dyn_cast<GetElementPtrInst>(I)) { + auto *V = getReplacement(GEP->getPointerOperand()); + assert(V && "Operand not replaced"); + SmallVector<Value *, 8> Indices; + Indices.append(GEP->idx_begin(), GEP->idx_end()); + auto *NewI = GetElementPtrInst::Create( + V->getType()->getPointerElementType(), V, Indices); + IC.InsertNewInstWith(NewI, *GEP); + NewI->takeName(GEP); + WorkMap[GEP] = NewI; + } else if (auto *BC = dyn_cast<BitCastInst>(I)) { + auto *V = getReplacement(BC->getOperand(0)); + assert(V && "Operand not replaced"); + auto *NewT = PointerType::get(BC->getType()->getPointerElementType(), + V->getType()->getPointerAddressSpace()); + auto *NewI = new BitCastInst(V, NewT); + IC.InsertNewInstWith(NewI, *BC); + NewI->takeName(BC); + WorkMap[BC] = NewI; + } else { + llvm_unreachable("should never reach here"); + } +} + +void PointerReplacer::replacePointer(Instruction &I, Value *V) { + auto *PT = cast<PointerType>(I.getType()); + auto *NT = cast<PointerType>(V->getType()); + assert(PT != NT && PT->getElementType() == NT->getElementType() && + "Invalid usage"); + WorkMap[&I] = V; + findLoadAndReplace(I); +} + Instruction *InstCombiner::visitAllocaInst(AllocaInst &AI) { if (auto *I = simplifyAllocaArraySize(*this, AI)) return I; @@ -293,12 +391,22 @@ Instruction *InstCombiner::visitAllocaInst(AllocaInst &AI) { for (unsigned i = 0, e = ToDelete.size(); i != e; ++i) eraseInstFromFunction(*ToDelete[i]); Constant *TheSrc = cast<Constant>(Copy->getSource()); - Constant *Cast - = ConstantExpr::getPointerBitCastOrAddrSpaceCast(TheSrc, AI.getType()); - Instruction *NewI = replaceInstUsesWith(AI, Cast); - eraseInstFromFunction(*Copy); - ++NumGlobalCopies; - return NewI; + auto *SrcTy = TheSrc->getType(); + auto *DestTy = PointerType::get(AI.getType()->getPointerElementType(), + SrcTy->getPointerAddressSpace()); + Constant *Cast = + ConstantExpr::getPointerBitCastOrAddrSpaceCast(TheSrc, DestTy); + if (AI.getType()->getPointerAddressSpace() == + SrcTy->getPointerAddressSpace()) { + Instruction *NewI = replaceInstUsesWith(AI, Cast); + eraseInstFromFunction(*Copy); + ++NumGlobalCopies; + return NewI; + } else { + PointerReplacer PtrReplacer(*this); + PtrReplacer.replacePointer(AI, Cast); + ++NumGlobalCopies; + } } } } diff --git a/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp b/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp index 38262514c9ec40d2f1d86c129d1dc6a7b11a57a7..cad295db7cc9a0377392ab921e6bcb8a0ab60c69 100644 --- a/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp +++ b/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp @@ -136,8 +136,16 @@ Instruction *ConstantHoistingPass::findMatInsertPt(Instruction *Inst, if (Idx != ~0U && isa<PHINode>(Inst)) return cast<PHINode>(Inst)->getIncomingBlock(Idx)->getTerminator(); - BasicBlock *IDom = DT->getNode(Inst->getParent())->getIDom()->getBlock(); - return IDom->getTerminator(); + // This must be an EH pad. Iterate over immediate dominators until we find a + // non-EH pad. We need to skip over catchswitch blocks, which are both EH pads + // and terminators. + auto IDom = DT->getNode(Inst->getParent())->getIDom(); + while (IDom->getBlock()->isEHPad()) { + assert(Entry != IDom->getBlock() && "eh pad in entry block"); + IDom = IDom->getIDom(); + } + + return IDom->getBlock()->getTerminator(); } /// \brief Find an insertion point that dominates all uses. diff --git a/llvm/test/CodeGen/Hexagon/isel-i1arg-crash.ll b/llvm/test/CodeGen/Hexagon/isel-i1arg-crash.ll new file mode 100644 index 0000000000000000000000000000000000000000..7e8bd9e93b276dc8f40b0aee4e7bbdaee9309f90 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/isel-i1arg-crash.ll @@ -0,0 +1,6 @@ +; RUN: llc -march=hexagon -debug-only=isel < %s +; REQUIRES: asserts + +define void @g(i1 %cond) { + ret void +} diff --git a/llvm/test/CodeGen/X86/inline-asm-A-constraint.ll b/llvm/test/CodeGen/X86/inline-asm-A-constraint.ll new file mode 100644 index 0000000000000000000000000000000000000000..2ad011e88e0d8cbd80975b142a352be6b3b1e262 --- /dev/null +++ b/llvm/test/CodeGen/X86/inline-asm-A-constraint.ll @@ -0,0 +1,35 @@ +; RUN: llc -mtriple=x86_64-- < %s | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64--" + +; Function Attrs: nounwind uwtable +define { i64, i64 } @foo(i8* %ptr, i128* nocapture readonly %src, i128* nocapture readonly %dst) local_unnamed_addr #0 { +entry: + %0 = load i128, i128* %dst, align 16, !tbaa !1 + %shr = lshr i128 %0, 64 + %conv = trunc i128 %shr to i64 + %conv1 = trunc i128 %0 to i64 + %1 = load i128, i128* %src, align 16, !tbaa !1 + %2 = tail call i128 asm sideeffect "lock; cmpxchg16b $1", "=A,=*m,{cx},{bx},0,*m,~{dirflag},~{fpsr},~{flags}"(i8* %ptr, i64 %conv, i64 %conv1, i128 %1, i8* %ptr) #1, !srcloc !5 + %retval.sroa.0.0.extract.trunc = trunc i128 %2 to i64 + %retval.sroa.2.0.extract.shift = lshr i128 %2, 64 + %retval.sroa.2.0.extract.trunc = trunc i128 %retval.sroa.2.0.extract.shift to i64 + %.fca.0.insert = insertvalue { i64, i64 } undef, i64 %retval.sroa.0.0.extract.trunc, 0 + %.fca.1.insert = insertvalue { i64, i64 } %.fca.0.insert, i64 %retval.sroa.2.0.extract.trunc, 1 + ret { i64, i64 } %.fca.1.insert +} +; CHECK: lock +; CHECK-NEXT: cmpxchg16b + +attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind } + +!llvm.ident = !{!0} + +!0 = !{!"clang version 5.0.0 (trunk 300088)"} +!1 = !{!2, !2, i64 0} +!2 = !{!"__int128", !3, i64 0} +!3 = !{!"omnipotent char", !4, i64 0} +!4 = !{!"Simple C/C++ TBAA"} +!5 = !{i32 269} diff --git a/llvm/test/CodeGen/X86/pr32284.ll b/llvm/test/CodeGen/X86/pr32284.ll new file mode 100644 index 0000000000000000000000000000000000000000..0ead508c17710fabfb72a3f6fd4878c488cfc35e --- /dev/null +++ b/llvm/test/CodeGen/X86/pr32284.ll @@ -0,0 +1,32 @@ +; RUN: llc -O0 -mtriple=i686-unknown -mcpu=skx -o - %s +; RUN: llc -O0 -mtriple=x86_64-unknown -mcpu=skx -o - %s +; RUN: llc -mtriple=i686-unknown -mcpu=skx -o - %s +; RUN: llc -mtriple=x86_64-unknown -mcpu=skx -o - %s + +@c = external constant i8, align 1 + +define void @foo() { +entry: + %a = alloca i8, align 1 + %b = alloca i32, align 4 + %0 = load i8, i8* @c, align 1 + %conv = zext i8 %0 to i32 + %sub = sub nsw i32 0, %conv + %conv1 = sext i32 %sub to i64 + %sub2 = sub nsw i64 0, %conv1 + %conv3 = trunc i64 %sub2 to i8 + %tobool = icmp ne i8 %conv3, 0 + %frombool = zext i1 %tobool to i8 + store i8 %frombool, i8* %a, align 1 + %1 = load i8, i8* @c, align 1 + %tobool4 = icmp ne i8 %1, 0 + %lnot = xor i1 %tobool4, true + %lnot5 = xor i1 %lnot, true + %conv6 = zext i1 %lnot5 to i32 + %2 = load i8, i8* @c, align 1 + %conv7 = zext i8 %2 to i32 + %cmp = icmp sle i32 %conv6, %conv7 + %conv8 = zext i1 %cmp to i32 + store i32 %conv8, i32* %b, align 4 + ret void +} diff --git a/llvm/test/CodeGen/X86/x86-16.ll b/llvm/test/CodeGen/X86/x86-16.ll index 775b2c447bbdb59a15d4da93433e20e6dd77764d..55b53a8047c514fa5a50e1114c47c781b3747e8b 100644 --- a/llvm/test/CodeGen/X86/x86-16.ll +++ b/llvm/test/CodeGen/X86/x86-16.ll @@ -12,9 +12,16 @@ define i32 @main() #0 { ; CHECK: .code16 ; CHECK-LABEL: main +define i64 @foo(i32 %index) #0 { + %asm = tail call i64 asm "rdmsr", "=A,{cx},~{dirflag},~{fpsr},~{flags}"(i32 %index) + ret i64 %asm +} + +; CHECK-LABEL: foo +; CHECK: rdmsr attributes #0 = { nounwind } !llvm.ident = !{!0} -!0 = !{!"clang version 3.9.0 (trunk 265439) (llvm/trunk 265567)"} \ No newline at end of file +!0 = !{!"clang version 3.9.0 (trunk 265439) (llvm/trunk 265567)"} diff --git a/llvm/test/MC/Hexagon/inst_select.ll b/llvm/test/MC/Hexagon/inst_select.ll index 9d12c1de73fef347a852a287e67a0900b6bc7327..a730419c854a76c17bf277196f1856112af25e05 100644 --- a/llvm/test/MC/Hexagon/inst_select.ll +++ b/llvm/test/MC/Hexagon/inst_select.ll @@ -7,7 +7,7 @@ define i32 @foo (i1 %a, i32 %b, i32 %c) ret i32 %1 } -; CHECK: 00 40 00 85 85004000 +; CHECK: 00 40 40 85 85404000 ; CHECK: 00 40 9f 52 529f4000 ; CHECK: 00 60 01 74 74016000 -; CHECK: 00 e0 82 74 7482e000 \ No newline at end of file +; CHECK: 00 e0 82 74 7482e000 diff --git a/llvm/test/Transforms/ConstantHoisting/X86/ehpad.ll b/llvm/test/Transforms/ConstantHoisting/X86/ehpad.ll new file mode 100644 index 0000000000000000000000000000000000000000..3178e87f7548bcf49d8f2491039322761a7debb4 --- /dev/null +++ b/llvm/test/Transforms/ConstantHoisting/X86/ehpad.ll @@ -0,0 +1,62 @@ +; RUN: opt -S -consthoist < %s | FileCheck %s + +; FIXME: The catchpad doesn't even use the constant, so a better fix would be to +; insert the bitcast in the catchpad block. + +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc" + +; CHECK-LABEL: define i32 @main +; CHECK: %tobool = icmp eq i32 %argc, 0 +; CHECK-NEXT: bitcast i64 9209618997431186100 to i64 +; CHECK-NEXT: br i1 %tobool + +; Function Attrs: norecurse +define i32 @main(i32 %argc, i8** nocapture readnone %argv) local_unnamed_addr #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { + %call = tail call i64 @fn(i64 0) + %call1 = tail call i64 @fn(i64 1) + %tobool = icmp eq i32 %argc, 0 + br i1 %tobool, label %2, label %1 + +; <label>:1: ; preds = %0 + %call2 = invoke i64 @fn(i64 %call) + to label %6 unwind label %catch.dispatch + +; <label>:2: ; preds = %0 + %call3 = invoke i64 @fn(i64 %call1) + to label %6 unwind label %catch.dispatch + +catch.dispatch: ; preds = %2, %1 + %z.0 = phi i64 [ %call, %1 ], [ %call1, %2 ] + %3 = catchswitch within none [label %4] unwind to caller + +; <label>:4: ; preds = %catch.dispatch + %5 = catchpad within %3 [i8* null, i32 64, i8* null] + br i1 %tobool, label %then, label %else + +then: + %call4 = tail call i64 @fn(i64 %z.0) [ "funclet"(token %5) ] + %add = add i64 %call4, 9209618997431186100 + br label %endif + +else: + %call5 = tail call i64 @fn(i64 0) [ "funclet"(token %5) ] + %add6 = add i64 %call5, 9209618997431186100 + br label %endif + +endif: + %v = phi i64 [ %add, %then ], [ %add6, %else ] + %call7 = tail call i64 @fn(i64 %v) [ "funclet"(token %5) ] + %call8 = tail call i64 @fn(i64 %call7) [ "funclet"(token %5) ] + catchret from %5 to label %6 + +; <label>:6: ; preds = %1, %2, %4 + ret i32 0 +} + +declare i64 @fn(i64) local_unnamed_addr #1 + +declare i32 @__CxxFrameHandler3(...) + +attributes #0 = { norecurse "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } diff --git a/llvm/test/Transforms/InstCombine/memcpy-addrspace.ll b/llvm/test/Transforms/InstCombine/memcpy-addrspace.ll new file mode 100644 index 0000000000000000000000000000000000000000..17bc1d08f98675cc62504b25a7edda339f72ff3f --- /dev/null +++ b/llvm/test/Transforms/InstCombine/memcpy-addrspace.ll @@ -0,0 +1,85 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s + +@test.data = private unnamed_addr addrspace(2) constant [8 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7], align 4 + +; CHECK-LABEL: test_load +; CHECK: %[[GEP:.*]] = getelementptr [8 x i32], [8 x i32] addrspace(2)* @test.data, i64 0, i64 %x +; CHECK: %{{.*}} = load i32, i32 addrspace(2)* %[[GEP]] +; CHECK-NOT: alloca +; CHECK-NOT: call void @llvm.memcpy.p0i8.p2i8.i64 +; CHECK-NOT: addrspacecast +; CHECK-NOT: load i32, i32* +define void @test_load(i32 addrspace(1)* %out, i64 %x) { +entry: + %data = alloca [8 x i32], align 4 + %0 = bitcast [8 x i32]* %data to i8* + call void @llvm.memcpy.p0i8.p2i8.i64(i8* %0, i8 addrspace(2)* bitcast ([8 x i32] addrspace(2)* @test.data to i8 addrspace(2)*), i64 32, i32 4, i1 false) + %arrayidx = getelementptr inbounds [8 x i32], [8 x i32]* %data, i64 0, i64 %x + %1 = load i32, i32* %arrayidx, align 4 + %arrayidx1 = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %x + store i32 %1, i32 addrspace(1)* %arrayidx1, align 4 + ret void +} + +; CHECK-LABEL: test_load_bitcast_chain +; CHECK: %[[GEP:.*]] = getelementptr [8 x i32], [8 x i32] addrspace(2)* @test.data, i64 0, i64 %x +; CHECK: %{{.*}} = load i32, i32 addrspace(2)* %[[GEP]] +; CHECK-NOT: alloca +; CHECK-NOT: call void @llvm.memcpy.p0i8.p2i8.i64 +; CHECK-NOT: addrspacecast +; CHECK-NOT: load i32, i32* +define void @test_load_bitcast_chain(i32 addrspace(1)* %out, i64 %x) { +entry: + %data = alloca [8 x i32], align 4 + %0 = bitcast [8 x i32]* %data to i8* + call void @llvm.memcpy.p0i8.p2i8.i64(i8* %0, i8 addrspace(2)* bitcast ([8 x i32] addrspace(2)* @test.data to i8 addrspace(2)*), i64 32, i32 4, i1 false) + %1 = bitcast i8* %0 to i32* + %arrayidx = getelementptr inbounds i32, i32* %1, i64 %x + %2 = load i32, i32* %arrayidx, align 4 + %arrayidx1 = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %x + store i32 %2, i32 addrspace(1)* %arrayidx1, align 4 + ret void +} + +; CHECK-LABEL: test_call +; CHECK: alloca +; CHECK: call void @llvm.memcpy.p0i8.p2i8.i64 +; CHECK-NOT: addrspacecast +; CHECK: call i32 @foo(i32* %{{.*}}) +define void @test_call(i32 addrspace(1)* %out, i64 %x) { +entry: + %data = alloca [8 x i32], align 4 + %0 = bitcast [8 x i32]* %data to i8* + call void @llvm.memcpy.p0i8.p2i8.i64(i8* %0, i8 addrspace(2)* bitcast ([8 x i32] addrspace(2)* @test.data to i8 addrspace(2)*), i64 32, i32 4, i1 false) + %arrayidx = getelementptr inbounds [8 x i32], [8 x i32]* %data, i64 0, i64 %x + %1 = call i32 @foo(i32* %arrayidx) + %arrayidx1 = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %x + store i32 %1, i32 addrspace(1)* %arrayidx1, align 4 + ret void +} + +; CHECK-LABEL: test_load_and_call +; CHECK: alloca +; CHECK: call void @llvm.memcpy.p0i8.p2i8.i64 +; CHECK: load i32, i32* %{{.*}} +; CHECK: call i32 @foo(i32* %{{.*}}) +; CHECK-NOT: addrspacecast +; CHECK-NOT: load i32, i32 addrspace(2)* +define void @test_load_and_call(i32 addrspace(1)* %out, i64 %x, i64 %y) { +entry: + %data = alloca [8 x i32], align 4 + %0 = bitcast [8 x i32]* %data to i8* + call void @llvm.memcpy.p0i8.p2i8.i64(i8* %0, i8 addrspace(2)* bitcast ([8 x i32] addrspace(2)* @test.data to i8 addrspace(2)*), i64 32, i32 4, i1 false) + %arrayidx = getelementptr inbounds [8 x i32], [8 x i32]* %data, i64 0, i64 %x + %1 = load i32, i32* %arrayidx, align 4 + %arrayidx1 = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %x + store i32 %1, i32 addrspace(1)* %arrayidx1, align 4 + %2 = call i32 @foo(i32* %arrayidx) + %arrayidx2 = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %y + store i32 %2, i32 addrspace(1)* %arrayidx2, align 4 + ret void +} + + +declare void @llvm.memcpy.p0i8.p2i8.i64(i8* nocapture writeonly, i8 addrspace(2)* nocapture readonly, i64, i32, i1) +declare i32 @foo(i32* %x) diff --git a/llvm/test/tools/llvm-objdump/Mips/disassemble-all.test b/llvm/test/tools/llvm-objdump/Mips/disassemble-all.test new file mode 100644 index 0000000000000000000000000000000000000000..4554a0e030ae6539ff3276438f2a9ed093496356 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/Mips/disassemble-all.test @@ -0,0 +1,16 @@ +# RUN: yaml2obj %s | llvm-objdump -D - + +# Test that -D does not crash llvm-objdump encounters a section who size is a +# not a multiple of the size of an instruction. + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_MIPS +Sections: + - Name: .note.llvm.crash + Type: SHT_NOTE + Address: 0x0 + Content: 002E746578 diff --git a/llvm/test/tools/llvm-objdump/Mips/lit.local.cfg b/llvm/test/tools/llvm-objdump/Mips/lit.local.cfg new file mode 100644 index 0000000000000000000000000000000000000000..a3183a25afaa9d7cda45a83cfc6f7adc91ef2eb7 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/Mips/lit.local.cfg @@ -0,0 +1,3 @@ +if not 'Mips' in config.root.targets: + config.unsupported = True + diff --git a/llvm/tools/clang/include/clang/Format/Format.h b/llvm/tools/clang/include/clang/Format/Format.h index 6c6458b33d85423c18bf7ec1ef369ea00ff9f1f9..3f9a76f66063167e5f8741db76ba057ca1e277c4 100644 --- a/llvm/tools/clang/include/clang/Format/Format.h +++ b/llvm/tools/clang/include/clang/Format/Format.h @@ -606,7 +606,8 @@ struct FormatStyle { enum LanguageStandard { /// Use C++03-compatible syntax. LS_Cpp03, - /// Use features of C++11 (e.g. ``A<A<int>>`` instead of ``A<A<int> >``). + /// Use features of C++11, C++14 and C++1z (e.g. ``A<A<int>>`` instead of + /// ``A<A<int> >``). LS_Cpp11, /// Automatic detection based on the input. LS_Auto diff --git a/llvm/tools/clang/lib/Basic/Targets.cpp b/llvm/tools/clang/lib/Basic/Targets.cpp index 1a95ff26816e78ea690420520c783086414a2597..445b4120ef4d1ea27cd51730bf676391813912eb 100644 --- a/llvm/tools/clang/lib/Basic/Targets.cpp +++ b/llvm/tools/clang/lib/Basic/Targets.cpp @@ -545,6 +545,8 @@ protected: Builder.defineMacro("__ELF__"); if (Opts.POSIXThreads) Builder.defineMacro("_REENTRANT"); + if (this->HasFloat128) + Builder.defineMacro("__FLOAT128__"); } public: OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) @@ -552,11 +554,11 @@ public: this->TLSSupported = false; switch (Triple.getArch()) { - default: case llvm::Triple::x86: case llvm::Triple::x86_64: - case llvm::Triple::arm: - case llvm::Triple::sparc: + this->HasFloat128 = true; + // FALLTHROUGH + default: this->MCountName = "__mcount"; break; case llvm::Triple::mips64: @@ -5144,6 +5146,8 @@ public: default: if (Triple.getOS() == llvm::Triple::NetBSD) setABI("apcs-gnu"); + else if (Triple.getOS() == llvm::Triple::OpenBSD) + setABI("aapcs-linux"); else setABI("aapcs"); break; @@ -5925,7 +5929,8 @@ class AArch64TargetInfo : public TargetInfo { public: AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : TargetInfo(Triple), ABI("aapcs") { - if (getTriple().getOS() == llvm::Triple::NetBSD) { + if (getTriple().getOS() == llvm::Triple::NetBSD || + getTriple().getOS() == llvm::Triple::OpenBSD) { WCharType = SignedInt; // NetBSD apparently prefers consistency across ARM targets to consistency @@ -7535,7 +7540,11 @@ public: void setN64ABITypes() { setN32N64ABITypes(); - Int64Type = SignedLong; + if (getTriple().getOS() == llvm::Triple::OpenBSD) { + Int64Type = SignedLongLong; + } else { + Int64Type = SignedLong; + } IntMaxType = Int64Type; LongWidth = LongAlign = 64; PointerWidth = PointerAlign = 64; @@ -8574,6 +8583,8 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple, return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts); case llvm::Triple::NetBSD: return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts); + case llvm::Triple::OpenBSD: + return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts); default: return new AArch64leTargetInfo(Triple, Opts); } diff --git a/llvm/tools/clang/lib/Basic/Version.cpp b/llvm/tools/clang/lib/Basic/Version.cpp index 97e75a9cd45e35fb70371344235dcd073d7a7c49..c2b7753d41288ac94587f3cb35a1f8c9c3f1c984 100644 --- a/llvm/tools/clang/lib/Basic/Version.cpp +++ b/llvm/tools/clang/lib/Basic/Version.cpp @@ -36,7 +36,7 @@ std::string getClangRepositoryPath() { // If the SVN_REPOSITORY is empty, try to use the SVN keyword. This helps us // pick up a tag in an SVN export, for example. - StringRef SVNRepository("$URL: https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_400/final/lib/Basic/Version.cpp $"); + StringRef SVNRepository("$URL$"); if (URL.empty()) { URL = SVNRepository.slice(SVNRepository.find(':'), SVNRepository.find("/lib/Basic")); diff --git a/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp b/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp index 009244784e5046c5f9d44724bbbc6e3085456af3..b10a549338fddec21bcafe40b9d84ccf8a3d90b8 100644 --- a/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp +++ b/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp @@ -505,12 +505,20 @@ void AggExprEmitter::EmitArrayInit(Address DestPtr, llvm::ArrayType *AType, currentElement->addIncoming(element, entryBB); // Emit the actual filler expression. - LValue elementLV = - CGF.MakeAddrLValue(Address(currentElement, elementAlign), elementType); - if (filler) - EmitInitializationToLValue(filler, elementLV); - else - EmitNullInitializationToLValue(elementLV); + { + // C++1z [class.temporary]p5: + // when a default constructor is called to initialize an element of + // an array with no corresponding initializer [...] the destruction of + // every temporary created in a default argument is sequenced before + // the construction of the next array element, if any + CodeGenFunction::RunCleanupsScope CleanupsScope(CGF); + LValue elementLV = + CGF.MakeAddrLValue(Address(currentElement, elementAlign), elementType); + if (filler) + EmitInitializationToLValue(filler, elementLV); + else + EmitNullInitializationToLValue(elementLV); + } // Move on to the next element. llvm::Value *nextElement = diff --git a/llvm/tools/clang/lib/Driver/Tools.cpp b/llvm/tools/clang/lib/Driver/Tools.cpp index 3c3d453ff7d1e112325e136bc2693622ad710885..4d4a8c242839857b9b4270442d35170f06ee4fd4 100644 --- a/llvm/tools/clang/lib/Driver/Tools.cpp +++ b/llvm/tools/clang/lib/Driver/Tools.cpp @@ -962,6 +962,10 @@ arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) { } break; + case llvm::Triple::OpenBSD: + ABI = FloatABI::Soft; + break; + default: switch (Triple.getEnvironment()) { case llvm::Triple::GNUEABIHF: @@ -1251,6 +1255,8 @@ void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args, default: if (Triple.getOS() == llvm::Triple::NetBSD) ABIName = "apcs-gnu"; + else if (Triple.getOS() == llvm::Triple::OpenBSD) + ABIName = "aapcs-linux"; else ABIName = "aapcs"; break; @@ -3845,9 +3851,10 @@ ParsePICArgs(const ToolChain &ToolChain, const ArgList &Args) { // OpenBSD-specific defaults for PIE if (Triple.getOS() == llvm::Triple::OpenBSD) { switch (ToolChain.getArch()) { + case llvm::Triple::arm: + case llvm::Triple::aarch64: case llvm::Triple::mips64: case llvm::Triple::mips64el: - case llvm::Triple::sparcel: case llvm::Triple::x86: case llvm::Triple::x86_64: IsPICLevelTwo = false; // "-fpie" @@ -3855,6 +3862,7 @@ ParsePICArgs(const ToolChain &ToolChain, const ArgList &Args) { case llvm::Triple::ppc: case llvm::Triple::sparc: + case llvm::Triple::sparcel: case llvm::Triple::sparcv9: IsPICLevelTwo = true; // "-fPIE" break; @@ -8907,12 +8915,12 @@ void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("__start"); } + CmdArgs.push_back("--eh-frame-hdr"); if (Args.hasArg(options::OPT_static)) { CmdArgs.push_back("-Bstatic"); } else { if (Args.hasArg(options::OPT_rdynamic)) CmdArgs.push_back("-export-dynamic"); - CmdArgs.push_back("--eh-frame-hdr"); CmdArgs.push_back("-Bdynamic"); if (Args.hasArg(options::OPT_shared)) { CmdArgs.push_back("-shared"); diff --git a/llvm/tools/clang/lib/Format/Format.cpp b/llvm/tools/clang/lib/Format/Format.cpp index 389761d4824986738e47d8812267bc829a1fd315..12cb555869a044e3c4e309d2ad396dae3b530f5b 100644 --- a/llvm/tools/clang/lib/Format/Format.cpp +++ b/llvm/tools/clang/lib/Format/Format.cpp @@ -1845,6 +1845,7 @@ LangOptions getFormattingLangOpts(const FormatStyle &Style) { LangOpts.CPlusPlus = 1; LangOpts.CPlusPlus11 = Style.Standard == FormatStyle::LS_Cpp03 ? 0 : 1; LangOpts.CPlusPlus14 = Style.Standard == FormatStyle::LS_Cpp03 ? 0 : 1; + LangOpts.CPlusPlus1z = Style.Standard == FormatStyle::LS_Cpp03 ? 0 : 1; LangOpts.LineComment = 1; bool AlternativeOperators = Style.Language == FormatStyle::LK_Cpp; LangOpts.CXXOperatorNames = AlternativeOperators ? 1 : 0; diff --git a/llvm/tools/clang/lib/Sema/SemaExpr.cpp b/llvm/tools/clang/lib/Sema/SemaExpr.cpp index 0077d6c539c35c155777e775457edc69ab7da948..de7739b92ad56c879fef0b6ea0cf1e5f806b86e0 100644 --- a/llvm/tools/clang/lib/Sema/SemaExpr.cpp +++ b/llvm/tools/clang/lib/Sema/SemaExpr.cpp @@ -11659,7 +11659,7 @@ ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc, Context.getLangOpts().OpenCLVersion < 120) { // OpenCL v1.1 6.3.h: The logical operator not (!) does not // operate on scalar float types. - if (!resultType->isIntegerType()) + if (!resultType->isIntegerType() && !resultType->isPointerType()) return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) << resultType << Input.get()->getSourceRange()); } diff --git a/llvm/tools/clang/test/Driver/openbsd.c b/llvm/tools/clang/test/Driver/openbsd.c index 587c31ded0a7764d1214255c63d094e7ba11e03c..b4e2796c5d24933d83d60a499303d23c05aa7c8f 100644 --- a/llvm/tools/clang/test/Driver/openbsd.c +++ b/llvm/tools/clang/test/Driver/openbsd.c @@ -3,6 +3,12 @@ // CHECK-LD: clang{{.*}}" "-cc1" "-triple" "i686-pc-openbsd" // CHECK-LD: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-o" "a.out" "{{.*}}crt0.o" "{{.*}}crtbegin.o" "{{.*}}.o" "-lgcc" "-lc" "-lgcc" "{{.*}}crtend.o" +// Check for --eh-frame-hdr being passed with static linking +// RUN: %clang -no-canonical-prefixes -target i686-pc-openbsd -static %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-STATIC-EH %s +// CHECK-LD-STATIC-EH: clang{{.*}}" "-cc1" "-triple" "i686-pc-openbsd" +// CHECK-LD-STATIC-EH: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bstatic" "-o" "a.out" "{{.*}}rcrt0.o" "{{.*}}crtbegin.o" "{{.*}}.o" "-lgcc" "-lc" "-lgcc" "{{.*}}crtend.o" + // RUN: %clang -no-canonical-prefixes -target i686-pc-openbsd -pg -pthread %s -### 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-PG %s // CHECK-PG: clang{{.*}}" "-cc1" "-triple" "i686-pc-openbsd" @@ -90,3 +96,8 @@ // CHECK-STATIC-PIE: "{{.*}}rcrt0.o" // CHECK-STATIC-PIE-NOT: "-nopie" // CHECK-NOPIE: "-nopie" "{{.*}}crt0.o" + +// Check ARM float ABI +// RUN: %clang -target arm-unknown-openbsd -### -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ARM-FLOAT-ABI %s +// CHECK-ARM-FLOAT-ABI: "-mfloat-abi" "soft" diff --git a/llvm/tools/clang/test/Driver/pic.c b/llvm/tools/clang/test/Driver/pic.c index 9f9d09c54cf0899b085cdbe354895319e41d06eb..61d752094f6e73ae267595e133618485eea363c3 100644 --- a/llvm/tools/clang/test/Driver/pic.c +++ b/llvm/tools/clang/test/Driver/pic.c @@ -227,6 +227,10 @@ // RUN: | FileCheck %s --check-prefix=CHECK-PIE1 // RUN: %clang -c %s -target i386-pc-openbsd -### 2>&1 \ // RUN: | FileCheck %s --check-prefix=CHECK-PIE1 +// RUN: %clang -c %s -target aarch64-unknown-openbsd -### 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-PIE1 +// RUN: %clang -c %s -target arm-unknown-openbsd -### 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-PIE1 // RUN: %clang -c %s -target mips64-unknown-openbsd -### 2>&1 \ // RUN: | FileCheck %s --check-prefix=CHECK-PIE1 // RUN: %clang -c %s -target mips64el-unknown-openbsd -### 2>&1 \ diff --git a/llvm/tools/clang/test/Preprocessor/init.c b/llvm/tools/clang/test/Preprocessor/init.c index 8b8901931e7a47ded3f5de2fbd7779534aa1ff5b..df7a8a8548cbfb0feb8f9e98026a6af4d992e191 100644 --- a/llvm/tools/clang/test/Preprocessor/init.c +++ b/llvm/tools/clang/test/Preprocessor/init.c @@ -831,6 +831,198 @@ // AARCH64-NETBSD:#define __WINT_WIDTH__ 32 // AARCH64-NETBSD:#define __aarch64__ 1 // +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=aarch64-openbsd < /dev/null | FileCheck -match-full-lines -check-prefix AARCH64-OPENBSD %s +// +// AARCH64-OPENBSD:#define _LP64 1 +// AARCH64-OPENBSD-NOT:#define __AARCH64EB__ 1 +// AARCH64-OPENBSD:#define __AARCH64EL__ 1 +// AARCH64-OPENBSD-NOT:#define __AARCH_BIG_ENDIAN 1 +// AARCH64-OPENBSD:#define __ARM_64BIT_STATE 1 +// AARCH64-OPENBSD:#define __ARM_ARCH 8 +// AARCH64-OPENBSD:#define __ARM_ARCH_ISA_A64 1 +// AARCH64-OPENBSD-NOT:#define __ARM_BIG_ENDIAN 1 +// AARCH64-OPENBSD:#define __BIGGEST_ALIGNMENT__ 16 +// AARCH64-OPENBSD:#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ +// AARCH64-OPENBSD:#define __CHAR16_TYPE__ unsigned short +// AARCH64-OPENBSD:#define __CHAR32_TYPE__ unsigned int +// AARCH64-OPENBSD:#define __CHAR_BIT__ 8 +// AARCH64-OPENBSD:#define __DBL_DENORM_MIN__ 4.9406564584124654e-324 +// AARCH64-OPENBSD:#define __DBL_DIG__ 15 +// AARCH64-OPENBSD:#define __DBL_EPSILON__ 2.2204460492503131e-16 +// AARCH64-OPENBSD:#define __DBL_HAS_DENORM__ 1 +// AARCH64-OPENBSD:#define __DBL_HAS_INFINITY__ 1 +// AARCH64-OPENBSD:#define __DBL_HAS_QUIET_NAN__ 1 +// AARCH64-OPENBSD:#define __DBL_MANT_DIG__ 53 +// AARCH64-OPENBSD:#define __DBL_MAX_10_EXP__ 308 +// AARCH64-OPENBSD:#define __DBL_MAX_EXP__ 1024 +// AARCH64-OPENBSD:#define __DBL_MAX__ 1.7976931348623157e+308 +// AARCH64-OPENBSD:#define __DBL_MIN_10_EXP__ (-307) +// AARCH64-OPENBSD:#define __DBL_MIN_EXP__ (-1021) +// AARCH64-OPENBSD:#define __DBL_MIN__ 2.2250738585072014e-308 +// AARCH64-OPENBSD:#define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__ +// AARCH64-OPENBSD:#define __ELF__ 1 +// AARCH64-OPENBSD:#define __FLT_DENORM_MIN__ 1.40129846e-45F +// AARCH64-OPENBSD:#define __FLT_DIG__ 6 +// AARCH64-OPENBSD:#define __FLT_EPSILON__ 1.19209290e-7F +// AARCH64-OPENBSD:#define __FLT_EVAL_METHOD__ 0 +// AARCH64-OPENBSD:#define __FLT_HAS_DENORM__ 1 +// AARCH64-OPENBSD:#define __FLT_HAS_INFINITY__ 1 +// AARCH64-OPENBSD:#define __FLT_HAS_QUIET_NAN__ 1 +// AARCH64-OPENBSD:#define __FLT_MANT_DIG__ 24 +// AARCH64-OPENBSD:#define __FLT_MAX_10_EXP__ 38 +// AARCH64-OPENBSD:#define __FLT_MAX_EXP__ 128 +// AARCH64-OPENBSD:#define __FLT_MAX__ 3.40282347e+38F +// AARCH64-OPENBSD:#define __FLT_MIN_10_EXP__ (-37) +// AARCH64-OPENBSD:#define __FLT_MIN_EXP__ (-125) +// AARCH64-OPENBSD:#define __FLT_MIN__ 1.17549435e-38F +// AARCH64-OPENBSD:#define __FLT_RADIX__ 2 +// AARCH64-OPENBSD:#define __INT16_C_SUFFIX__ +// AARCH64-OPENBSD:#define __INT16_FMTd__ "hd" +// AARCH64-OPENBSD:#define __INT16_FMTi__ "hi" +// AARCH64-OPENBSD:#define __INT16_MAX__ 32767 +// AARCH64-OPENBSD:#define __INT16_TYPE__ short +// AARCH64-OPENBSD:#define __INT32_C_SUFFIX__ +// AARCH64-OPENBSD:#define __INT32_FMTd__ "d" +// AARCH64-OPENBSD:#define __INT32_FMTi__ "i" +// AARCH64-OPENBSD:#define __INT32_MAX__ 2147483647 +// AARCH64-OPENBSD:#define __INT32_TYPE__ int +// AARCH64-OPENBSD:#define __INT64_C_SUFFIX__ LL +// AARCH64-OPENBSD:#define __INT64_FMTd__ "lld" +// AARCH64-OPENBSD:#define __INT64_FMTi__ "lli" +// AARCH64-OPENBSD:#define __INT64_MAX__ 9223372036854775807LL +// AARCH64-OPENBSD:#define __INT64_TYPE__ long long int +// AARCH64-OPENBSD:#define __INT8_C_SUFFIX__ +// AARCH64-OPENBSD:#define __INT8_FMTd__ "hhd" +// AARCH64-OPENBSD:#define __INT8_FMTi__ "hhi" +// AARCH64-OPENBSD:#define __INT8_MAX__ 127 +// AARCH64-OPENBSD:#define __INT8_TYPE__ signed char +// AARCH64-OPENBSD:#define __INTMAX_C_SUFFIX__ LL +// AARCH64-OPENBSD:#define __INTMAX_FMTd__ "lld" +// AARCH64-OPENBSD:#define __INTMAX_FMTi__ "lli" +// AARCH64-OPENBSD:#define __INTMAX_MAX__ 9223372036854775807LL +// AARCH64-OPENBSD:#define __INTMAX_TYPE__ long long int +// AARCH64-OPENBSD:#define __INTMAX_WIDTH__ 64 +// AARCH64-OPENBSD:#define __INTPTR_FMTd__ "ld" +// AARCH64-OPENBSD:#define __INTPTR_FMTi__ "li" +// AARCH64-OPENBSD:#define __INTPTR_MAX__ 9223372036854775807L +// AARCH64-OPENBSD:#define __INTPTR_TYPE__ long int +// AARCH64-OPENBSD:#define __INTPTR_WIDTH__ 64 +// AARCH64-OPENBSD:#define __INT_FAST16_FMTd__ "hd" +// AARCH64-OPENBSD:#define __INT_FAST16_FMTi__ "hi" +// AARCH64-OPENBSD:#define __INT_FAST16_MAX__ 32767 +// AARCH64-OPENBSD:#define __INT_FAST16_TYPE__ short +// AARCH64-OPENBSD:#define __INT_FAST32_FMTd__ "d" +// AARCH64-OPENBSD:#define __INT_FAST32_FMTi__ "i" +// AARCH64-OPENBSD:#define __INT_FAST32_MAX__ 2147483647 +// AARCH64-OPENBSD:#define __INT_FAST32_TYPE__ int +// AARCH64-OPENBSD:#define __INT_FAST64_FMTd__ "ld" +// AARCH64-OPENBSD:#define __INT_FAST64_FMTi__ "li" +// AARCH64-OPENBSD:#define __INT_FAST64_MAX__ 9223372036854775807L +// AARCH64-OPENBSD:#define __INT_FAST64_TYPE__ long int +// AARCH64-OPENBSD:#define __INT_FAST8_FMTd__ "hhd" +// AARCH64-OPENBSD:#define __INT_FAST8_FMTi__ "hhi" +// AARCH64-OPENBSD:#define __INT_FAST8_MAX__ 127 +// AARCH64-OPENBSD:#define __INT_FAST8_TYPE__ signed char +// AARCH64-OPENBSD:#define __INT_LEAST16_FMTd__ "hd" +// AARCH64-OPENBSD:#define __INT_LEAST16_FMTi__ "hi" +// AARCH64-OPENBSD:#define __INT_LEAST16_MAX__ 32767 +// AARCH64-OPENBSD:#define __INT_LEAST16_TYPE__ short +// AARCH64-OPENBSD:#define __INT_LEAST32_FMTd__ "d" +// AARCH64-OPENBSD:#define __INT_LEAST32_FMTi__ "i" +// AARCH64-OPENBSD:#define __INT_LEAST32_MAX__ 2147483647 +// AARCH64-OPENSD:#define __INT_LEAST32_TYPE__ int +// AARCH64-OPENBSD:#define __INT_LEAST64_FMTd__ "ld" +// AARCH64-OPENBSD:#define __INT_LEAST64_FMTi__ "li" +// AARCH64-OPENBSD:#define __INT_LEAST64_MAX__ 9223372036854775807L +// AARCH64-OPENBSD:#define __INT_LEAST64_TYPE__ long int +// AARCH64-OPENBSD:#define __INT_LEAST8_FMTd__ "hhd" +// AARCH64-OPENBSD:#define __INT_LEAST8_FMTi__ "hhi" +// AARCH64-OPENBSD:#define __INT_LEAST8_MAX__ 127 +// AARCH64-OPENBSD:#define __INT_LEAST8_TYPE__ signed char +// AARCH64-OPENBSD:#define __INT_MAX__ 2147483647 +// AARCH64-OPENBSD:#define __LDBL_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966L +// AARCH64-OPENBSD:#define __LDBL_DIG__ 33 +// AARCH64-OPENBSD:#define __LDBL_EPSILON__ 1.92592994438723585305597794258492732e-34L +// AARCH64-OPENBSD:#define __LDBL_HAS_DENORM__ 1 +// AARCH64-OPENBSD:#define __LDBL_HAS_INFINITY__ 1 +// AARCH64-OPENBSD:#define __LDBL_HAS_QUIET_NAN__ 1 +// AARCH64-OPENBSD:#define __LDBL_MANT_DIG__ 113 +// AARCH64-OPENBSD:#define __LDBL_MAX_10_EXP__ 4932 +// AARCH64-OPENBSD:#define __LDBL_MAX_EXP__ 16384 +// AARCH64-OPENBSD:#define __LDBL_MAX__ 1.18973149535723176508575932662800702e+4932L +// AARCH64-OPENBSD:#define __LDBL_MIN_10_EXP__ (-4931) +// AARCH64-OPENBSD:#define __LDBL_MIN_EXP__ (-16381) +// AARCH64-OPENBSD:#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L +// AARCH64-OPENBSD:#define __LITTLE_ENDIAN__ 1 +// AARCH64-OPENBSD:#define __LONG_LONG_MAX__ 9223372036854775807LL +// AARCH64-OPENBSD:#define __LONG_MAX__ 9223372036854775807L +// AARCH64-OPENBSD:#define __LP64__ 1 +// AARCH64-OPENBSD:#define __OpenBSD__ 1 +// AARCH64-OPENBSD:#define __POINTER_WIDTH__ 64 +// AARCH64-OPENBSD:#define __PTRDIFF_TYPE__ long int +// AARCH64-OPENBSD:#define __PTRDIFF_WIDTH__ 64 +// AARCH64-OPENBSD:#define __SCHAR_MAX__ 127 +// AARCH64-OPENBSD:#define __SHRT_MAX__ 32767 +// AARCH64-OPENBSD:#define __SIG_ATOMIC_MAX__ 2147483647 +// AARCH64-OPENBSD:#define __SIG_ATOMIC_WIDTH__ 32 +// AARCH64-OPENBSD:#define __SIZEOF_DOUBLE__ 8 +// AARCH64-OPENBSD:#define __SIZEOF_FLOAT__ 4 +// AARCH64-OPENBSD:#define __SIZEOF_INT__ 4 +// AARCH64-OPENBSD:#define __SIZEOF_LONG_DOUBLE__ 16 +// AARCH64-OPENBSD:#define __SIZEOF_LONG_LONG__ 8 +// AARCH64-OPENBSD:#define __SIZEOF_LONG__ 8 +// AARCH64-OPENBSD:#define __SIZEOF_POINTER__ 8 +// AARCH64-OPENBSD:#define __SIZEOF_PTRDIFF_T__ 8 +// AARCH64-OPENBSD:#define __SIZEOF_SHORT__ 2 +// AARCH64-OPENBSD:#define __SIZEOF_SIZE_T__ 8 +// AARCH64-OPENBSD:#define __SIZEOF_WCHAR_T__ 4 +// AARCH64-OPENBSD:#define __SIZEOF_WINT_T__ 4 +// AARCH64-OPENBSD:#define __SIZE_MAX__ 18446744073709551615UL +// AARCH64-OPENBSD:#define __SIZE_TYPE__ long unsigned int +// AARCH64-OPENBSD:#define __SIZE_WIDTH__ 64 +// AARCH64-OPENBSD:#define __UINT16_C_SUFFIX__ +// AARCH64-OPENBSD:#define __UINT16_MAX__ 65535 +// AARCH64-OPENBSD:#define __UINT16_TYPE__ unsigned short +// AARCH64-OPENBSD:#define __UINT32_C_SUFFIX__ U +// AARCH64-OPENBSD:#define __UINT32_MAX__ 4294967295U +// AARCH64-OPENBSD:#define __UINT32_TYPE__ unsigned int +// AARCH64-OPENBSD:#define __UINT64_C_SUFFIX__ ULL +// AARCH64-OPENBSD:#define __UINT64_MAX__ 18446744073709551615ULL +// AARCH64-OPENBSD:#define __UINT64_TYPE__ long long unsigned int +// AARCH64-OPENBSD:#define __UINT8_C_SUFFIX__ +// AARCH64-OPENBSD:#define __UINT8_MAX__ 255 +// AARCH64-OPENBSD:#define __UINT8_TYPE__ unsigned char +// AARCH64-OPENBSD:#define __UINTMAX_C_SUFFIX__ ULL +// AARCH64-OPENBSD:#define __UINTMAX_MAX__ 18446744073709551615ULL +// AARCH64-OPENBSD:#define __UINTMAX_TYPE__ long long unsigned int +// AARCH64-OPENBSD:#define __UINTMAX_WIDTH__ 64 +// AARCH64-OPENBSD:#define __UINTPTR_MAX__ 18446744073709551615UL +// AARCH64-OPENBSD:#define __UINTPTR_TYPE__ long unsigned int +// AARCH64-OPENBSD:#define __UINTPTR_WIDTH__ 64 +// AARCH64-OPENBSD:#define __UINT_FAST16_MAX__ 65535 +// AARCH64-OPENBSD:#define __UINT_FAST16_TYPE__ unsigned short +// AARCH64-OPENBSD:#define __UINT_FAST32_MAX__ 4294967295U +// AARCH64-OPENBSD:#define __UINT_FAST32_TYPE__ unsigned int +// AARCH64-OPENBSD:#define __UINT_FAST64_MAX__ 18446744073709551615UL +// AARCH64-OPENBSD:#define __UINT_FAST64_TYPE__ long unsigned int +// AARCH64-OPENBSD:#define __UINT_FAST8_MAX__ 255 +// AARCH64-OPENBSD:#define __UINT_FAST8_TYPE__ unsigned char +// AARCH64-OPENBSD:#define __UINT_LEAST16_MAX__ 65535 +// AARCH64-OPENBSD:#define __UINT_LEAST16_TYPE__ unsigned short +// AARCH64-OPENBSD:#define __UINT_LEAST32_MAX__ 4294967295U +// AARCH64-OPENBSD:#define __UINT_LEAST32_TYPE__ unsigned int +// AARCH64-OPENBSD:#define __UINT_LEAST64_MAX__ 18446744073709551615UL +// AARCH64-OPENBSD:#define __UINT_LEAST64_TYPE__ long unsigned int +// AARCH64-OPENBSD:#define __UINT_LEAST8_MAX__ 255 +// AARCH64-OPENBSD:#define __UINT_LEAST8_TYPE__ unsigned char +// AARCH64-OPENBSD:#define __USER_LABEL_PREFIX__ +// AARCH64-OPENBSD:#define __WCHAR_MAX__ 2147483647 +// AARCH64-OPENBSD:#define __WCHAR_TYPE__ int +// AARCH64-OPENBSD:#define __WCHAR_WIDTH__ 32 +// AARCH64-OPENBSD:#define __WINT_TYPE__ int +// AARCH64-OPENBSD:#define __WINT_WIDTH__ 32 +// AARCH64-OPENBSD:#define __aarch64__ 1 +// // RUN: %clang_cc1 -E -dM -ffreestanding -triple=aarch64-freebsd11 < /dev/null | FileCheck -match-full-lines -check-prefix AARCH64-FREEBSD %s // // AARCH64-FREEBSD:#define _LP64 1 @@ -8523,8 +8715,11 @@ // LANAI: #define __lanai__ 1 // // RUN: %clang_cc1 -E -dM -ffreestanding -triple=amd64-unknown-openbsd6.1 < /dev/null | FileCheck -match-full-lines -check-prefix OPENBSD %s +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=aarch64-unknown-openbsd6.1 < /dev/null | FileCheck -match-full-lines -check-prefix OPENBSD %s // RUN: %clang_cc1 -E -dM -ffreestanding -triple=arm-unknown-openbsd6.1-gnueabi < /dev/null | FileCheck -match-full-lines -check-prefix OPENBSD %s // RUN: %clang_cc1 -E -dM -ffreestanding -triple=i386-unknown-openbsd6.1 < /dev/null | FileCheck -match-full-lines -check-prefix OPENBSD %s +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=mips64-unknown-openbsd6.1 < /dev/null | FileCheck -match-full-lines -check-prefix OPENBSD %s +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=mips64el-unknown-openbsd6.1 < /dev/null | FileCheck -match-full-lines -check-prefix OPENBSD %s // RUN: %clang_cc1 -E -dM -ffreestanding -triple=sparc64-unknown-openbsd6.1 < /dev/null | FileCheck -match-full-lines -check-prefix OPENBSD %s // OPENBSD:#define __ELF__ 1 // OPENBSD:#define __INT16_TYPE__ short diff --git a/llvm/tools/clang/test/SemaOpenCL/invalid-logical-ops-1.1.cl b/llvm/tools/clang/test/SemaOpenCL/invalid-logical-ops-1.1.cl deleted file mode 100644 index 2269dd322b36da8f8621350a07bbae15053d8be9..0000000000000000000000000000000000000000 --- a/llvm/tools/clang/test/SemaOpenCL/invalid-logical-ops-1.1.cl +++ /dev/null @@ -1,57 +0,0 @@ -// RUN: %clang_cc1 %s -verify -cl-std=CL1.1 -triple x86_64-unknown-linux-gnu - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable -typedef __attribute__((ext_vector_type(4))) float float4; -typedef __attribute__((ext_vector_type(4))) double double4; -typedef __attribute__((ext_vector_type(4))) int int4; -typedef __attribute__((ext_vector_type(4))) long long4; - -kernel void float_ops() { - int flaf = 0.0f && 0.0f; // expected-error {{invalid operands}} - int flof = 0.0f || 0.0f; // expected-error {{invalid operands}} - float fbaf = 0.0f & 0.0f; // expected-error {{invalid operands}} - float fbof = 0.0f | 0.0f; // expected-error {{invalid operands}} - float fbxf = 0.0f ^ 0.0f; // expected-error {{invalid operands}} - int flai = 0.0f && 0; // expected-error {{invalid operands}} - int floi = 0.0f || 0; // expected-error {{invalid operands}} - float ibaf = 0 & 0.0f; // expected-error {{invalid operands}} - float ibof = 0 | 0.0f; // expected-error {{invalid operands}} - float bnf = ~0.0f; // expected-error {{invalid argument type}} - float lnf = !0.0f; // expected-error {{invalid argument type}} -} - -kernel void vec_float_ops() { - float4 f4 = (float4)(0, 0, 0, 0); - int4 f4laf = f4 && 0.0f; // expected-error {{invalid operands}} - int4 f4lof = f4 || 0.0f; // expected-error {{invalid operands}} - float4 f4baf = f4 & 0.0f; // expected-error {{invalid operands}} - float4 f4bof = f4 | 0.0f; // expected-error {{invalid operands}} - float4 f4bxf = f4 ^ 0.0f; // expected-error {{invalid operands}} - float bnf4 = ~f4; // expected-error {{invalid argument type}} - int4 lnf4 = !f4; // expected-error {{invalid argument type}} -} - -kernel void double_ops() { - int flaf = 0.0 && 0.0; // expected-error {{invalid operands}} - int flof = 0.0 || 0.0; // expected-error {{invalid operands}} - double fbaf = 0.0 & 0.0; // expected-error {{invalid operands}} - double fbof = 0.0 | 0.0; // expected-error {{invalid operands}} - double fbxf = 0.0 ^ 0.0; // expected-error {{invalid operands}} - int flai = 0.0 && 0; // expected-error {{invalid operands}} - int floi = 0.0 || 0; // expected-error {{invalid operands}} - double ibaf = 0 & 0.0; // expected-error {{invalid operands}} - double ibof = 0 | 0.0; // expected-error {{invalid operands}} - double bnf = ~0.0; // expected-error {{invalid argument type}} - double lnf = !0.0; // expected-error {{invalid argument type}} -} - -kernel void vec_double_ops() { - double4 f4 = (double4)(0, 0, 0, 0); - long4 f4laf = f4 && 0.0; // expected-error {{invalid operands}} - long4 f4lof = f4 || 0.0; // expected-error {{invalid operands}} - double4 f4baf = f4 & 0.0; // expected-error {{invalid operands}} - double4 f4bof = f4 | 0.0; // expected-error {{invalid operands}} - double4 f4bxf = f4 ^ 0.0; // expected-error {{invalid operands}} - double bnf4 = ~f4; // expected-error {{invalid argument type}} - long4 lnf4 = !f4; // expected-error {{invalid argument type}} -} diff --git a/llvm/tools/clang/test/SemaOpenCL/invalid-logical-ops-1.2.cl b/llvm/tools/clang/test/SemaOpenCL/invalid-logical-ops-1.2.cl deleted file mode 100644 index bee52396cc6c423c271b1c1acefe0cdaa69756f2..0000000000000000000000000000000000000000 --- a/llvm/tools/clang/test/SemaOpenCL/invalid-logical-ops-1.2.cl +++ /dev/null @@ -1,58 +0,0 @@ -// RUN: %clang_cc1 %s -verify -cl-std=CL1.2 -triple x86_64-unknown-linux-gnu - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -typedef __attribute__((ext_vector_type(4))) float float4; -typedef __attribute__((ext_vector_type(4))) double double4; -typedef __attribute__((ext_vector_type(4))) int int4; -typedef __attribute__((ext_vector_type(4))) long long4; - -kernel void float_ops() { - int flaf = 0.0f && 0.0f; - int flof = 0.0f || 0.0f; - float fbaf = 0.0f & 0.0f; // expected-error {{invalid operands}} - float fbof = 0.0f | 0.0f; // expected-error {{invalid operands}} - float fbxf = 0.0f ^ 0.0f; // expected-error {{invalid operands}} - int flai = 0.0f && 0; - int floi = 0.0f || 0; - float ibaf = 0 & 0.0f; // expected-error {{invalid operands}} - float ibof = 0 | 0.0f; // expected-error {{invalid operands}} - float bnf = ~0.0f;// expected-error {{invalid argument type}} - float lnf = !0.0f; -} - -kernel void vec_float_ops() { - float4 f4 = (float4)(0, 0, 0, 0); - int4 f4laf = f4 && 0.0f; - int4 f4lof = f4 || 0.0f; - float4 f4baf = f4 & 0.0f; // expected-error {{invalid operands}} - float4 f4bof = f4 | 0.0f; // expected-error {{invalid operands}} - float4 f4bxf = f4 ^ 0.0f; // expected-error {{invalid operands}} - float bnf4 = ~f4; // expected-error {{invalid argument type}} - int4 lnf4 = !f4; -} - -kernel void double_ops() { - int flaf = 0.0 && 0.0; - int flof = 0.0 || 0.0; - double fbaf = 0.0 & 0.0; // expected-error {{invalid operands}} - double fbof = 0.0 | 0.0; // expected-error {{invalid operands}} - double fbxf = 0.0 ^ 0.0; // expected-error {{invalid operands}} - int flai = 0.0 && 0; - int floi = 0.0 || 0; - double ibaf = 0 & 0.0; // expected-error {{invalid operands}} - double ibof = 0 | 0.0; // expected-error {{invalid operands}} - double bnf = ~0.0; // expected-error {{invalid argument type}} - double lnf = !0.0; -} - -kernel void vec_double_ops() { - double4 f4 = (double4)(0, 0, 0, 0); - long4 f4laf = f4 && 0.0; - long4 f4lof = f4 || 0.0; - double4 f4baf = f4 & 0.0; // expected-error {{invalid operands}} - double4 f4bof = f4 | 0.0; // expected-error {{invalid operands}} - double4 f4bxf = f4 ^ 0.0; // expected-error {{invalid operands}} - double bnf4 = ~f4; // expected-error {{invalid argument type}} - long4 lnf4 = !f4; -} diff --git a/llvm/tools/clang/unittests/Format/FormatTest.cpp b/llvm/tools/clang/unittests/Format/FormatTest.cpp index b402b5c4a54c264bfa251de0743762b01aac56ce..fb14a6b7c15b4ba6a9d7b8ddd5b66677eccf0389 100644 --- a/llvm/tools/clang/unittests/Format/FormatTest.cpp +++ b/llvm/tools/clang/unittests/Format/FormatTest.cpp @@ -11053,6 +11053,20 @@ TEST_F(FormatTest, AllignTrailingComments) { "/* comment 3 */ \\\n", getLLVMStyleWithColumns(40))); } + +TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { + format::FormatStyle Style = format::getLLVMStyle(); + Style.Standard = FormatStyle::LS_Cpp03; + // cpp03 recognize this string as identifier u8 and literal character 'a' + EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); +} + +TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { + // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers + // all modes, including C++11, C++14 and C++17 + EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); +} + } // end namespace } // end namespace format } // end namespace clang diff --git a/llvm/tools/clang/www/cxx_dr_status.html b/llvm/tools/clang/www/cxx_dr_status.html index f8f558033ebadcb8b4433c27f34b4b4044594e60..a0781458a852296500bd7b0a1d1ca9b61a571fa2 100644 --- a/llvm/tools/clang/www/cxx_dr_status.html +++ b/llvm/tools/clang/www/cxx_dr_status.html @@ -28,7 +28,7 @@ <!--*************************************************************************--> <h1>C++ Defect Report Support in Clang</h1> <!--*************************************************************************--> -<p>Last updated: $Date: 2017-01-13 08:52:17 -0800 (Fri, 13 Jan 2017) $</p> +<p>Last updated: $Date$</p> <h2 id="cxxdr">C++ defect report implementation status</h2> diff --git a/llvm/tools/clang/www/cxx_status.html b/llvm/tools/clang/www/cxx_status.html index 181fc33db4fb3b3843742b25aded89d9149e11f9..eb0beeb18552c66343ee21efefba895343243378 100644 --- a/llvm/tools/clang/www/cxx_status.html +++ b/llvm/tools/clang/www/cxx_status.html @@ -25,7 +25,7 @@ <!--*************************************************************************--> <h1>C++ Support in Clang</h1> <!--*************************************************************************--> -<p>Last updated: $Date: 2017-01-13 08:52:17 -0800 (Fri, 13 Jan 2017) $</p> +<p>Last updated: $Date$</p> <p>Clang fully implements all published ISO C++ standards (<a href="#cxx98">C++98 / C++03</a>, <a diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp index a76d3249674fffc2eff3586a1a3f6d3a0bf80a7c..96e851debdb6603d05fe4e0efc8e884feb4db4dc 100644 --- a/llvm/tools/llc/llc.cpp +++ b/llvm/tools/llc/llc.cpp @@ -233,6 +233,10 @@ static void DiagnosticHandler(const DiagnosticInfo &DI, void *Context) { if (DI.getSeverity() == DS_Error) *HasError = true; + if (auto *Remark = dyn_cast<DiagnosticInfoOptimizationBase>(&DI)) + if (!Remark->isEnabled()) + return; + DiagnosticPrinterRawOStream DP(errs()); errs() << LLVMContext::getDiagnosticMessagePrefix(DI.getSeverity()) << ": "; DI.print(DP); diff --git a/llvm/unittests/ADT/TripleTest.cpp b/llvm/unittests/ADT/TripleTest.cpp index c80477f6ddc98d399cd68b6728783bdcd87aaa27..31d5b93ae3925d4c672c6e4da64ca1fa241b6dac 100644 --- a/llvm/unittests/ADT/TripleTest.cpp +++ b/llvm/unittests/ADT/TripleTest.cpp @@ -947,6 +947,10 @@ TEST(TripleTest, getARMCPUForArch) { llvm::Triple Triple("arm--nacl"); EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch()); } + { + llvm::Triple Triple("arm--openbsd"); + EXPECT_EQ("cortex-a8", Triple.getARMCPUForArch()); + } { llvm::Triple Triple("armv6-unknown-freebsd"); EXPECT_EQ("arm1176jzf-s", Triple.getARMCPUForArch()); diff --git a/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt b/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt index 68f6d0c28d7caab11fc85870de031dc2a6c6b13d..80c344e040a935e71dea834cbbe34cb0807fc2e8 100644 --- a/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt +++ b/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt @@ -21,4 +21,4 @@ add_llvm_unittest(OrcJITTests RPCUtilsTest.cpp ) -target_link_libraries(OrcJITTests ${PTHREAD_LIB}) +target_link_libraries(OrcJITTests ${LLVM_PTHREAD_LIB}) diff --git a/llvm/unittests/Support/CMakeLists.txt b/llvm/unittests/Support/CMakeLists.txt index 6068de5514c7fa1cb8e61fc32137600a45620eba..20ca129608ef61af583e1f2d29642effb05d1c1b 100644 --- a/llvm/unittests/Support/CMakeLists.txt +++ b/llvm/unittests/Support/CMakeLists.txt @@ -63,4 +63,4 @@ add_llvm_unittest(SupportTests ) # ManagedStatic.cpp uses <pthread>. -target_link_libraries(SupportTests ${PTHREAD_LIB}) +target_link_libraries(SupportTests ${LLVM_PTHREAD_LIB}) diff --git a/llvm/utils/release/merge-request.sh b/llvm/utils/release/merge-request.sh new file mode 100755 index 0000000000000000000000000000000000000000..3345d2ad85c53caefef7bf9fff6b11bfdcecbe66 --- /dev/null +++ b/llvm/utils/release/merge-request.sh @@ -0,0 +1,198 @@ +# !/bin/bash +#===-- merge-request.sh ---------------------------------------------------===# +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. +# +#===------------------------------------------------------------------------===# +# +# Submit a merge request to bugzilla. +# +#===------------------------------------------------------------------------===# + +dryrun="" +stable_version="" +revision="" +BUGZILLA_BIN="" +BUGZILLA_CMD="" +release_metabug="" +bugzilla_product="new-bugs" +bugzilla_component="new bugs" +bugzilla_assigned_to="" +bugzilla_user="" +bugzilla_version="" +bugzilla_url="http://bugs.llvm.org/xmlrpc.cgi" + +function usage() { + echo "usage: `basename $0` -user EMAIL -stable-version X.Y -r NUM" + echo "" + echo " -user EMAIL Your email address for logging into bugzilla." + echo " -stable-version X.Y The stable release version (e.g. 4.0, 5.0)." + echo " -r NUM Revision number to merge (e.g. 1234567)." + echo " -bugzilla-bin PATH Path to bugzilla binary (optional)." + echo " -assign-to EMAIL Assign bug to user with EMAIL (optional)." + echo " -dry-run Print commands instead of executing them." +} + +while [ $# -gt 0 ]; do + case $1 in + -user) + shift + bugzilla_user="$1" + ;; + -stable-version) + shift + stable_version="$1" + ;; + -r) + shift + revision="$1" + ;; + -project) + shift + project="$1" + ;; + -component) + shift + bugzilla_component="$1" + ;; + -bugzilla-bin) + shift + BUGZILLA_BIN="$1" + ;; + -assign-to) + shift + bugzilla_assigned_to="--assigned_to=$1" + ;; + -dry-run) + dryrun="echo" + ;; + -help | --help | -h | --h | -\? ) + usage + exit 0 + ;; + * ) + echo "unknown option: $1" + usage + exit 1 + ;; + esac + shift +done + +if [ -z "$stable_version" ]; then + echo "error: no stable version specified" + exit 1 +fi + +case $stable_version in + 4.0) + release_metabug="32061" + ;; + *) + echo "error: invalid stable version" + exit 1 +esac +bugzilla_version=$stable_version + +if [ -z "$revision" ]; then + echo "error: revision not specified" + exit 1 +fi + +if [ -z "$bugzilla_user" ]; then + echo "error: bugzilla username not specified." + exit 1 +fi + +if [ -z "$BUGZILLA_BIN" ]; then + BUGZILLA_BIN=`which bugzilla` + if [ $? -ne 0 ]; then + echo "error: could not find bugzilla executable." + echo "Make sure the bugzilla cli tool is installed on your system: " + echo "pip install python-bugzilla (recommended)" + echo "" + echo "Fedora: dnf install python-bugzilla" + echo "Ubuntu/Debian: apt-get install bugzilla-cli" + exit 1 + fi +fi + +BUGZILLA_MAJOR_VERSION=`$BUGZILLA_BIN --version 2>&1 | cut -d . -f 1` + +if [ $BUGZILLA_MAJOR_VERSION -eq 1 ]; then + + echo "***************************** Warning *******************************" + echo "You are using an older version of the bugzilla cli tool. You will be " + echo "able to create bugs, but this script will crash with the following " + echo "error when trying to read back information about the bug you created:" + echo "" + echo "KeyError: 'internals'" + echo "" + echo "To avoid this error, use version 2.0.0 or higher" + echo "https://pypi.python.org/pypi/python-bugzilla" + echo "*********************************************************************" +fi + +BUGZILLA_CMD="$BUGZILLA_BIN --bugzilla=$bugzilla_url" + +bug_url="https://reviews.llvm.org/rL$revision" + +echo "Checking for duplicate bugs..." + +check_duplicates=`$BUGZILLA_CMD query --url $bug_url` + +if [ -n "$check_duplicates" ]; then + echo "Duplicate bug found:" + echo $check_duplicates + exit 1 +fi + +echo "Done" + +# Get short commit summary +commit_summary='' +commit_msg=`svn log -r $revision https://llvm.org/svn/llvm-project/` +if [ $? -ne 0 ]; then + echo "warning: failed to get commit message." + commit_msg="" +fi + +if [ -n "$commit_msg" ]; then + commit_summary=`echo "$commit_msg" | sed '4q;d' | cut -c1-80` + commit_summary=" : ${commit_summary}" +fi + +bug_summary="Merge r$revision into the $stable_version branch${commit_summary}" + +if [ -z "$dryrun" ]; then + set -x +fi + +${dryrun} $BUGZILLA_CMD --login --user=$bugzilla_user new \ + -p "$bugzilla_product" \ + -c "$bugzilla_component" -u $bug_url --blocked=$release_metabug \ + -o All --priority=P --arch All -v $bugzilla_version \ + --summary "${bug_summary}" \ + -l "Is this patch OK to merge to the $stable_version branch?" \ + $bugzilla_assigned_to \ + --oneline + +set +x + +if [ -n "$dryrun" ]; then + exit 0 +fi + +if [ $BUGZILLA_MAJOR_VERSION -eq 1 ]; then + success=`$BUGZILLA_CMD query --url $bug_url` + if [ -z "$success" ]; then + echo "Failed to create bug." + exit 1 + fi + + echo " Created new bug:" + echo $success +fi diff --git a/llvm/utils/unittest/CMakeLists.txt b/llvm/utils/unittest/CMakeLists.txt index a50733af9aae19064ec1d0794ba61d025cb1a630..b42ac834e3a77d5f661e92d655bb71ab4256de08 100644 --- a/llvm/utils/unittest/CMakeLists.txt +++ b/llvm/utils/unittest/CMakeLists.txt @@ -40,8 +40,8 @@ if (NOT LLVM_ENABLE_THREADS) add_definitions( -DGTEST_HAS_PTHREAD=0 ) endif() -find_library(PTHREAD_LIBRARY_PATH pthread) -if (PTHREAD_LIBRARY_PATH) +find_library(LLVM_PTHREAD_LIBRARY_PATH pthread) +if (LLVM_PTHREAD_LIBRARY_PATH) list(APPEND LIBS pthread) endif() diff --git a/llvm/utils/vim/syntax/llvm.vim b/llvm/utils/vim/syntax/llvm.vim index 5a2757c1159ef798cdd1db2c67cdda3b97baeaf9..3a2b8285350cbdd5727bbc466476a714d22c0af7 100644 --- a/llvm/utils/vim/syntax/llvm.vim +++ b/llvm/utils/vim/syntax/llvm.vim @@ -1,7 +1,7 @@ " Vim syntax file " Language: llvm " Maintainer: The LLVM team, http://llvm.org/ -" Version: $Revision: 285927 $ +" Version: $Revision$ if version < 600 syntax clear diff --git a/llvm/utils/vim/syntax/tablegen.vim b/llvm/utils/vim/syntax/tablegen.vim index 21f4848933537d5dcf0828d1e5dd4ba78352ea83..a9b0e4e3a4e7beab71da4ee47fdd7ea3e16a336c 100644 --- a/llvm/utils/vim/syntax/tablegen.vim +++ b/llvm/utils/vim/syntax/tablegen.vim @@ -1,7 +1,7 @@ " Vim syntax file " Language: TableGen " Maintainer: The LLVM team, http://llvm.org/ -" Version: $Revision: 235369 $ +" Version: $Revision$ if version < 600 syntax clear diff --git a/llvm/utils/vim/vimrc b/llvm/utils/vim/vimrc index c35eb0ecbbeb409f9b61e1e58a0c4b034df39d63..fd87d767d6f414adde0356b4dd77611af894b7ce 100644 --- a/llvm/utils/vim/vimrc +++ b/llvm/utils/vim/vimrc @@ -1,5 +1,5 @@ " LLVM coding guidelines conformance for VIM -" $Revision: 176235 $ +" $Revision$ " " Maintainer: The LLVM Team, http://llvm.org " WARNING: Read before you source in all these commands and macros! Some