Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Replace single asan config entry with sanitizer selector #3830

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,11 @@ object LinktimeInfo {
@resolvedAtLinktime("scala.scalanative.meta.linktimeinfo.is32BitPlatform")
def is32BitPlatform: Boolean = resolved

@resolvedAtLinktime("scala.scalanative.meta.linktimeinfo.asanEnabled")
def asanEnabled: Boolean = resolved
@resolvedAtLinktime("scala.scalanative.meta.linktimeinfo.enabledSanitizer")
def enabledSanitizer: String = resolved

@resolvedAtLinktime()
def asanEnabled: Boolean = enabledSanitizer == "address"

@resolvedAtLinktime(
"scala.scalanative.meta.linktimeinfo.isWeakReferenceSupported"
Expand Down
13 changes: 7 additions & 6 deletions tools/src/main/scala/scala/scalanative/build/LLVM.scala
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ private[scalanative] object LLVM {
else Nil

val flags: Seq[String] =
buildTargetCompileOpts ++ flto ++ asan ++ target ++
buildTargetCompileOpts ++ flto ++ sanitizer ++ target ++
stdflag ++ platformFlags ++ debugFlags ++ exceptionsHandling ++
configFlags ++ Seq("-fvisibility=hidden", opt) ++
Seq("-fomit-frame-pointer") ++
Expand Down Expand Up @@ -234,7 +234,7 @@ private[scalanative] object LLVM {

val output = Seq("-o", config.buildPath.abs)

buildTargetLinkOpts ++ flto ++ debugFlags ++ platformFlags ++ linkNameFlags ++ output ++ asan ++ target
buildTargetLinkOpts ++ flto ++ debugFlags ++ platformFlags ++ linkNameFlags ++ output ++ sanitizer ++ target
}
val paths = objectsPaths.map(_.abs)
// it's a fix for passing too many file paths to the clang compiler,
Expand Down Expand Up @@ -350,10 +350,11 @@ private[scalanative] object LLVM {
case lto => Seq(s"-flto=${lto.name}")
}

private def asan(implicit config: Config): Seq[String] =
config.compilerConfig.asan match {
case true => Seq("-fsanitize=address", "-fno-omit-frame-pointer")
case false => Seq.empty
private def sanitizer(implicit config: Config): Seq[String] =
config.compilerConfig.sanitizer match {
case Some(sanitizer) =>
Seq(s"-fsanitize=${sanitizer.name}", "-fno-omit-frame-pointer")
case _ => Seq.empty
}

private def target(implicit config: Config): Seq[String] =
Expand Down
21 changes: 12 additions & 9 deletions tools/src/main/scala/scala/scalanative/build/NativeConfig.scala
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ sealed trait NativeConfig {
/** Shall linker dump intermediate NIR after every phase? */
def dump: Boolean

/** Should address sanitizer be used? */
def asan: Boolean
/** Should sanitizer implemention be used? */
def sanitizer: Option[Sanitizer]

/** Should stubs be linked? */
def linkStubs: Boolean
Expand Down Expand Up @@ -196,8 +196,11 @@ sealed trait NativeConfig {
/** Create a new config with given dump value. */
def withDump(value: Boolean): NativeConfig

/** Create a new config with given asan value. */
def withASAN(value: Boolean): NativeConfig
/** Create a new config with given sanitizer enabled. */
def withSanitizer(value: Sanitizer): NativeConfig = withSanitizer(Some(value))

/** Create a new config with given sanitizer enabled. */
def withSanitizer(value: Option[Sanitizer]): NativeConfig

/** Create a new config with given behavior for stubs. */
def withLinkStubs(value: Boolean): NativeConfig
Expand Down Expand Up @@ -285,7 +288,7 @@ object NativeConfig {
checkFatalWarnings = false,
checkFeatures = true,
dump = false,
asan = false,
sanitizer = None,
linkStubs = false,
optimize = true,
useIncrementalCompilation = true,
Expand Down Expand Up @@ -315,7 +318,7 @@ object NativeConfig {
checkFatalWarnings: Boolean,
checkFeatures: Boolean,
dump: Boolean,
asan: Boolean,
sanitizer: Option[Sanitizer],
linkStubs: Boolean,
optimize: Boolean,
useIncrementalCompilation: Boolean,
Expand Down Expand Up @@ -383,8 +386,8 @@ object NativeConfig {
def withDump(value: Boolean): NativeConfig =
copy(dump = value)

def withASAN(value: Boolean): NativeConfig =
copy(asan = value)
def withSanitizer(value: Option[Sanitizer]): NativeConfig =
copy(sanitizer = value)

def withOptimize(value: Boolean): NativeConfig =
copy(optimize = value)
Expand Down Expand Up @@ -479,7 +482,7 @@ object NativeConfig {
| - checkFatalWarnings: $checkFatalWarnings
| - checkFeatures $checkFeatures
| - dump: $dump
| - asan: $asan
| - sanitizer: ${sanitizer.map(_.name).getOrElse("none")}
| - linkStubs: $linkStubs
| - optimize $optimize
| - incrementalCompilation: $useIncrementalCompilation
Expand Down
9 changes: 9 additions & 0 deletions tools/src/main/scala/scala/scalanative/build/Sanitizer.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package scala.scalanative.build

/* Implementation of code santizier */
sealed abstract class Sanitizer(val name: String)
object Sanitizer {
case object AddressSanitizer extends Sanitizer("address")
case object ThreadSanitizer extends Sanitizer("thread")
case object UndefinedBehaviourSanitizer extends Sanitizer("undefined")
}
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ object CodeGen {
) extends AbstractCodeGen(env, Nil) {
import meta.config
val buildInfos: Map[String, Any] = Map(
"ASAN support" -> config.asan,
"Sanitizer" -> config.sanitizer.map(_.name).getOrElse("disabled"),
"Debug metadata" -> config.sourceLevelDebuggingConfig.enabled,
"Embed resources" -> config.embedResources,
"GC" -> config.gc,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ private[linker] trait LinktimeValueResolver { self: Reach =>
conf.gc == GC.Commix
},
s"$linktimeInfo.is32BitPlatform" -> conf.is32BitPlatform,
s"$linktimeInfo.asanEnabled" -> conf.asan,
s"$linktimeInfo.enabledSanitizer" -> conf.sanitizer
.map(_.name)
.getOrElse(""),
s"$linktimeInfo.isMsys" -> Platform.isMsys,
s"$linktimeInfo.isCygwin" -> Platform.isCygwin,
s"$linktimeInfo.target.arch" -> triple.arch,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class LinktimeConditionsSpec extends OptimizerSpec {
val ignoredPropertiesNames = {
val linktimeInfo = "scala.scalanative.meta.linktimeinfo"
Set(
s"$linktimeInfo.asanEnabled",
s"$linktimeInfo.enabledSanitizer",
s"$linktimeInfo.is32BitPlatform",
s"$linktimeInfo.isMultithreadingEnabled",
s"$linktimeInfo.isWeakReferenceSupported",
Expand Down