[PATCH] D72463: [Driver][X86] Add -malign-branch* and -malign-branch-within-32B-boundaries
    Kan Shengchen via Phabricator via cfe-commits 
    cfe-commits at lists.llvm.org
       
    Fri Jan 10 00:24:38 PST 2020
    
    
  
skan added a comment.
In D72227 <https://reviews.llvm.org/D72227> you wrote
> I think options should follow these principles:
> 
> 1. Different options are position independent. -mA -mB should be the same as -mB -mA.
> 2. -mA and -mno-A are position dependent and the last one wins. Sometimes, the set may include more than 2 options, e.g. the last of -fno-pic -fpie and -fpic wins.
> 3. More specific options can override semantics of less specific options. In our case, -malign-branch* are more specific than -malign-branch-within-32B-boundaries.
This implemetation is consistent with the principles.  However, as I mentioned in D72227 <https://reviews.llvm.org/D72227>, I hold a slightly different opinion about the principles.
> 1. Different options are position independent. -mA -mB should be the same as -mB -mA.
I think only when A and B are not related,  (-mA -mB) == (-mB -mA).
> 2. -mA and -mno-A are position dependent and the last one wins. Sometimes, the set may include more than 2 options, e.g. the last of -fno-pic -fpie and -fpic wins
Totally agree.
> 3. More specific options can override semantics of less specific options. In our case, -malign-branch* are more specific than -malign-branch-within-32B-boundaries.
I think general options can aslo override specific options. The last one wins. e.g.
The net effect of `-malign-branch=fused -malign-branch-within-32B-boundaries` should be `-malign-branch-boundary=32 -malign-branch=fused+jcc+jmp -malign-branch-prefix-size=5`
================
Comment at: clang/lib/Driver/ToolChains/Clang.cpp:2034
+            << T << "fused, jcc, jmp, call, ret, indirect";
+        AlignBranch = StringRef();
+      }
----------------
`AlignBranch = StringRef()` seems unnecessary.
================
Comment at: clang/lib/Driver/ToolChains/Clang.cpp:2040
+    if (Value.getAsInteger(10, AlignBranchBoundary) ||
+        AlignBranchBoundary < 16 || !llvm::isPowerOf2_64(AlignBranchBoundary)) {
+      D.Diag(diag::err_drv_invalid_argument_to_option)
----------------
Any reason for  precluding 16?
================
Comment at: clang/lib/Driver/ToolChains/Clang.cpp:2053
+          << Value << A->getOption().getName();
+      AlignBranch = StringRef();
+    }
----------------
AlignBranch = StringRef() seems unnecessary.
Repository:
  rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D72463/new/
https://reviews.llvm.org/D72463
    
    
More information about the cfe-commits
mailing list