From 40b7a9f16ac30c8e0ee70a14e518ebe7e25aa1da Mon Sep 17 00:00:00 2001 From: Peizhao Ou Date: Wed, 8 Nov 2017 14:49:40 -0800 Subject: [PATCH] Modifies AtomicExpandPass to transform relaxed loads/RMW/AtomicXchg to acquire --- .clang-format | 90 +++++++++++++++++++++++++++++++- lib/CodeGen/AtomicExpandPass.cpp | 34 +++++++++++- make-tags.sh | 53 +++++++++++++++++++ 3 files changed, 175 insertions(+), 2 deletions(-) create mode 100755 make-tags.sh diff --git a/.clang-format b/.clang-format index 5bead5f39dd..f5e68f48ccd 100644 --- a/.clang-format +++ b/.clang-format @@ -1,2 +1,90 @@ -BasedOnStyle: LLVM +--- +Language: Cpp +# BasedOnStyle: LLVM +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlinesLeft: false +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|isl|json)/)' + Priority: 3 + - Regex: '.*' + Priority: 1 +IndentCaseLabels: true +IndentWidth: 2 +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Left +ReflowComments: true +SortIncludes: true +SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 8 +UseTab: Never +... diff --git a/lib/CodeGen/AtomicExpandPass.cpp b/lib/CodeGen/AtomicExpandPass.cpp index d12fdb24698..b2134a7859a 100644 --- a/lib/CodeGen/AtomicExpandPass.cpp +++ b/lib/CodeGen/AtomicExpandPass.cpp @@ -86,8 +86,40 @@ bool AtomicExpand::runOnFunction(Function &F) { // Changing control-flow while iterating through it is a bad idea, so gather a // list of all atomic instructions before we start. for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) { - if (I->isAtomic()) + // XXX-update: For relaxed loads, change them to acquire. This includes + // relaxed loads, relaxed atomic RMW & relaxed atomic compare exchange. + if (I->isAtomic()) { + switch (I->getOpcode()) { + case Instruction::AtomicCmpXchg: { + auto* CmpXchg = dyn_cast(&*I); + auto SuccOrdering = CmpXchg->getSuccessOrdering(); + if (SuccOrdering == Monotonic) { + CmpXchg->setSuccessOrdering(Acquire); + } else if (SuccOrdering == Release) { + CmpXchg->setSuccessOrdering(AcquireRelease); + } + break; + } + case Instruction::AtomicRMW: { + auto* RMW = dyn_cast(&*I); + if (RMW->getOrdering() == Monotonic) { + RMW->setOrdering(Acquire); + } + break; + } + case Instruction::Load: { + auto* LI = dyn_cast(&*I); + if (LI->getOrdering() == Monotonic) { + LI->setOrdering(Acquire); + } + break; + } + default: { + break; + } + } AtomicInsts.push_back(&*I); + } } bool MadeChange = false; diff --git a/make-tags.sh b/make-tags.sh new file mode 100755 index 00000000000..ade6680ca17 --- /dev/null +++ b/make-tags.sh @@ -0,0 +1,53 @@ +#!/bin/bash -e + +SrcDirs=( + lib/Analysis/ + lib/AsmParser/ + lib/Bitcode/ + lib/CodeGen/ + lib/DebugInfo + lib/ExecutionEngine + lib/Fuzzer + lib/IR + lib/IRReader + lib/LibDriver + lib/LineEditor + lib/Linker + lib/LTO + lib/MC + lib/Object + lib/Option + lib/Passes + lib/Support + lib/TableGen + lib/Target/*.cpp + lib/Transforms + include/llvm + lib/Target/AArch64 + #lib/Target/X86 +) + +AllGenDirs=( + build/lib/Target/AArch64 + #build/lib/Target/X86 +) + +SrcFiles=src_directory.txt +echo "" > $SrcFiles +for dir in ${SrcDirs[@]}; do + find $dir -type f -print >> $SrcFiles +done +# llvm-tblgen generated code +for GenDirs in ${AllGenDirs[@]}; do + for dir in $GenDirs; do + for incFile in $(ls ${GenDirs}/*.inc); do + echo $incFile >> $SrcFiles + done + done +done + +# Make Gtags +gtags -f $SrcFiles + +# Make Ctags +ctags -R ${SrcDirs[@]} -- 2.34.1