Skip to content

Commit

Permalink
Merge pull request #168 from Drill4J/feature/support-arm-64-EPMDJ-10882
Browse files Browse the repository at this point in the history
Feature/support arm 64 epmdj 10882
  • Loading branch information
iryabov authored Oct 23, 2024
2 parents f57faa5 + 6eb37b9 commit 60cb3bf
Show file tree
Hide file tree
Showing 17 changed files with 85 additions and 63 deletions.
27 changes: 6 additions & 21 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,7 @@ on:
push:
branches:
- 'main'
- 'release/*'
- 'adoption/*'
paths:
- '**/src/**'
- '**.gradle.kts'
- 'gradle.properties'
pull_request:
branches:
- 'main'
- 'release/*'
- 'adoption/*'
- 'feature/*'
paths:
- '**/src/**'
- '**.gradle.kts'
- 'gradle.properties'

jobs:
check:
strategy:
Expand All @@ -30,21 +14,22 @@ jobs:
- {os: ubuntu-latest, preset: linuxX64}
- {os: windows-latest, preset: mingwX64}
- {os: macos-12, preset: macosX64}
- {os: macos-14, preset: macosArm64}
runs-on: ${{ matrix.config.os }}
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
- uses: actions/setup-java@v4
with:
java-version: 8.0
java-version: 8
distribution: zulu
- uses: gradle/wrapper-validation-action@v1
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64'
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64' || matrix.config.preset == 'macosArm64'
run: chmod +x ${{ github.workspace }}/gradlew
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64'
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64' || matrix.config.preset == 'macosArm64'
run: chmod +x ${{ github.workspace }}/setup-shared-libs.sh
- if: matrix.config.preset == 'linuxX64'
run: sudo apt-get install -y libtinfo5
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64'
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64' || matrix.config.preset == 'macosArm64'
run: ${{ github.workspace }}/setup-shared-libs.sh
- if: matrix.config.preset == 'mingwX64'
run: ${{ github.workspace }}/setup-shared-libs.bat
Expand Down
14 changes: 8 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ jobs:
- {os: ubuntu-latest, preset: linuxX64}
- {os: windows-latest, preset: mingwX64}
- {os: macos-12, preset: macosX64}
- {os: macos-14, preset: macosArm64}
runs-on: ${{ matrix.config.os }}
steps:
- uses: actions/checkout@v3
Expand All @@ -23,13 +24,13 @@ jobs:
java-version: 8.0
distribution: zulu
- uses: gradle/wrapper-validation-action@v1
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64'
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64' || matrix.config.preset == 'macosArm64'
run: chmod +x ${{ github.workspace }}/gradlew
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64'
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64' || matrix.config.preset == 'macosArm64'
run: chmod +x ${{ github.workspace }}/setup-shared-libs.sh
- if: matrix.config.preset == 'linuxX64'
run: sudo apt-get install -y libtinfo5
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64'
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64' || matrix.config.preset == 'macosArm64'
run: ${{ github.workspace }}/setup-shared-libs.sh
- if: matrix.config.preset == 'mingwX64'
run: ${{ github.workspace }}/setup-shared-libs.bat
Expand Down Expand Up @@ -78,6 +79,7 @@ jobs:
- {os: ubuntu-latest, preset: linuxX64}
- {os: windows-latest, preset: mingwX64}
- {os: macos-12, preset: macosX64}
- {os: macos-14, preset: macosArm64}
runs-on: ${{ matrix.config.os }}
outputs:
tag: ${{ needs.release.outputs.tag }}
Expand All @@ -90,13 +92,13 @@ jobs:
java-version: 8.0
distribution: zulu
- uses: gradle/wrapper-validation-action@v1
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64'
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64' || matrix.config.preset == 'macosArm64'
run: chmod +x ${{ github.workspace }}/gradlew
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64'
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64' || matrix.config.preset == 'macosArm64'
run: chmod +x ${{ github.workspace }}/setup-shared-libs.sh
- if: matrix.config.preset == 'linuxX64'
run: sudo apt-get install -y libtinfo5
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64'
- if: matrix.config.preset == 'linuxX64' || matrix.config.preset == 'macosX64' || matrix.config.preset == 'macosArm64'
run: ${{ github.workspace }}/setup-shared-libs.sh
- if: matrix.config.preset == 'mingwX64'
run: ${{ github.workspace }}/setup-shared-libs.bat
Expand Down
13 changes: 6 additions & 7 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
kotlinVersion = 1.5.31
kotlinVersion = 1.9.20
licenseVersion = 0.16.1
publishVersion = 1.1.0
kotlinxCollectionsVersion = 0.3.4
kotlinxCollectionsVersion = 0.3.5
kotlinxCoroutinesVersion = 1.5.2-native-mt
kotlinxSerializationVersion = 1.3.1
atomicfuVersion = 0.16.3
atomicfuVersion = 0.23.0
grgitVersion = 4.1.1
ktorVersion = 1.6.3
ktorVersion = 1.6.8
bcelVersion = 6.6.0
kotlinPoetVersion = 1.9.0
javassistVersion = 3.28.0-GA
Expand All @@ -15,7 +15,7 @@ jacocoVersion = 0.8.12
transmittableThreadLocalVersion = 2.12.2
shadowPluginVersion = 6.1.0
logbackVersion = 1.2.12
microutilsLoggingVersion = 2.0.11
microutilsLoggingVersion = 2.1.23
apacheHttpClientVersion = 5.2.3
aesyDatasizeVersion = 1.0.0
bytebuddyVersion = 1.14.11
Expand All @@ -33,9 +33,8 @@ org.gradle.workers.max = 4

kotlin.code.style = official
kotlin.native.enableParallelExecutionCheck = false
kotlin.native.enableDependencyPropagation = false
kotlin.native.ignoreDisabledTargets = true
kotlin.native.cacheKind = none
kotlin.mpp.stability.nowarn = true
kotlin.mpp.enableGranularSourceSetsMetadata = true
kotlin.mpp.enableCInteropCommonization = true
kotlin.mpp.applyDefaultHierarchyTemplate=false
37 changes: 19 additions & 18 deletions java-agent/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import org.jetbrains.kotlin.konan.target.presetName
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import com.hierynomus.gradle.license.tasks.LicenseCheck
import com.hierynomus.gradle.license.tasks.LicenseFormat
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

@Suppress("RemoveRedundantBackticks")
plugins {
Expand Down Expand Up @@ -45,19 +46,24 @@ kotlin {
compilations["test"].cinterops.create("test_stubs")
binaries.sharedLib(nativeAgentLibName, setOf(DEBUG))
}
targets {
jvm()
linuxX64(configure = configureNativeTarget)
mingwX64(configure = configureNativeTarget).apply {
jvm()
linuxX64(configure = configureNativeTarget)
mingwX64(configure = configureNativeTarget).apply {
binaries.all {
linkerOpts("-lpsapi", "-lwsock32", "-lws2_32", "-lmswsock")
}
}
macosX64(configure = configureNativeTarget).apply {
if (macosLd64.toBoolean()) {
binaries.all {
linkerOpts("-lpsapi", "-lwsock32", "-lws2_32", "-lmswsock")
linkerOpts("-ld64")
}
}
macosX64(configure = configureNativeTarget).apply {
if(macosLd64.toBoolean()){
binaries.all {
linkerOpts("-ld64")
}
}
macosArm64(configure = configureNativeTarget).apply {
if (macosLd64.toBoolean()) {
binaries.all {
linkerOpts("-ld64")
}
}
}
Expand Down Expand Up @@ -127,12 +133,7 @@ kotlin {
val linuxX64Main by getting(configuration = configureNativeDependencies)
val mingwX64Main by getting(configuration = configureNativeDependencies)
val macosX64Main by getting(configuration = configureNativeDependencies)
mingwX64Main.dependencies {
implementation(project(":logging-native"))
}
macosX64Main.dependencies {
implementation(project(":logging-native"))
}
val macosArm64Main by getting(configuration = configureNativeDependencies)
}
tasks {
val filterOutCurrentPlatform: (KotlinNativeTarget) -> Boolean = {
Expand All @@ -145,7 +146,7 @@ kotlin {
from("src/native${it.compilationName.capitalize()}/kotlin")
into("src/${it.target.targetName}${it.compilationName.capitalize()}/kotlin/gen")
}
it.compileKotlinTask.dependsOn(copyNativeClasses.get())
it.compileTaskProvider.get().dependsOn(copyNativeClasses.get())
}
val cleanNativeClassesTask: (KotlinCompilation<*>) -> Unit = {
val taskName = "cleanNativeClasses${it.target.targetName.capitalize()}${it.compilationName.capitalize()}"
Expand Down Expand Up @@ -194,7 +195,7 @@ kotlin {
exclude("/ch/qos/logback/classic/servlet/*")
}
}
runtimeJar.get().dependsOn(jvmMainCompilation.compileKotlinTask)
runtimeJar.get().dependsOn(jvmMainCompilation.compileTaskProvider.get())
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ import com.epam.drill.agent.request.HeadersRetriever
import com.epam.drill.agent.request.DrillRequestHolder
import com.epam.drill.agent.transport.JvmModuleMessageSender
import com.epam.drill.jvmapi.gen.*
import kotlinx.cinterop.ExperimentalForeignApi
import kotlin.experimental.ExperimentalNativeApi

object Agent {

Expand All @@ -52,6 +54,7 @@ object Agent {

private val logger = KotlinLogging.logger("com.epam.drill.agent.Agent")

@OptIn(ExperimentalNativeApi::class, ExperimentalForeignApi::class)
fun agentOnLoad(options: String): Int {
println(logo)
AgentLoggingConfiguration.defaultNativeLoggingConfiguration()
Expand All @@ -72,6 +75,7 @@ object Agent {
logger.info { "agentOnUnload: Java Agent has been unloaded." }
}

@OptIn(ExperimentalForeignApi::class)
fun agentOnVmInit() {
initRuntimeIfNeeded()
SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, null)
Expand All @@ -91,13 +95,15 @@ object Agent {
logger.debug { "agentOnVmDeath" }
}

@OptIn(ExperimentalForeignApi::class)
private fun addCapabilities() = memScoped {
val jvmtiCapabilities = alloc<jvmtiCapabilities>()
jvmtiCapabilities.can_retransform_classes = 1.toUInt()
jvmtiCapabilities.can_maintain_original_method_order = 1.toUInt()
AddCapabilities(jvmtiCapabilities.ptr)
}

@OptIn(ExperimentalForeignApi::class)
private fun setEventCallbacks() = memScoped {
val alloc = alloc<jvmtiEventCallbacks>()
alloc.VMInit = staticCFunction(::vmInitEvent)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import com.epam.drill.jvmapi.callObjectVoidMethod
import com.epam.drill.jvmapi.callObjectVoidMethodWithInt
import com.epam.drill.jvmapi.callObjectVoidMethodWithString
import com.epam.drill.logging.LoggingConfiguration
import kotlinx.cinterop.ExperimentalForeignApi

object AgentLoggingConfiguration {

Expand All @@ -46,6 +47,7 @@ object AgentLoggingConfiguration {
callObjectVoidMethod(LoggingConfiguration::class, LoggingConfiguration::readDefaultConfiguration)
}

@OptIn(ExperimentalForeignApi::class)
fun updateJvmLoggingConfiguration() {
val logLevel = Configuration.parameters[ParameterDefinitions.LOG_LEVEL]
val logFile = Configuration.parameters[ParameterDefinitions.LOG_FILE].takeIf(String::isNotEmpty)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
package com.epam.drill.agent.configuration

import kotlin.native.concurrent.AtomicReference
import kotlin.concurrent.AtomicReference
import kotlin.native.concurrent.freeze
import mu.KotlinLogging
import com.epam.drill.agent.configuration.provider.AgentOptionsProvider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ import io.ktor.utils.io.bits.*
import kotlinx.cinterop.*
import mu.KotlinLogging
import org.objectweb.asm.ClassReader
import kotlin.native.concurrent.AtomicInt
import kotlin.concurrent.AtomicInt
import kotlinx.cinterop.ExperimentalForeignApi

object ClassFileLoadHook {

Expand Down Expand Up @@ -81,6 +82,7 @@ object ClassFileLoadHook {

private val totalTransformClass = AtomicInt(0)

@OptIn(ExperimentalForeignApi::class)
operator fun invoke(
loader: jobject?,
clsName: CPointer<ByteVar>?,
Expand Down Expand Up @@ -198,6 +200,7 @@ object ClassFileLoadHook {
}
}

@OptIn(ExperimentalForeignApi::class)
private fun convertToNativePointers(
instrumentedBytes: ByteArray,
newData: CPointer<CPointerVar<UByteVar>>?,
Expand All @@ -212,9 +215,11 @@ object ClassFileLoadHook {
newClassDataLen!!.pointed.value = instrumentedSize
}

@OptIn(ExperimentalForeignApi::class)
private fun isBootstrapClassLoading(loader: jobject?, protectionDomain: jobject?) =
loader == null || protectionDomain == null

@OptIn(ExperimentalForeignApi::class)
private fun isTTLCandidate(
kClassName: String,
superName: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,17 @@ import com.epam.drill.jvmapi.gen.jintVar
import com.epam.drill.jvmapi.gen.jobject
import com.epam.drill.jvmapi.gen.jthread
import com.epam.drill.jvmapi.gen.jvmtiEnvVar
import kotlinx.cinterop.ExperimentalForeignApi

@OptIn(ExperimentalForeignApi::class)
@Suppress("unused_parameter")
fun vmInitEvent(env: CPointer<jvmtiEnvVar>?, jniEnv: CPointer<JNIEnvVar>?, thread: jthread?) = Agent.agentOnVmInit()

@OptIn(ExperimentalForeignApi::class)
@Suppress("unused_parameter")
fun vmDeathEvent(jvmtiEnv: CPointer<jvmtiEnvVar>?, jniEnv: CPointer<JNIEnvVar>?) = Agent.agentOnVmDeath()

@OptIn(ExperimentalForeignApi::class)
@Suppress("unused_parameter")
fun classFileLoadHook(
jvmtiEnv: CPointer<jvmtiEnvVar>?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,12 @@ import com.epam.drill.jvmapi.gen.jvmtiEnvVar
import com.epam.drill.jvmapi.gen.jvmtiError
import com.epam.drill.jvmapi.jvmti
import com.epam.drill.jvmapi.vmGlobal
import kotlinx.cinterop.ExperimentalForeignApi
import kotlin.experimental.ExperimentalNativeApi

@Suppress("unused_parameter")
@CName("Agent_OnLoad")
@OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class)
fun agentOnLoad(vmPointer: CPointer<JavaVMVar>, options: String, reservedPtr: Long): Int = memScoped {
vmGlobal.value = vmPointer.freeze()
val vm = vmPointer.pointed
Expand All @@ -50,16 +53,21 @@ fun agentOnLoad(vmPointer: CPointer<JavaVMVar>, options: String, reservedPtr: Lo

@Suppress("unused_parameter")
@CName("Agent_OnUnload")
@OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class)
fun agentOnUnload(vmPointer: CPointer<JavaVMVar>) = Agent.agentOnUnload()

@CName("checkEx")
@OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class)
fun checkEx(errCode: jvmtiError, funName: String) = checkEx(errCode, funName)

@OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class)
@CName("currentEnvs")
fun currentEnvs() = env

@OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class)
@CName("jvmtii")
fun jvmtii() = jvmti.value

@OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class)
@CName("getJvm")
fun getJvm() = vmGlobal.value
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ import com.epam.drill.jvmapi.gen.CallVoidMethod
import com.epam.drill.jvmapi.gen.GetMethodID
import com.epam.drill.jvmapi.gen.jclass
import com.epam.drill.jvmapi.gen.jobject
import kotlinx.cinterop.ExperimentalForeignApi

@OptIn(ExperimentalForeignApi::class)
open class GenericAgentModule(
moduleId: String,
moduleClass: jclass,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ import com.epam.drill.jvmapi.gen.jclass
import com.epam.drill.jvmapi.gen.jobject
import com.epam.drill.jvmapi.toByteArray
import com.epam.drill.jvmapi.toJByteArray
import kotlinx.cinterop.ExperimentalForeignApi

@OptIn(ExperimentalForeignApi::class)
class InstrumentationAgentModule(
moduleId: String,
moduleClass: jclass,
Expand Down
Loading

0 comments on commit 60cb3bf

Please sign in to comment.